From 533a7c2423953f53d1a86b4d0f39b2369b5b8473 Mon Sep 17 00:00:00 2001 From: Chris Berg Date: Fri, 23 Aug 2024 09:45:37 -0700 Subject: [PATCH 01/63] fix: Properly adding RESULTS_DIR as env var --- loadtests/orbc_load_test_plan_dops.jmx | 5 +++++ loadtests/orbc_load_test_plan_frontend.jmx | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/loadtests/orbc_load_test_plan_dops.jmx b/loadtests/orbc_load_test_plan_dops.jmx index bd394dfcf..34a345dc3 100644 --- a/loadtests/orbc_load_test_plan_dops.jmx +++ b/loadtests/orbc_load_test_plan_dops.jmx @@ -95,6 +95,11 @@ onroutebc-test-dops.apps.silver.devops.gov.bc.ca = + + RESULTS_DIR + ~/results + = + BEARER_TOKEN diff --git a/loadtests/orbc_load_test_plan_frontend.jmx b/loadtests/orbc_load_test_plan_frontend.jmx index 1e93abd1d..60e02195a 100644 --- a/loadtests/orbc_load_test_plan_frontend.jmx +++ b/loadtests/orbc_load_test_plan_frontend.jmx @@ -100,6 +100,11 @@ = + + RESULTS_DIR + ~/results + = + KEYCLOAK_LOGIN_URL test.loginproxy.gov.bc.ca From 3aa7dc6db3d515c7ce2181d5b7f48807590bc5cb Mon Sep 17 00:00:00 2001 From: Chris Berg Date: Fri, 23 Aug 2024 09:55:56 -0700 Subject: [PATCH 02/63] fix: Properly adding RESULTS_DIR as env var --- .github/workflows/loadtest.yml | 10 ++++++++-- loadtests/orbc_load_test_plan_dops.jmx | 7 ++++++- loadtests/orbc_load_test_plan_frontend.jmx | 9 +++++++-- loadtests/orbc_load_test_plan_vehicles.jmx | 10 +++++----- 4 files changed, 26 insertions(+), 10 deletions(-) diff --git a/.github/workflows/loadtest.yml b/.github/workflows/loadtest.yml index e94078bf2..4abbcc05c 100644 --- a/.github/workflows/loadtest.yml +++ b/.github/workflows/loadtest.yml @@ -5,6 +5,11 @@ on: workflow_dispatch: inputs: ### Required + num_threads: + description: 'Number of concurrent threads (USERS) for each test in sequence' + default: 200 + required: true + type: integer dops_api_url: description: 'The url endpoint for the dops' default: onroutebc-test-dops.apps.silver.devops.gov.bc.ca @@ -43,10 +48,11 @@ jobs: --loglevel INFO --jmeterlogconf=log.conf -JBEARER_TOKEN=${{inputs.bearer_token}} - -JDOPS_API_URL=${{inputs.dops_api_url}} + -JNUM_THREADS=${{inputs.num_threads}} -JFRONTEND_API_URL=${{inputs.frontend_api_url}} + -JDOPS_API_URL=${{inputs.dops_api_url}} -JVEHICLES_API_URL=${{inputs.vehicles_api_url}} - -JRESULTS_DIR=loadtest/results + -JRESULTS_DIR=loadtests/results - uses: actions/upload-artifact@v4.3.6 with: diff --git a/loadtests/orbc_load_test_plan_dops.jmx b/loadtests/orbc_load_test_plan_dops.jmx index 34a345dc3..81b7336d6 100644 --- a/loadtests/orbc_load_test_plan_dops.jmx +++ b/loadtests/orbc_load_test_plan_dops.jmx @@ -80,6 +80,11 @@ + + NUM_THREADS + 200 + = + FRONTEND_API_URL onroutebc-test-frontend.apps.silver.devops.gov.bc.ca @@ -114,7 +119,7 @@ false 1 - 1000 + ${NUM_THREADS} ${__P(rampup,300)} 1365261073000 1365261073000 diff --git a/loadtests/orbc_load_test_plan_frontend.jmx b/loadtests/orbc_load_test_plan_frontend.jmx index 60e02195a..887c25696 100644 --- a/loadtests/orbc_load_test_plan_frontend.jmx +++ b/loadtests/orbc_load_test_plan_frontend.jmx @@ -80,6 +80,11 @@ + + NUM_THREADS + 200 + = + FRONTEND_API_URL onroutebc-test-frontend.apps.silver.devops.gov.bc.ca/ @@ -124,7 +129,7 @@ false 1 - 100 + ${NUM_THREADS} ${__P(rampup,300)} 1365261073000 1365261073000 @@ -1501,7 +1506,7 @@ false 1 - 100 + ${NUM_THREADS} ${__P(rampup,300)} 1365261073000 1365261073000 diff --git a/loadtests/orbc_load_test_plan_vehicles.jmx b/loadtests/orbc_load_test_plan_vehicles.jmx index 26c3c512b..e45978d90 100644 --- a/loadtests/orbc_load_test_plan_vehicles.jmx +++ b/loadtests/orbc_load_test_plan_vehicles.jmx @@ -80,8 +80,8 @@ - - USERS + + NUM_THREADS 200 = @@ -609,7 +609,7 @@ false 1 - ${USERS} + ${NUM_THREADS} ${__P(rampup,300)} 1365261073000 1365261073000 @@ -736,7 +736,7 @@ false 1 - ${USERS} + ${NUM_THREADS} ${__P(rampup,300)} 1365261073000 1365261073000 @@ -948,7 +948,7 @@ false 1 - ${USERS} + ${NUM_THREADS} ${__P(rampup,300)} 1365261073000 1365261073000 From ff664a18a02b2687859a9aed65f27b1cfed52f49 Mon Sep 17 00:00:00 2001 From: Chris Berg Date: Fri, 23 Aug 2024 14:23:08 -0700 Subject: [PATCH 03/63] fix: Properly adding RESULTS_DIR as env var --- .github/workflows/loadtest.yml | 3 +++ loadtests/orbc_load_test_plan_dops.jmx | 2 +- loadtests/orbc_load_test_plan_frontend.jmx | 2 +- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/.github/workflows/loadtest.yml b/.github/workflows/loadtest.yml index 4abbcc05c..2da075087 100644 --- a/.github/workflows/loadtest.yml +++ b/.github/workflows/loadtest.yml @@ -54,6 +54,9 @@ jobs: -JVEHICLES_API_URL=${{inputs.vehicles_api_url}} -JRESULTS_DIR=loadtests/results + - run: | + ls -al */ + - uses: actions/upload-artifact@v4.3.6 with: name: jmeter-test-results diff --git a/loadtests/orbc_load_test_plan_dops.jmx b/loadtests/orbc_load_test_plan_dops.jmx index 81b7336d6..bb210a0f5 100644 --- a/loadtests/orbc_load_test_plan_dops.jmx +++ b/loadtests/orbc_load_test_plan_dops.jmx @@ -107,7 +107,7 @@ BEARER_TOKEN - + eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJXNk5hakRyZ2VUR2tYR0dtb28tRWJFSkJXQTM4OGEyYjdRN0p4eThSRjdzIn0.eyJleHAiOjE3MjQ0MzM1NjksImlhdCI6MTcyNDQzMzI2OSwiYXV0aF90aW1lIjoxNzI0NDMyMTk5LCJqdGkiOiJiZWM0NDk3Yy05OTdmLTQ4NTktYjhjZS0wYmU3ZjQzMWRlY2UiLCJpc3MiOiJodHRwczovL3Rlc3QubG9naW5wcm94eS5nb3YuYmMuY2EvYXV0aC9yZWFsbXMvc3RhbmRhcmQiLCJhdWQiOiJvbi1yb3V0ZS1iYy1kaXJlY3QtNDU5OCIsInN1YiI6IjMzMjRiNDFjNGI5OTQzZTg5MjdmYzMzODE2OThiZjYwQGlkaXIiLCJ0eXAiOiJCZWFyZXIiLCJhenAiOiJvbi1yb3V0ZS1iYy1kaXJlY3QtNDU5OCIsInNlc3Npb25fc3RhdGUiOiJjMDcyYWIwMi0wMzBiLTQ2ZTYtYjUyZC0zZjdmYzEwZjZmOTAiLCJzY29wZSI6Im9wZW5pZCBwcm9maWxlIGVtYWlsIGJjZWlkYm90aCBpZGlyIiwic2lkIjoiYzA3MmFiMDItMDMwYi00NmU2LWI1MmQtM2Y3ZmMxMGY2ZjkwIiwiaWRpcl91c2VyX2d1aWQiOiIzMzI0QjQxQzRCOTk0M0U4OTI3RkMzMzgxNjk4QkY2MCIsImlkZW50aXR5X3Byb3ZpZGVyIjoiaWRpciIsImlkaXJfdXNlcm5hbWUiOiJDQkVSRyIsImVtYWlsX3ZlcmlmaWVkIjpmYWxzZSwibmFtZSI6IkJlcmcsIENocmlzIE1PVEk6RVgiLCJwcmVmZXJyZWRfdXNlcm5hbWUiOiIzMzI0YjQxYzRiOTk0M2U4OTI3ZmMzMzgxNjk4YmY2MEBpZGlyIiwiZ2l2ZW5fbmFtZSI6IkNocmlzIiwiZGlzcGxheV9uYW1lIjoiQmVyZywgQ2hyaXMgTU9USTpFWCIsImZhbWlseV9uYW1lIjoiQmVyZyIsImVtYWlsIjoiY2hyaXMuYmVyZ0Bnb3YuYmMuY2EifQ.UiKoybZpovAtayyoG9cZYWt_evzg6akIQjzTqGj0zMZwTEFo8kYBTqBfIXN7XqQfvW9eleBw0bpUcc2kY3GWPbPxTyp5c0I4WS7iMUDlhD2zF8Z7HA9juV7WCCqpgojVzwRgfYlDXE0RGEX8wGkxwaNC5r1NJOmbADTm6QIrzuVLt9gLiSrr1XkEDizzZTiZolx6vJuXj5AMxg4AGibhQ9quiC_kKMyhV6H8_hryTqXD9R3tCYlUnAarffva_Pswkbn0rTN9BNCf15_KzyW1jP09jzLlg7gHPzKMFP27Ph1fauXM4p2HNfC8ILam_fbfmY1HJ5s1wjAELdA9NrAYBA = diff --git a/loadtests/orbc_load_test_plan_frontend.jmx b/loadtests/orbc_load_test_plan_frontend.jmx index 887c25696..fcf19a251 100644 --- a/loadtests/orbc_load_test_plan_frontend.jmx +++ b/loadtests/orbc_load_test_plan_frontend.jmx @@ -102,7 +102,7 @@ BEARER_TOKEN - + eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJXNk5hakRyZ2VUR2tYR0dtb28tRWJFSkJXQTM4OGEyYjdRN0p4eThSRjdzIn0.eyJleHAiOjE3MjQ0MzQ2ODksImlhdCI6MTcyNDQzNDM4OSwiYXV0aF90aW1lIjoxNzI0NDM0Mzg5LCJqdGkiOiIwY2RkZjg2MS0zMWYxLTQxMTYtYmUxOC00YjdiYjY1NjljZDEiLCJpc3MiOiJodHRwczovL3Rlc3QubG9naW5wcm94eS5nb3YuYmMuY2EvYXV0aC9yZWFsbXMvc3RhbmRhcmQiLCJhdWQiOiJvbi1yb3V0ZS1iYy1kaXJlY3QtNDU5OCIsInN1YiI6IjMzMjRiNDFjNGI5OTQzZTg5MjdmYzMzODE2OThiZjYwQGlkaXIiLCJ0eXAiOiJCZWFyZXIiLCJhenAiOiJvbi1yb3V0ZS1iYy1kaXJlY3QtNDU5OCIsInNlc3Npb25fc3RhdGUiOiJjMDcyYWIwMi0wMzBiLTQ2ZTYtYjUyZC0zZjdmYzEwZjZmOTAiLCJzY29wZSI6Im9wZW5pZCBwcm9maWxlIGVtYWlsIGJjZWlkYm90aCBpZGlyIiwic2lkIjoiYzA3MmFiMDItMDMwYi00NmU2LWI1MmQtM2Y3ZmMxMGY2ZjkwIiwiaWRpcl91c2VyX2d1aWQiOiIzMzI0QjQxQzRCOTk0M0U4OTI3RkMzMzgxNjk4QkY2MCIsImlkZW50aXR5X3Byb3ZpZGVyIjoiaWRpciIsImlkaXJfdXNlcm5hbWUiOiJDQkVSRyIsImVtYWlsX3ZlcmlmaWVkIjpmYWxzZSwibmFtZSI6IkJlcmcsIENocmlzIE1PVEk6RVgiLCJwcmVmZXJyZWRfdXNlcm5hbWUiOiIzMzI0YjQxYzRiOTk0M2U4OTI3ZmMzMzgxNjk4YmY2MEBpZGlyIiwiZ2l2ZW5fbmFtZSI6IkNocmlzIiwiZGlzcGxheV9uYW1lIjoiQmVyZywgQ2hyaXMgTU9USTpFWCIsImZhbWlseV9uYW1lIjoiQmVyZyIsImVtYWlsIjoiY2hyaXMuYmVyZ0Bnb3YuYmMuY2EifQ.RGXNVC6qD8DyDHLAEjrAzt5R_KKFqUlwDmOmP-JcbxuJySDgCyu0iaCTpSZ5DfS1ik1rWTZIvxuyGgX_i7kndhKxhv5xAjbldYSWms6IyOGPDhOqVDuL32Ogzc-x6ej-xL0DQoFwQIs3rrfGBF6-4fS4gBKhz2EPwxPdNKNLBKHiYVLtnrmaQkQSLOk4Dj8ioTcKRepJOTy2iWMThO07VCLLCUunmC77UmIb0tTkQUoX2cGPmX-YeL4sTRxs6-RsOuJmxzeFF2V54twA0moeOUiZPIDvTqD0cAQ0OsbzYs7F2IJAnObpL3km-O9ry_MV1IyuFBFfXDpn3pkAcn9FGA = From 6a99977be841596a964533a56bfc1f08e9e4a57f Mon Sep 17 00:00:00 2001 From: Chris Berg Date: Fri, 23 Aug 2024 14:40:56 -0700 Subject: [PATCH 04/63] fix: Properly adding RESULTS_DIR as env var --- .github/workflows/loadtest.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/loadtest.yml b/.github/workflows/loadtest.yml index 2da075087..c729be489 100644 --- a/.github/workflows/loadtest.yml +++ b/.github/workflows/loadtest.yml @@ -55,7 +55,7 @@ jobs: -JRESULTS_DIR=loadtests/results - run: | - ls -al */ + ls -al results/ - uses: actions/upload-artifact@v4.3.6 with: From 74ef0109491d846e7f9fd8c8fd498eafce35ff10 Mon Sep 17 00:00:00 2001 From: Chris Berg Date: Fri, 23 Aug 2024 14:55:06 -0700 Subject: [PATCH 05/63] fix: Properly adding RESULTS_DIR as env var --- loadtests/orbc_load_test_plan_vehicles.jmx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/loadtests/orbc_load_test_plan_vehicles.jmx b/loadtests/orbc_load_test_plan_vehicles.jmx index e45978d90..c44593089 100644 --- a/loadtests/orbc_load_test_plan_vehicles.jmx +++ b/loadtests/orbc_load_test_plan_vehicles.jmx @@ -143,7 +143,7 @@ true - ${numUsers} + ${NUM_THREADS} From 8755509d7c508378380de8bb8fa5efb837ace581 Mon Sep 17 00:00:00 2001 From: Chris Berg Date: Fri, 23 Aug 2024 15:01:16 -0700 Subject: [PATCH 06/63] fix: Properly adding RESULTS_DIR as env var --- .github/workflows/loadtest.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/loadtest.yml b/.github/workflows/loadtest.yml index c729be489..0f9f070fc 100644 --- a/.github/workflows/loadtest.yml +++ b/.github/workflows/loadtest.yml @@ -55,7 +55,7 @@ jobs: -JRESULTS_DIR=loadtests/results - run: | - ls -al results/ + ls -al loadtests/results - uses: actions/upload-artifact@v4.3.6 with: From 35d137c86b08765c2d5ad8916d4c613be314c8c1 Mon Sep 17 00:00:00 2001 From: Chris Berg Date: Fri, 23 Aug 2024 16:28:47 -0700 Subject: [PATCH 07/63] fix: Properly adding RESULTS_DIR as env var --- .github/workflows/loadtest.yml | 33 +++++++++++++++++-- .../{ => dops}/orbc_load_test_plan_dops.jmx | 0 .../orbc_load_test_plan_frontend.jmx | 0 .../orbc_load_test_plan_vehicles.jmx | 0 4 files changed, 30 insertions(+), 3 deletions(-) rename loadtests/{ => dops}/orbc_load_test_plan_dops.jmx (100%) rename loadtests/{ => frontend}/orbc_load_test_plan_frontend.jmx (100%) rename loadtests/{ => vehicles}/orbc_load_test_plan_vehicles.jmx (100%) diff --git a/.github/workflows/loadtest.yml b/.github/workflows/loadtest.yml index 0f9f070fc..a6163c07d 100644 --- a/.github/workflows/loadtest.yml +++ b/.github/workflows/loadtest.yml @@ -39,10 +39,37 @@ jobs: steps: - uses: actions/checkout@v4 - - name: Run All JMeter Tests In tests Folder - uses: rbhadti94/apache-jmeter-action@v0.5.0 + - uses: rbhadti94/apache-jmeter-action@v0.5.0 with: - testFilePath: loadtests + testFilePath: loadtests/dops + outputReportsFolder: loadtests/results + args: | + --loglevel INFO + --jmeterlogconf=log.conf + -JBEARER_TOKEN=${{inputs.bearer_token}} + -JNUM_THREADS=${{inputs.num_threads}} + -JFRONTEND_API_URL=${{inputs.frontend_api_url}} + -JDOPS_API_URL=${{inputs.dops_api_url}} + -JVEHICLES_API_URL=${{inputs.vehicles_api_url}} + -JRESULTS_DIR=loadtests/results + + - uses: rbhadti94/apache-jmeter-action@v0.5.0 + with: + testFilePath: loadtests/vehicles + outputReportsFolder: loadtests/results + args: | + --loglevel INFO + --jmeterlogconf=log.conf + -JBEARER_TOKEN=${{inputs.bearer_token}} + -JNUM_THREADS=${{inputs.num_threads}} + -JFRONTEND_API_URL=${{inputs.frontend_api_url}} + -JDOPS_API_URL=${{inputs.dops_api_url}} + -JVEHICLES_API_URL=${{inputs.vehicles_api_url}} + -JRESULTS_DIR=loadtests/results + + - uses: rbhadti94/apache-jmeter-action@v0.5.0 + with: + testFilePath: loadtests/frontend outputReportsFolder: loadtests/results args: | --loglevel INFO diff --git a/loadtests/orbc_load_test_plan_dops.jmx b/loadtests/dops/orbc_load_test_plan_dops.jmx similarity index 100% rename from loadtests/orbc_load_test_plan_dops.jmx rename to loadtests/dops/orbc_load_test_plan_dops.jmx diff --git a/loadtests/orbc_load_test_plan_frontend.jmx b/loadtests/frontend/orbc_load_test_plan_frontend.jmx similarity index 100% rename from loadtests/orbc_load_test_plan_frontend.jmx rename to loadtests/frontend/orbc_load_test_plan_frontend.jmx diff --git a/loadtests/orbc_load_test_plan_vehicles.jmx b/loadtests/vehicles/orbc_load_test_plan_vehicles.jmx similarity index 100% rename from loadtests/orbc_load_test_plan_vehicles.jmx rename to loadtests/vehicles/orbc_load_test_plan_vehicles.jmx From bac3bccb39b667fcd638e4658120c76166a5c551 Mon Sep 17 00:00:00 2001 From: Chris Berg Date: Fri, 23 Aug 2024 20:24:05 -0700 Subject: [PATCH 08/63] fix: Properly adding RESULTS_DIR as env var --- .github/workflows/loadtest.yml | 34 ++++++++++++++++++++-------------- 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/.github/workflows/loadtest.yml b/.github/workflows/loadtest.yml index a6163c07d..5494398cc 100644 --- a/.github/workflows/loadtest.yml +++ b/.github/workflows/loadtest.yml @@ -41,8 +41,8 @@ jobs: - uses: rbhadti94/apache-jmeter-action@v0.5.0 with: - testFilePath: loadtests/dops - outputReportsFolder: loadtests/results + testFilePath: loadtests/dops/orbc_load_test_plan_dops.jmx + outputReportsFolder: results_dops args: | --loglevel INFO --jmeterlogconf=log.conf @@ -51,12 +51,12 @@ jobs: -JFRONTEND_API_URL=${{inputs.frontend_api_url}} -JDOPS_API_URL=${{inputs.dops_api_url}} -JVEHICLES_API_URL=${{inputs.vehicles_api_url}} - -JRESULTS_DIR=loadtests/results + -JRESULTS_DIR=results_dops - uses: rbhadti94/apache-jmeter-action@v0.5.0 with: - testFilePath: loadtests/vehicles - outputReportsFolder: loadtests/results + testFilePath: loadtests/vehicles/orbc_load_test_plan_vehicles.jmx + outputReportsFolder: results_vehicles args: | --loglevel INFO --jmeterlogconf=log.conf @@ -65,12 +65,12 @@ jobs: -JFRONTEND_API_URL=${{inputs.frontend_api_url}} -JDOPS_API_URL=${{inputs.dops_api_url}} -JVEHICLES_API_URL=${{inputs.vehicles_api_url}} - -JRESULTS_DIR=loadtests/results + -JRESULTS_DIR=results_vehicles - uses: rbhadti94/apache-jmeter-action@v0.5.0 with: - testFilePath: loadtests/frontend - outputReportsFolder: loadtests/results + testFilePath: loadtests/frontend/orbc_load_test_plan_frontend.jmx + outputReportsFolder: results_frontend args: | --loglevel INFO --jmeterlogconf=log.conf @@ -79,13 +79,19 @@ jobs: -JFRONTEND_API_URL=${{inputs.frontend_api_url}} -JDOPS_API_URL=${{inputs.dops_api_url}} -JVEHICLES_API_URL=${{inputs.vehicles_api_url}} - -JRESULTS_DIR=loadtests/results - - - run: | - ls -al loadtests/results + -JRESULTS_DIR=results_frontend - uses: actions/upload-artifact@v4.3.6 with: - name: jmeter-test-results - path: loadtests/results + name: jmeter-test-results-dops + path: results_dops + - uses: actions/upload-artifact@v4.3.6 + with: + name: jmeter-test-results-vehicles + path: results_vehicles + + - uses: actions/upload-artifact@v4.3.6 + with: + name: jmeter-test-results-frontend + path: results_frontend From cfd78b92ca9086ce93d04cebf9e2c02d8215671c Mon Sep 17 00:00:00 2001 From: Chris Berg Date: Thu, 29 Aug 2024 10:20:34 -0700 Subject: [PATCH 09/63] fix: Properly adding RESULTS_DIR as env var --- loadtests/vehicles/orbc_load_test_plan_vehicles.jmx | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/loadtests/vehicles/orbc_load_test_plan_vehicles.jmx b/loadtests/vehicles/orbc_load_test_plan_vehicles.jmx index c44593089..a1e2a7918 100644 --- a/loadtests/vehicles/orbc_load_test_plan_vehicles.jmx +++ b/loadtests/vehicles/orbc_load_test_plan_vehicles.jmx @@ -82,7 +82,7 @@ NUM_THREADS - 200 + 2 = @@ -358,7 +358,7 @@ - + continue false @@ -603,7 +603,7 @@ - + continue false @@ -730,7 +730,7 @@ - + continue false @@ -942,7 +942,7 @@ - + continue false @@ -1139,7 +1139,7 @@ - + continue false From d7694f270488efb7d7bcf83cfdd3a76b2ea76dec Mon Sep 17 00:00:00 2001 From: Chris Berg Date: Thu, 29 Aug 2024 12:42:46 -0700 Subject: [PATCH 10/63] fix: moving loadtests to own pipelines --- .github/workflows/loadtest.yml | 97 ------------------------- .github/workflows/loadtest_dops.yml | 63 ++++++++++++++++ .github/workflows/loadtest_frontend.yml | 62 ++++++++++++++++ .github/workflows/loadtest_vehicles.yml | 63 ++++++++++++++++ 4 files changed, 188 insertions(+), 97 deletions(-) delete mode 100644 .github/workflows/loadtest.yml create mode 100644 .github/workflows/loadtest_dops.yml create mode 100644 .github/workflows/loadtest_frontend.yml create mode 100644 .github/workflows/loadtest_vehicles.yml diff --git a/.github/workflows/loadtest.yml b/.github/workflows/loadtest.yml deleted file mode 100644 index 5494398cc..000000000 --- a/.github/workflows/loadtest.yml +++ /dev/null @@ -1,97 +0,0 @@ ---- -name: Loadtests - -on: - workflow_dispatch: - inputs: - ### Required - num_threads: - description: 'Number of concurrent threads (USERS) for each test in sequence' - default: 200 - required: true - type: integer - dops_api_url: - description: 'The url endpoint for the dops' - default: onroutebc-test-dops.apps.silver.devops.gov.bc.ca - required: true - type: string - frontend_api_url: - description: 'The url endpoint for the frontend' - default: onroutebc-test-frontend.apps.silver.devops.gov.bc.ca - required: true - type: string - vehicles_api_url: - description: 'The url endpoint for vehicles' - default: onroutebc-test-vehicles.apps.silver.devops.gov.bc.ca - required: true - type: string - bearer_token: - description: "The bearer token pertaining to the user running the tests" - required: true - type: string - -jobs: - loadtests: - name: Loadtests - environment: ${{ inputs.environment }} - runs-on: ubuntu-22.04 - timeout-minutes: 60 - steps: - - uses: actions/checkout@v4 - - - uses: rbhadti94/apache-jmeter-action@v0.5.0 - with: - testFilePath: loadtests/dops/orbc_load_test_plan_dops.jmx - outputReportsFolder: results_dops - args: | - --loglevel INFO - --jmeterlogconf=log.conf - -JBEARER_TOKEN=${{inputs.bearer_token}} - -JNUM_THREADS=${{inputs.num_threads}} - -JFRONTEND_API_URL=${{inputs.frontend_api_url}} - -JDOPS_API_URL=${{inputs.dops_api_url}} - -JVEHICLES_API_URL=${{inputs.vehicles_api_url}} - -JRESULTS_DIR=results_dops - - - uses: rbhadti94/apache-jmeter-action@v0.5.0 - with: - testFilePath: loadtests/vehicles/orbc_load_test_plan_vehicles.jmx - outputReportsFolder: results_vehicles - args: | - --loglevel INFO - --jmeterlogconf=log.conf - -JBEARER_TOKEN=${{inputs.bearer_token}} - -JNUM_THREADS=${{inputs.num_threads}} - -JFRONTEND_API_URL=${{inputs.frontend_api_url}} - -JDOPS_API_URL=${{inputs.dops_api_url}} - -JVEHICLES_API_URL=${{inputs.vehicles_api_url}} - -JRESULTS_DIR=results_vehicles - - - uses: rbhadti94/apache-jmeter-action@v0.5.0 - with: - testFilePath: loadtests/frontend/orbc_load_test_plan_frontend.jmx - outputReportsFolder: results_frontend - args: | - --loglevel INFO - --jmeterlogconf=log.conf - -JBEARER_TOKEN=${{inputs.bearer_token}} - -JNUM_THREADS=${{inputs.num_threads}} - -JFRONTEND_API_URL=${{inputs.frontend_api_url}} - -JDOPS_API_URL=${{inputs.dops_api_url}} - -JVEHICLES_API_URL=${{inputs.vehicles_api_url}} - -JRESULTS_DIR=results_frontend - - - uses: actions/upload-artifact@v4.3.6 - with: - name: jmeter-test-results-dops - path: results_dops - - - uses: actions/upload-artifact@v4.3.6 - with: - name: jmeter-test-results-vehicles - path: results_vehicles - - - uses: actions/upload-artifact@v4.3.6 - with: - name: jmeter-test-results-frontend - path: results_frontend diff --git a/.github/workflows/loadtest_dops.yml b/.github/workflows/loadtest_dops.yml new file mode 100644 index 000000000..b303cb1cc --- /dev/null +++ b/.github/workflows/loadtest_dops.yml @@ -0,0 +1,63 @@ +--- +name: loadtest_dops + +on: + workflow_dispatch: + inputs: + ### Required + num_threads: + description: 'Number of concurrent threads (USERS) for each test in sequence' + default: 2 + required: true + type: integer + release: + description: 'PR number, test or prod.' + default: test + required: true + type: string + bearer_token: + description: "The bearer token pertaining to the user running the tests" + required: true + type: string + +jobs: + vars: + name: Set Variables + outputs: + dops_api_url: ${{ steps.vars.outputs.dops_api_url }} + frontend_api_url: ${{ steps.vars.outputs.frontend_api_url }} + vehicles_api_url: ${{ steps.vars.outputs.vehicles_api_url }} + runs-on: ubuntu-22.04 + steps: + - name: vars + id: vars + run: | + echo "dops_api_url=onroutebc-${{inputs.environment}}-dops.apps.silver.devops.gov.bc.ca" >> GITHUB_ENV + echo "frontend_api_url=onroutebc-${{inputs.environment}}-frontend.apps.silver.devops.gov.bc.ca" >> GITHUB_ENV + echo "vehicles_api_url=onroutebc-${{inputs.environment}}-vehicles.apps.silver.devops.gov.bc.ca" >> GITHUB_ENV + + orbc_load_test_plan_dops: + name: orbc_load_test_plan_dops + environment: ${{ inputs.environment }} + runs-on: ubuntu-22.04 + timeout-minutes: 60 + steps: + - uses: actions/checkout@v4 + - uses: rbhadti94/apache-jmeter-action@v0.5.0 + with: + testFilePath: loadtests/dops/orbc_load_test_plan_dops.jmx + outputReportsFolder: results_dops + args: | + --loglevel INFO + --jmeterlogconf=log.conf + -JBEARER_TOKEN=${{inputs.bearer_token}} + -JNUM_THREADS=${{inputs.num_threads}} + -JFRONTEND_API_URL=${{vars.frontend_api_url}} + -JDOPS_API_URL=${{vars.dops_api_url}} + -JVEHICLES_API_URL=${{vars.vehicles_api_url}} + -JRESULTS_DIR=results_dops + + - uses: actions/upload-artifact@v4.3.6 + with: + name: jmeter-test-results-dops + path: results_dops diff --git a/.github/workflows/loadtest_frontend.yml b/.github/workflows/loadtest_frontend.yml new file mode 100644 index 000000000..86e9aea4a --- /dev/null +++ b/.github/workflows/loadtest_frontend.yml @@ -0,0 +1,62 @@ +--- +name: loadtest_frontend + +on: + workflow_dispatch: + inputs: + ### Required + num_threads: + description: 'Number of concurrent threads (USERS) for each test in sequence' + default: 2 + required: true + type: integer + release: + description: 'PR number, test or prod.' + default: test + required: true + type: string + bearer_token: + description: "The bearer token pertaining to the user running the tests" + required: true + type: string + +jobs: + vars: + name: Set Variables + outputs: + dops_api_url: ${{ steps.vars.outputs.dops_api_url }} + frontend_api_url: ${{ steps.vars.outputs.frontend_api_url }} + vehicles_api_url: ${{ steps.vars.outputs.vehicles_api_url }} + runs-on: ubuntu-22.04 + steps: + - name: vars + id: vars + run: | + echo "dops_api_url=onroutebc-${{inputs.environment}}-dops.apps.silver.devops.gov.bc.ca" >> GITHUB_ENV + echo "frontend_api_url=onroutebc-${{inputs.environment}}-frontend.apps.silver.devops.gov.bc.ca" >> GITHUB_ENV + echo "vehicles_api_url=onroutebc-${{inputs.environment}}-vehicles.apps.silver.devops.gov.bc.ca" >> GITHUB_ENV + + orbc_load_test_plan_frontend: + name: orbc_load_test_plan_frontend + environment: ${{ inputs.environment }} + runs-on: ubuntu-22.04 + timeout-minutes: 60 + steps: + - uses: actions/checkout@v4 + - uses: rbhadti94/apache-jmeter-action@v0.5.0 + with: + testFilePath: loadtests/frontend/orbc_load_test_plan_frontend.jmx + outputReportsFolder: results_frontend + args: | + --loglevel INFO + --jmeterlogconf=log.conf + -JBEARER_TOKEN=${{inputs.bearer_token}} + -JNUM_THREADS=${{inputs.num_threads}} + -JFRONTEND_API_URL=${{vars.frontend_api_url}} + -JDOPS_API_URL=${{vars.dops_api_url}} + -JVEHICLES_API_URL=${{vars.vehicles_api_url}} + -JRESULTS_DIR=results_frontend + - uses: actions/upload-artifact@v4.3.6 + with: + name: jmeter-test-results-frontend + path: results_frontend diff --git a/.github/workflows/loadtest_vehicles.yml b/.github/workflows/loadtest_vehicles.yml new file mode 100644 index 000000000..aa920d799 --- /dev/null +++ b/.github/workflows/loadtest_vehicles.yml @@ -0,0 +1,63 @@ +--- +name: loadtest_vehicles + +on: + workflow_dispatch: + inputs: + ### Required + num_threads: + description: 'Number of concurrent threads (USERS) for each test in sequence' + default: 2 + required: true + type: integer + release: + description: 'PR number, test or prod.' + default: test + required: true + type: string + bearer_token: + description: "The bearer token pertaining to the user running the tests" + required: true + type: string + +jobs: + vars: + name: Set Variables + outputs: + dops_api_url: ${{ steps.vars.outputs.dops_api_url }} + frontend_api_url: ${{ steps.vars.outputs.frontend_api_url }} + vehicles_api_url: ${{ steps.vars.outputs.vehicles_api_url }} + runs-on: ubuntu-22.04 + steps: + - name: vars + id: vars + run: | + echo "dops_api_url=onroutebc-${{inputs.environment}}-dops.apps.silver.devops.gov.bc.ca" >> GITHUB_ENV + echo "frontend_api_url=onroutebc-${{inputs.environment}}-frontend.apps.silver.devops.gov.bc.ca" >> GITHUB_ENV + echo "vehicles_api_url=onroutebc-${{inputs.environment}}-vehicles.apps.silver.devops.gov.bc.ca" >> GITHUB_ENV + + orbc_load_test_plan_vehicles: + name: orbc_load_test_plan_vehicles + environment: ${{ inputs.environment }} + runs-on: ubuntu-22.04 + timeout-minutes: 60 + steps: + - uses: actions/checkout@v4 + - uses: rbhadti94/apache-jmeter-action@v0.5.0 + with: + testFilePath: loadtests/vehicles/orbc_load_test_plan_vehicles.jmx + outputReportsFolder: results_vehicles + args: | + --loglevel INFO + --jmeterlogconf=log.conf + -JBEARER_TOKEN=${{inputs.bearer_token}} + -JNUM_THREADS=${{inputs.num_threads}} + -JFRONTEND_API_URL=${{vars.frontend_api_url}} + -JDOPS_API_URL=${{vars.dops_api_url}} + -JVEHICLES_API_URL=${{vars.vehicles_api_url}} + -JRESULTS_DIR=results_vehicles + + - uses: actions/upload-artifact@v4.3.6 + with: + name: jmeter-test-results-vehicles + path: results_vehicles From 17ba1793fea26cd2d67745cf5f574a05f7dcda9e Mon Sep 17 00:00:00 2001 From: Chris Berg Date: Wed, 4 Sep 2024 10:36:52 -0700 Subject: [PATCH 11/63] feat: split idir & bceid tests; testing new loadtest workflows --- .github/workflows/loadtest_vehicles.yml | 4 +- .../orbc_load_test_plan_vehicles_bceid.jmx | 549 +++++++++++++++ ... => orbc_load_test_plan_vehicles_idir.jmx} | 647 +----------------- 3 files changed, 585 insertions(+), 615 deletions(-) create mode 100644 loadtests/vehicles/orbc_load_test_plan_vehicles_bceid.jmx rename loadtests/vehicles/{orbc_load_test_plan_vehicles.jmx => orbc_load_test_plan_vehicles_idir.jmx} (58%) diff --git a/.github/workflows/loadtest_vehicles.yml b/.github/workflows/loadtest_vehicles.yml index aa920d799..c5f513bf4 100644 --- a/.github/workflows/loadtest_vehicles.yml +++ b/.github/workflows/loadtest_vehicles.yml @@ -45,7 +45,7 @@ jobs: - uses: actions/checkout@v4 - uses: rbhadti94/apache-jmeter-action@v0.5.0 with: - testFilePath: loadtests/vehicles/orbc_load_test_plan_vehicles.jmx + testFilePath: loadtests/vehicles/ outputReportsFolder: results_vehicles args: | --loglevel INFO @@ -53,7 +53,7 @@ jobs: -JBEARER_TOKEN=${{inputs.bearer_token}} -JNUM_THREADS=${{inputs.num_threads}} -JFRONTEND_API_URL=${{vars.frontend_api_url}} - -JDOPS_API_URL=${{vars.dops_api_url}} + -JDOPS_API_URL=${{vars.vars_api_url}} -JVEHICLES_API_URL=${{vars.vehicles_api_url}} -JRESULTS_DIR=results_vehicles diff --git a/loadtests/vehicles/orbc_load_test_plan_vehicles_bceid.jmx b/loadtests/vehicles/orbc_load_test_plan_vehicles_bceid.jmx new file mode 100644 index 000000000..39666fc66 --- /dev/null +++ b/loadtests/vehicles/orbc_load_test_plan_vehicles_bceid.jmx @@ -0,0 +1,549 @@ + + + + + + false + true + false + + + + + + + + + + + + + + + + true + 2 + ^((?!google|facebook|youtube|pinterest|twimg|doubleclick).)*$ + 60000 + 120000 + + + + + + Accept-Language + en-us,en;q=0.5 + + + Accept + text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 + + + Keep-Alive + 115 + + + User-Agent + Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13 + + + Accept-Encoding + gzip,deflate + + + Accept-Charset + ISO-8859-1,utf-8;q=0.7,*;q=0.7 + + + X-BlazeMeter-Session + ${__P(blazemeter.session_id)} + + + + + + + true + false + + + + true + false + false + + + + + + USERS + 200 + = + + + VEHICLES_API_URL + https://onroutebc-test-vehicles.apps.silver.devops.gov.bc.ca + = + + + FRONTEND_API_URL + https://onroutebc-test-frontend.apps.silver.devops.gov.bc.ca + = + + + RESULTS_DIR + ~/results + = + + + BEARER_TOKEN_BCEID + + = + + + USER_GUID + + = + + + + + + continue + + false + 1 + + 1 + ${__P(rampup,300)} + 1365261073000 + 1365261073000 + true + ${__P(duration,3000)} + + true + + + + + + Authorization + Bearer ${BEARER_TOKEN_BCEID} + + + Accept + */* + + + Content-Type + application/json + + + + + + true + + + + false + { + "permitId": null, + "originalPermitId": null, + "applicationNumber": null, + "permitType": "TROS", + "permitStatus": "ISSUED", + "permitApprovalSource": "PPC", + "permitApplicationOrigin": "ONLINE", + "permitData": { + "startDate": "2023-06-05T19:12:22Z", + "expiryDate": "2023-07-04T19:12:22Z", + "permitDuration": 30, + "feeSummary": "30", + "commodities": [ + { + "description": "General Permit Conditions", + "condition": "CVSE-1000", + "conditionLink": "https://www.th.gov.bc.ca/forms/getForm.aspx?formId=1251", + "checked": true + }, + { + "description": "Permit Scope and Limitation", + "condition": "CVSE-1070", + "conditionLink": "https://www.th.gov.bc.ca/forms/getForm.aspx?formId=1261", + "checked": true + }, + { + "description": "Log Permit Conditions", + "condition": "CVSE-1000L", + "conditionLink": "https://www.th.gov.bc.ca/forms/getForm.aspx?formId=1250", + "checked": true + } + ], + "contactDetails": { + "firstName": "Lewis", + "lastName": "Hamilton", + "phone1": "(778) 952-1234", + "email": "lewis@f1.com", + "additionalEmail": "lewis2@f1.com", + "phone1Extension": "1", + "phone2": null, + "phone2Extension": null, + "fax": null + }, + "mailingAddress": { + "addressLine1": "123 Short Street", + "addressLine2": null, + "city": "Victoria", + "provinceCode": "BC", + "countryCode": "CA", + "postalCode": "V8X2V5" + }, + "vehicleDetails": { + "vin": "781452", + "plate": "PRJZZP", + "make": "GMC", + "year": 2001, + "countryCode": "CA", + "provinceCode": "BC", + "vehicleType": "powerUnit", + "vehicleSubType": "LOGGING", + "saveVehicle": true + } + }, + "comment": "This application was amended because of so-and-so reason." +} + = + + + + + + + + ${VEHICLES_API_URL}/companies/104/applications + POST + true + false + true + false + + + + + + + + continue + + false + 1 + + ${USERS} + ${__P(rampup,300)} + 1365261073000 + 1365261073000 + true + ${__P(duration,3000)} + + true + + + + + + Authorization + Bearer ${BEARER_TOKEN_BCEID} + + + Accept + application/json + + + Content-Type + application/json + + + + + + + + + false + + = + true + + + + + + + + ${VEHICLES_API_URL}/companies/104/applications/393 + GET + true + false + true + false + + + + + + + true + + + + false + { + "permitType": "TROS", + "permitData": {}, + "comment": "This application was amended because of so-and-so reason." +} + = + + + + + + + + ${VEHICLES_API_URL}/companies/104/applications/393 + PUT + true + false + true + false + + + + + + + + continue + + false + 1 + + ${USERS} + ${__P(rampup,300)} + 1365261073000 + 1365261073000 + true + ${__P(duration,3000)} + + true + + + + + + Authorization + Bearer ${BEARER_TOKEN_IDIR} + + + Accept + */* + + + + + + + + + false + + = + true + + + + + + + + ${VEHICLES_API_URL}/companies/74/vehicles/powerUnits + GET + true + false + true + false + + + + + + + + + Authorization + Bearer ${BEARER_TOKEN} + + + Accept + */* + + + + + + + + + + false + + = + true + + + + + + + + ${VEHICLES_API_URL}/companies/74/vehicles/trailers + GET + true + false + true + false + + + + + + + + + Authorization + Bearer ${BEARER_TOKEN} + + + Accept + */* + + + + + + + + false + + saveConfig + + + true + true + true + + true + true + true + true + false + true + true + false + false + false + true + false + false + false + true + 0 + true + true + true + true + true + true + + + + + + + false + + saveConfig + + + true + true + true + + true + true + true + true + false + true + true + false + false + false + true + false + false + false + true + 0 + true + true + true + true + true + true + + + + + + + false + + saveConfig + + + true + true + true + + true + true + true + true + false + true + true + false + false + false + true + false + false + false + true + 0 + true + true + true + true + true + true + + + ${RESULTS_DIR}/vehicles.csv + + + + + diff --git a/loadtests/vehicles/orbc_load_test_plan_vehicles.jmx b/loadtests/vehicles/orbc_load_test_plan_vehicles_idir.jmx similarity index 58% rename from loadtests/vehicles/orbc_load_test_plan_vehicles.jmx rename to loadtests/vehicles/orbc_load_test_plan_vehicles_idir.jmx index a1e2a7918..fccfc85fa 100644 --- a/loadtests/vehicles/orbc_load_test_plan_vehicles.jmx +++ b/loadtests/vehicles/orbc_load_test_plan_vehicles_idir.jmx @@ -80,9 +80,9 @@ - - NUM_THREADS - 2 + + USERS + 200 = @@ -100,15 +100,20 @@ ~/results = - - BEARER_TOKEN + + BEARER_TOKEN_IDIR + + = + + + USER_GUID = - + continue false @@ -132,7 +137,7 @@ Authorization - Bearer ${BEARER_TOKEN} + Bearer ${BEARER_TOKEN_IDIR} Accept @@ -143,7 +148,7 @@ true - ${NUM_THREADS} + ${numUsers} @@ -255,7 +260,7 @@ - + @@ -263,7 +268,7 @@ - ${VEHICLES_API_URL}/users/roles?companyId=74 + ${VEHICLES_API_URL}/users?userRole=PPCCLERK&permitIssuerPPCUser=true GET true false @@ -357,41 +362,7 @@ - - - continue - - false - 1 - - 1 - ${__P(rampup,300)} - 1365261073000 - 1365261073000 - true - ${__P(duration,3000)} - 0 - false - - - - ${__P(Delay,10000)} - - - - - - Authorization - Bearer ${BEARER_TOKEN} - - - Accept - */* - - - - - + @@ -399,7 +370,7 @@ - ${VEHICLES_API_URL}/users/roles?companyId=74 + ${VEHICLES_API_URL}/users/claims?companyId=74 GET true false @@ -493,23 +464,16 @@ - + - - - false - - = - true - - + - ${VEHICLES_API_URL}/permits?searchColumn=permitNumber&searchString=1&page=1&take=10 - GET + ${VEHICLES_API_URL}/users/user-context + POST true false true @@ -596,43 +560,13 @@ Accept - application/json + */* - - - continue - - false - 1 - - ${NUM_THREADS} - ${__P(rampup,300)} - 1365261073000 - 1365261073000 - true - ${__P(duration,3000)} - - true - - - - - - Authorization - Bearer ${BEARER_TOKEN} - - - Accept - */* - - - - - + @@ -640,134 +574,7 @@ - ${VEHICLES_API_URL}/users/roles?companyId=74 - GET - true - false - true - false - - - - - - - - - - false - - = - true - - - - - - - - ${VEHICLES_API_URL}/permits?searchColumn=permitNumber&searchString=1&page=1&take=10 - GET - true - false - true - false - - - - - - - - - - false - - = - true - - - - - - - - ${VEHICLES_API_URL}/permits/applications/9?amendment=true&companyId=74 - GET - true - false - true - false - - - - - - - - - - false - - = - true - - - - - - - - ${VEHICLES_API_URL}/permits/1/pdf - GET - true - false - true - false - - - - - - - - continue - - false - 1 - - ${NUM_THREADS} - ${__P(rampup,300)} - 1365261073000 - 1365261073000 - true - ${__P(duration,3000)} - - true - - - - - - Authorization - Bearer ${BEARER_TOKEN} - - - Accept - */* - - - - - - - - - - - - - ${VEHICLES_API_URL}/users/roles?companyId=74 + ${VEHICLES_API_URL}/users/${USER_GUID} GET true false @@ -861,94 +668,14 @@ - - - - - false - - = - true - - - - - - - - ${VEHICLES_API_URL}/companies/74/vehicles/powerUnits - GET - true - false - true - false - - - - - - - - - Authorization - Bearer ${BEARER_TOKEN} - - - Accept - */* - - - - - - - - - - false - - = - true - - - - - - - - ${VEHICLES_API_URL}/companies/74/vehicles/trailers - GET - true - false - true - false - - - - - - - - - Authorization - Bearer ${BEARER_TOKEN} - - - Accept - */* - - - - - - + continue false 1 - ${NUM_THREADS} + ${USERS} ${__P(rampup,300)} 1365261073000 1365261073000 @@ -962,39 +689,16 @@ Authorization - Bearer ${BEARER_TOKEN} + Bearer ${BEARER_TOKEN_IDIR} Accept - application/json - - - Content-Type - application/json + */* - - - - - - - - - ${VEHICLES_API_URL}/users/roles?companyId=74 - GET - true - false - true - false - - - - - - + @@ -1009,7 +713,7 @@ - ${VEHICLES_API_URL}/permits/applications?page=1&take=10&orderBy=applicationNumber%3ADESC%2CpermitType%3AASC&companyId=74 + ${VEHICLES_API_URL}/permits?searchColumn=permitNumber&searchString=1&page=1&take=10 GET true false @@ -1020,7 +724,7 @@ - + @@ -1035,7 +739,7 @@ - ${VEHICLES_API_URL}/permits/applications/20?companyId=74 + ${VEHICLES_API_URL}/companies/104/permits/14/document GET true false @@ -1046,40 +750,7 @@ - - true - - - - false - { - "companyId": 74, - "userGuid": "06267945F2EB4E31B585932F78B76269", - "permitType": "TROS", - "permitStatus": "ISSUED", - "permitApplicationOrigin": "ONLINE", - "permitData": {} -} - = - - - - - - - - ${VEHICLES_API_URL}/permits/applications/A2-00010000-123-A00 - PUT - true - false - true - false - - - - - - + @@ -1094,93 +765,7 @@ - ${VEHICLES_API_URL}/permits/applications?page=1&take=10&orderBy=applicationNumber%3ADESC%2CpermitType%3AASC&companyId=74 - GET - true - false - true - false - - - - - - - true - - - - false - { - "companyId": 74, - "userGuid": "06267945F2EB4E31B585932F78B76269", - "permitType": "TROS", - "permitStatus": "ISSUED", - "permitApplicationOrigin": "ONLINE", - "permitData": {} -} - = - - - - - - - - ${VEHICLES_API_URL}/permits/applications/A2-00010000-123-A00 - PUT - true - false - true - false - - - - - - - - continue - - false - 1 - - 1 - ${__P(rampup,300)} - 1365261073000 - 1365261073000 - true - ${__P(duration,3000)} - - true - - - - - - Authorization - Bearer ${BEARER_TOKEN} - - - Accept - */* - - - Content-Type - application/json - - - - - - - - - - - - - ${VEHICLES_API_URL}/users/roles?companyId=74 + ${VEHICLES_API_URL}/companies/104/permits/14/receipt GET true false @@ -1190,170 +775,6 @@ - - - - - Host - ${VEHICLES_API_URL} - - - Connection - keep-alive - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - Accept - application/json - - - sec-ch-ua-mobile - ?0 - - - Authorization - Bearer ${BEARER_TOKEN} - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - sec-ch-ua-platform - "Windows" - - - Origin - ${FRONTEND_API_URL} - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - cors - - - Sec-Fetch-Dest - empty - - - Referer - ${FRONTEND_API_URL}/ - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - If-None-Match - W/"17b2-OQs45yY+9rxT8oaE549bg+d9IqA" - - - - - - - true - - - - false - { - "companyId": 74, - "permitId": null, - "originalPermitId": null, - "applicationNumber": null, - "previousRevision": null, - "revision": null, - "userGuid": "06267945F2EB4E31B585932F78B76269", - "permitType": "TROS", - "permitStatus": "ISSUED", - "permitApprovalSource": "PPC", - "permitApplicationOrigin": "ONLINE", - "permitData": { - "startDate": "2023-06-05T19:12:22Z", - "expiryDate": "2023-07-04T19:12:22Z", - "permitDuration": 30, - "feeSummary": "30", - "commodities": [ - { - "description": "General Permit Conditions", - "condition": "CVSE-1000", - "conditionLink": "https://www.th.gov.bc.ca/forms/getForm.aspx?formId=1251", - "checked": true - }, - { - "description": "Permit Scope and Limitation", - "condition": "CVSE-1070", - "conditionLink": "https://www.th.gov.bc.ca/forms/getForm.aspx?formId=1261", - "checked": true - }, - { - "description": "Log Permit Conditions", - "condition": "CVSE-1000L", - "conditionLink": "https://www.th.gov.bc.ca/forms/getForm.aspx?formId=1250", - "checked": true - } - ], - "contactDetails": { - "firstName": "Lewis", - "lastName": "Hamilton", - "phone1": "(778) 952-1234", - "email": "lewis@f1.com", - "phone1Extension": "1", - "phone2": null, - "phone2Extension": null, - "fax": null - }, - "mailingAddress": { - "addressLine1": "123 Short Street", - "addressLine2": null, - "city": "Victoria", - "provinceCode": "BC", - "countryCode": "CA", - "postalCode": "V8X2V5" - }, - "vehicleDetails": { - "vin": "781452", - "plate": "PRJZZP", - "make": "GMC", - "year": 2001, - "countryCode": "CA", - "provinceCode": "BC", - "vehicleType": "powerUnit", - "vehicleSubType": "LOGGING", - "saveVehicle": true - } - }, - "comment": "This application was amended because of so-and-so reason." -} - = - - - - - - - - ${VEHICLES_API_URL}/permits/applications - POST - true - false - true - false - - - - From c0ec54f865d40839b430ae2ff71282a59917aed3 Mon Sep 17 00:00:00 2001 From: bcgov-brwang Date: Wed, 4 Sep 2024 11:37:29 -0700 Subject: [PATCH 12/63] ORV2-2732: updated get power units and get trailers token to bceid token ORV2-2732: updated get power units and get trailers token to bceid token --- loadtests/vehicles/orbc_load_test_plan_vehicles_bceid.jmx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/loadtests/vehicles/orbc_load_test_plan_vehicles_bceid.jmx b/loadtests/vehicles/orbc_load_test_plan_vehicles_bceid.jmx index 39666fc66..8093387ed 100644 --- a/loadtests/vehicles/orbc_load_test_plan_vehicles_bceid.jmx +++ b/loadtests/vehicles/orbc_load_test_plan_vehicles_bceid.jmx @@ -1,5 +1,5 @@ - + @@ -343,7 +343,7 @@ Authorization - Bearer ${BEARER_TOKEN_IDIR} + Bearer ${BEARER_TOKEN_BCEID} Accept @@ -367,7 +367,7 @@ - ${VEHICLES_API_URL}/companies/74/vehicles/powerUnits + ${VEHICLES_API_URL}/companies/104/vehicles/powerUnits GET true false @@ -407,7 +407,7 @@ - ${VEHICLES_API_URL}/companies/74/vehicles/trailers + ${VEHICLES_API_URL}/companies/104/vehicles/trailers GET true false From 7c3c1b81714344dad1ee65c55da8c88481eae9fe Mon Sep 17 00:00:00 2001 From: Krishnan Subramanian <84348052+krishnan-aot@users.noreply.github.com> Date: Wed, 4 Sep 2024 14:46:50 -0700 Subject: [PATCH 13/63] ORV2-2629 Permission Matrix in Routes and Auth walls (#1581) --- .../common/authentication/PermissionMatrix.ts | 111 +++++++------- .../auth-walls/BCeIDAuthWall.tsx | 31 ++-- .../auth-walls/IDIRAuthWall.tsx | 41 ++--- .../src/common/components/header/Header.tsx | 33 ++-- .../common/components/reusable/RenderIf.tsx | 44 +++--- .../dashboard/ManageProfilesDashboard.tsx | 8 +- .../components/dashboard/PermitLists.tsx | 12 +- .../creditAccount/AccountDetails.tsx | 10 +- .../components/creditAccount/UserTable.tsx | 7 +- .../dashboard/ManageSettingsDashboard.tsx | 4 +- .../pages/CreditAccountMetadataComponent.tsx | 6 +- .../settings/pages/ViewCreditAccount.tsx | 24 ++- frontend/src/routes/Routes.tsx | 141 ++++++++++++------ 13 files changed, 276 insertions(+), 196 deletions(-) diff --git a/frontend/src/common/authentication/PermissionMatrix.ts b/frontend/src/common/authentication/PermissionMatrix.ts index ce77ce01d..7d31b4265 100644 --- a/frontend/src/common/authentication/PermissionMatrix.ts +++ b/frontend/src/common/authentication/PermissionMatrix.ts @@ -385,27 +385,18 @@ export type PermissionConfigType = { * If provided, it takes the highest priority. * * If a feature is not enabled, - * the component WILL NOT render regardless of other conditions. + * the component **WILL NOT** render regardless of other conditions. */ featureFlag?: string; /** - * With only condition to check, all input props but `featureFlag` - * are skipped. - * - * This is the second highest priority after `featureFlag`. - * - * i.e., this function will be the only check to decide whether to render - * a component. - * - * @param args Any arguments to be passed. - * @returns A boolean. + * The permission matrix keys for looking up the allowed roles. */ - onlyConditionToCheck?: (...args: any) => boolean; + permissionMatrixKeys?: PermissionMatrixKeysType; /** * An additional function call whose boolean value will be accounted * for determining whether to render a component. - * i.e., this function will play along with other specifications - * given in the other input props. + * i.e., this function will be called the last after other conditions + * have succeeded. * * @param args Any arguments to be passed. * @returns A boolean. @@ -443,12 +434,12 @@ export type PermissionMatrixKeysType = { * The name of the feature as defined in the Feature column in the matrix * document. */ - permissionMatrixFeatureKey?: K; + permissionMatrixFeatureKey: K; /** * The name of the function as defined in the Function column in the matrix * document. */ - permissionMatrixFunctionKey?: keyof (typeof PERMISSIONS_MATRIX)[K]; + permissionMatrixFunctionKey: keyof (typeof PERMISSIONS_MATRIX)[K]; }; }[keyof typeof PERMISSIONS_MATRIX]; @@ -461,24 +452,19 @@ export type PermissionMatrixKeysType = { * @param {string} [config.featureFlag] - Feature flag key to check if the feature is enabled. * * Priority 2 - * @param {Function} [config.onlyConditionToCheck] - A custom condition function, if provided this is the only condition checked. - * - * Priority 3 * @param {string} [config.permissionMatrixFeatureKey] - The major feature that's the primary key in {@link PERMISSIONS_MATRIX}. * @param {string} [config.permissionMatrixFunctionKey] - The function that's the nested key in {@link PERMISSIONS_MATRIX}. * - * Priority 4 - * @param {Function} [config.additionalConditionToCall] - Additional custom condition to call if the basic conditions are met. + * Priority 3 + * @param {Function} [config.additionalConditionToCheck] - Additional custom condition to call if the basic conditions are met. * * @returns {boolean} - Returns whether the current user has the permission. */ export const usePermissionMatrix = ({ featureFlag, - onlyConditionToCheck, - permissionMatrixFeatureKey, - permissionMatrixFunctionKey, + permissionMatrixKeys, additionalConditionToCheck, -}: PermissionConfigType & PermissionMatrixKeysType): boolean => { +}: PermissionConfigType): boolean => { const { userDetails, idirUserDetails } = useContext(OnRouteBCContext); const { data: featureFlags } = useFeatureFlagsQuery(); const isIdir = Boolean(idirUserDetails?.userRole); @@ -489,35 +475,60 @@ export const usePermissionMatrix = ({ return false; } } - - // If the onlyConditionToCheck function is given, call that alone and exit. - if (onlyConditionToCheck) { - return onlyConditionToCheck(); - } let isAllowed = false; - let currentUserRole; - if (permissionMatrixFeatureKey && permissionMatrixFunctionKey) { - const { allowedBCeIDRoles, allowedIDIRRoles } = ( - PERMISSIONS_MATRIX[permissionMatrixFeatureKey] as { - [key: string]: PermissionMatrixConfigObject; - } - )[permissionMatrixFunctionKey]; - if (isIdir) { - currentUserRole = idirUserDetails?.userRole; - isAllowed = Boolean( - currentUserRole && - allowedIDIRRoles?.includes(currentUserRole), - ); - } else { - currentUserRole = userDetails?.userRole; - isAllowed = Boolean( - currentUserRole && - allowedBCeIDRoles?.includes(currentUserRole), - ); - } + if (permissionMatrixKeys) { + isAllowed = checkPermissionMatrix({ + permissionMatrixKeys, + isIdir, + currentUserRole: isIdir + ? (idirUserDetails?.userRole as IDIRUserRoleType) + : (userDetails?.userRole as BCeIDUserRoleType), + }); } if (isAllowed && additionalConditionToCheck) { isAllowed = isAllowed && additionalConditionToCheck(); } return isAllowed; }; + +/** + * Checks if the current user has the necessary permissions based on the provided + * permission matrix keys, user role, and whether the user is an IDIR user or not. + * + * @param {Object} params - Parameters for the permission matrix check. + * @param {PermissionMatrixKeysType} params.permissionMatrixKeys - The keys to use for looking up in the permissions matrix. + * @param {boolean} params.isIdir - Boolean indicating whether the current user is an IDIR user. + * @param {BCeIDUserRoleType | IDIRUserRoleType} params.currentUserRole - The role of the current user. + * + * @returns {boolean} - Returns whether the user is allowed to access the resource. + */ +export const checkPermissionMatrix = ({ + permissionMatrixKeys, + isIdir, + currentUserRole, +}: { + permissionMatrixKeys: PermissionMatrixKeysType; + isIdir: boolean; + currentUserRole: BCeIDUserRoleType | IDIRUserRoleType; +}) => { + let isAllowed: boolean; + const { permissionMatrixFeatureKey, permissionMatrixFunctionKey } = + permissionMatrixKeys; + const { allowedBCeIDRoles, allowedIDIRRoles } = ( + PERMISSIONS_MATRIX[permissionMatrixFeatureKey] as { + [key: string]: PermissionMatrixConfigObject; + } + )[permissionMatrixFunctionKey]; + if (isIdir) { + isAllowed = Boolean( + currentUserRole && + allowedIDIRRoles?.includes(currentUserRole as IDIRUserRoleType), + ); + } else { + isAllowed = Boolean( + currentUserRole && + allowedBCeIDRoles?.includes(currentUserRole as BCeIDUserRoleType), + ); + } + return isAllowed; +}; diff --git a/frontend/src/common/authentication/auth-walls/BCeIDAuthWall.tsx b/frontend/src/common/authentication/auth-walls/BCeIDAuthWall.tsx index f89c845fd..30a2dbaa3 100644 --- a/frontend/src/common/authentication/auth-walls/BCeIDAuthWall.tsx +++ b/frontend/src/common/authentication/auth-walls/BCeIDAuthWall.tsx @@ -14,26 +14,25 @@ import { IDPS } from "../../types/idp"; import { LoadBCeIDUserContext } from "../LoadBCeIDUserContext"; import { LoadBCeIDUserClaimsByCompany } from "../LoadBCeIDUserClaimsByCompany"; import OnRouteBCContext from "../OnRouteBCContext"; -import { IDIRUserRoleType, UserClaimsType } from "../types"; -import { DoesUserHaveClaim } from "../util"; +import { BCeIDUserRoleType } from "../types"; import { IDIRAuthWall } from "./IDIRAuthWall"; import { setRedirectInSession } from "../../helpers/util"; import { getUserStorage } from "../../apiManager/httpRequestHandler"; +import { + checkPermissionMatrix, + PermissionMatrixKeysType, +} from "../PermissionMatrix"; export const isIDIR = (identityProvider: string) => identityProvider === IDPS.IDIR; export const BCeIDAuthWall = ({ - requiredRole, - allowedIDIRRoles, + permissionMatrixKeys, }: { - requiredRole?: UserClaimsType; /** - * The collection of roles allowed to have access to a page or action. - * IDIR System Admin is assumed to be allowed regardless of it being passed. - * If not provided, only a System Admin will be allowed to access. + * The permission matrix keys. */ - allowedIDIRRoles?: IDIRUserRoleType[]; + permissionMatrixKeys: PermissionMatrixKeysType; }) => { const { isAuthenticated, @@ -42,7 +41,7 @@ export const BCeIDAuthWall = ({ signinSilent, } = useAuth(); - const { userClaims, companyId, isNewBCeIDUser } = + const { userClaims, companyId, isNewBCeIDUser, userDetails } = useContext(OnRouteBCContext); const userIDP = userFromToken?.profile?.identity_provider as string; @@ -112,7 +111,7 @@ export const BCeIDAuthWall = ({ if (isAuthenticated && isEstablishedUser) { if (isIDIR(userIDP)) { if (companyId) { - return ; + return ; } else { return ( ; + } else { return ( ); } - return ; } return <>; }; diff --git a/frontend/src/common/authentication/auth-walls/IDIRAuthWall.tsx b/frontend/src/common/authentication/auth-walls/IDIRAuthWall.tsx index 3c9cbcc83..7096f19bf 100644 --- a/frontend/src/common/authentication/auth-walls/IDIRAuthWall.tsx +++ b/frontend/src/common/authentication/auth-walls/IDIRAuthWall.tsx @@ -5,11 +5,13 @@ import { Navigate, Outlet, useLocation, useNavigate } from "react-router-dom"; import { LoadIDIRUserContext } from "../LoadIDIRUserContext"; import { LoadIDIRUserClaims } from "../LoadIDIRUserClaims"; import OnRouteBCContext from "../OnRouteBCContext"; -import { IDIRUserRoleType } from "../types"; -import { DoesUserHaveRole } from "../util"; import { Loading } from "../../pages/Loading"; import { IDPS } from "../../types/idp"; import { ERROR_ROUTES, HOME } from "../../../routes/constants"; +import { + checkPermissionMatrix, + PermissionMatrixKeysType, +} from "../PermissionMatrix"; const isIDIR = (identityProvider: string) => identityProvider === IDPS.IDIR; @@ -19,14 +21,12 @@ const isIDIR = (identityProvider: string) => identityProvider === IDPS.IDIR; * */ export const IDIRAuthWall = ({ - allowedRoles, + permissionMatrixKeys, }: { /** - * The collection of roles allowed to have access to a page or action. - * IDIR System Admin is assumed to be allowed regardless of it being passed. - * If not provided, only a System Admin will be allowed to access. + * The permission matrix keys. */ - allowedRoles?: IDIRUserRoleType[]; + permissionMatrixKeys: PermissionMatrixKeysType; }) => { const { isAuthenticated, @@ -83,22 +83,23 @@ export const IDIRAuthWall = ({ ); } - const doesUserHaveAccess = DoesUserHaveRole({ - userRole: idirUserDetails?.userRole, - allowedRoles: allowedRoles, + const isAllowed = checkPermissionMatrix({ + permissionMatrixKeys, + isIdir: true, + currentUserRole: idirUserDetails.userRole, }); - - if (doesUserHaveAccess) { + if (isAllowed) { return ; + } else { + // The user does not have access. They should be disallowed. + return ( + + ); } - // The user does not have access. They should be disallowed. - return ( - - ); } else { return ; } diff --git a/frontend/src/common/components/header/Header.tsx b/frontend/src/common/components/header/Header.tsx index 810fbee9e..0219624e4 100644 --- a/frontend/src/common/components/header/Header.tsx +++ b/frontend/src/common/components/header/Header.tsx @@ -60,8 +60,10 @@ const Navbar = ({ Permits } - permissionMatrixFeatureKey="MANAGE_PERMITS" - permissionMatrixFunctionKey="VIEW_PERMITS_SCREEN" + permissionMatrixKeys={{ + permissionMatrixFeatureKey: "MANAGE_PERMITS", + permissionMatrixFunctionKey: "VIEW_PERMITS_SCREEN", + }} /> } - permissionMatrixFeatureKey="MANAGE_VEHICLE_INVENTORY" - permissionMatrixFunctionKey="VIEW_VEHICLE_INVENTORY_SCREEN" + permissionMatrixKeys={{ + permissionMatrixFeatureKey: "MANAGE_VEHICLE_INVENTORY", + permissionMatrixFunctionKey: "VIEW_VEHICLE_INVENTORY_SCREEN", + }} /> Profile } - permissionMatrixFeatureKey="MANAGE_PROFILE" - permissionMatrixFunctionKey="VIEW_COMPANY_INFORMATION" + permissionMatrixKeys={{ + permissionMatrixFeatureKey: "MANAGE_PROFILE", + permissionMatrixFunctionKey: "VIEW_COMPANY_INFORMATION", + }} /> Settings } - permissionMatrixFeatureKey="MANAGE_SETTINGS" - permissionMatrixFunctionKey="VIEW_SPECIAL_AUTHORIZATIONS" + permissionMatrixKeys={{ + permissionMatrixFeatureKey: "MANAGE_SETTINGS", + permissionMatrixFunctionKey: "VIEW_SPECIAL_AUTHORIZATIONS", + }} /> )} @@ -164,14 +172,9 @@ export const Header = () => { {isAuthenticated ? : null} - {shouldDisplayNavBar && ( - - )} + {shouldDisplayNavBar && } {shouldDisplayNavBar && menuOpen ? ( - + ) : null} {filterOpen ? : null} diff --git a/frontend/src/common/components/reusable/RenderIf.tsx b/frontend/src/common/components/reusable/RenderIf.tsx index b0390f570..6493a1b22 100644 --- a/frontend/src/common/components/reusable/RenderIf.tsx +++ b/frontend/src/common/components/reusable/RenderIf.tsx @@ -1,26 +1,24 @@ import { - usePermissionMatrix, - PermissionConfigType, - PermissionMatrixKeysType, - } from "../../authentication/PermissionMatrix"; - + usePermissionMatrix, + PermissionConfigType, +} from "../../authentication/PermissionMatrix"; + +/** + * Renders a component if it meets the criteria specified. + */ +export const RenderIf = ({ + component, + ...permissionConfig +}: { /** - * Renders a component if it meets the criteria specified. + * The component to be rendered. */ - export const RenderIf = ({ - component, - ...permissionConfig - }: { - /** - * The component to be rendered. - */ - component: JSX.Element; - } & PermissionConfigType & - PermissionMatrixKeysType): JSX.Element => { - const shouldRender = usePermissionMatrix(permissionConfig); - if (shouldRender) { - return <>{component}; - } else { - return <>; - } - }; \ No newline at end of file + component: JSX.Element; +} & PermissionConfigType): JSX.Element => { + const shouldRender = usePermissionMatrix(permissionConfig); + if (shouldRender) { + return <>{component}; + } else { + return <>; + } +}; diff --git a/frontend/src/features/manageProfile/components/dashboard/ManageProfilesDashboard.tsx b/frontend/src/features/manageProfile/components/dashboard/ManageProfilesDashboard.tsx index 899fd397f..3e28e8815 100644 --- a/frontend/src/features/manageProfile/components/dashboard/ManageProfilesDashboard.tsx +++ b/frontend/src/features/manageProfile/components/dashboard/ManageProfilesDashboard.tsx @@ -56,7 +56,7 @@ export const ManageProfilesDashboard = React.memo(() => { queryKey: ["companyInfo"], queryFn: getCompanyInfo, placeholderData: keepPreviousData, - refetchInterval: FIVE_MINUTES + refetchInterval: FIVE_MINUTES, }); const navigate = useNavigate(); @@ -86,8 +86,10 @@ export const ManageProfilesDashboard = React.memo(() => { const showCreditAccountTab = usePermissionMatrix({ featureFlag: "CREDIT-ACCOUNT", - permissionMatrixFeatureKey: "MANAGE_SETTINGS", - permissionMatrixFunctionKey: "VIEW_CREDIT_ACCOUNT_TAB", + permissionMatrixKeys: { + permissionMatrixFeatureKey: "MANAGE_SETTINGS", + permissionMatrixFunctionKey: "VIEW_CREDIT_ACCOUNT_TAB", + }, additionalConditionToCheck: () => isCreditAccountHolder, }); diff --git a/frontend/src/features/permits/components/dashboard/PermitLists.tsx b/frontend/src/features/permits/components/dashboard/PermitLists.tsx index 6bee78cff..aef3afc2e 100644 --- a/frontend/src/features/permits/components/dashboard/PermitLists.tsx +++ b/frontend/src/features/permits/components/dashboard/PermitLists.tsx @@ -17,8 +17,10 @@ export const PermitLists = React.memo(() => { }; const tabs = []; const showApplicationsInProgressTab = usePermissionMatrix({ - permissionMatrixFeatureKey: "MANAGE_PERMITS", - permissionMatrixFunctionKey: "VIEW_LIST_OF_APPLICATIONS_IN_PROGRESS", + permissionMatrixKeys: { + permissionMatrixFeatureKey: "MANAGE_PERMITS", + permissionMatrixFunctionKey: "VIEW_LIST_OF_APPLICATIONS_IN_PROGRESS", + }, }); if (showApplicationsInProgressTab) { tabs.push({ @@ -48,8 +50,10 @@ export const PermitLists = React.memo(() => { bannerButton={ } - permissionMatrixFeatureKey="MANAGE_PERMITS" - permissionMatrixFunctionKey="START_APPLICATION" + permissionMatrixKeys={{ + permissionMatrixFeatureKey: "MANAGE_PERMITS", + permissionMatrixFunctionKey: "START_APPLICATION", + }} /> } componentList={tabs} diff --git a/frontend/src/features/settings/components/creditAccount/AccountDetails.tsx b/frontend/src/features/settings/components/creditAccount/AccountDetails.tsx index 652db2125..62939d2de 100644 --- a/frontend/src/features/settings/components/creditAccount/AccountDetails.tsx +++ b/frontend/src/features/settings/components/creditAccount/AccountDetails.tsx @@ -11,9 +11,7 @@ import { import { MouseEvent, useState } from "react"; import { RenderIf } from "../../../../common/components/reusable/RenderIf"; import { getDefaultRequiredVal } from "../../../../common/helpers/util"; -import { - useUpdateCreditAccountStatusMutation, -} from "../../hooks/creditAccount"; +import { useUpdateCreditAccountStatusMutation } from "../../hooks/creditAccount"; import { CREDIT_ACCOUNT_STATUS_TYPE, CREDIT_ACCOUNT_USER_TYPE, @@ -199,8 +197,10 @@ export const AccountDetails = ({ } - permissionMatrixFeatureKey="MANAGE_SETTINGS" - permissionMatrixFunctionKey="UPDATE_CREDIT_ACCOUNT_DETAILS" + permissionMatrixKeys={{ + permissionMatrixFeatureKey: "MANAGE_SETTINGS", + permissionMatrixFunctionKey: "UPDATE_CREDIT_ACCOUNT_DETAILS", + }} additionalConditionToCheck={() => isAccountHolder} /> diff --git a/frontend/src/features/settings/components/creditAccount/UserTable.tsx b/frontend/src/features/settings/components/creditAccount/UserTable.tsx index 3a0466732..492163ed6 100644 --- a/frontend/src/features/settings/components/creditAccount/UserTable.tsx +++ b/frontend/src/features/settings/components/creditAccount/UserTable.tsx @@ -33,7 +33,6 @@ export const UserTable = ({ companyId: number; creditAccountMetadata: CreditAccountMetadata; }) => { - const { data: creditAccountUsers, isError, @@ -48,8 +47,10 @@ export const UserTable = ({ const isAccountHolder = userType === CREDIT_ACCOUNT_USER_TYPE.HOLDER; const canUserUpdateCreditAccount = usePermissionMatrix({ - permissionMatrixFeatureKey: "MANAGE_SETTINGS", - permissionMatrixFunctionKey: "UPDATE_CREDIT_ACCOUNT_DETAILS", + permissionMatrixKeys: { + permissionMatrixFeatureKey: "MANAGE_SETTINGS", + permissionMatrixFunctionKey: "UPDATE_CREDIT_ACCOUNT_DETAILS", + }, additionalConditionToCheck: () => isAccountHolder, }); diff --git a/frontend/src/features/settings/components/dashboard/ManageSettingsDashboard.tsx b/frontend/src/features/settings/components/dashboard/ManageSettingsDashboard.tsx index 4df72972e..9289b3bfa 100644 --- a/frontend/src/features/settings/components/dashboard/ManageSettingsDashboard.tsx +++ b/frontend/src/features/settings/components/dashboard/ManageSettingsDashboard.tsx @@ -40,8 +40,10 @@ export const ManageSettingsDashboard = React.memo(() => { const showCreditAccountTab = usePermissionMatrix({ featureFlag: "CREDIT-ACCOUNT", - permissionMatrixFeatureKey: "MANAGE_SETTINGS", + permissionMatrixKeys: { + permissionMatrixFeatureKey: "MANAGE_SETTINGS", permissionMatrixFunctionKey: "VIEW_CREDIT_ACCOUNT_TAB", + }, additionalConditionToCheck: () => // Show the tab for all users if the user is Boolean(creditAccountMetadata) || isFinanceUser, diff --git a/frontend/src/features/settings/pages/CreditAccountMetadataComponent.tsx b/frontend/src/features/settings/pages/CreditAccountMetadataComponent.tsx index 6686975aa..f5fab013e 100644 --- a/frontend/src/features/settings/pages/CreditAccountMetadataComponent.tsx +++ b/frontend/src/features/settings/pages/CreditAccountMetadataComponent.tsx @@ -23,8 +23,10 @@ export const CreditAccountMetadataComponent = ({ return ( } - permissionMatrixFeatureKey="MANAGE_SETTINGS" - permissionMatrixFunctionKey="UPDATE_CREDIT_ACCOUNT_DETAILS" + permissionMatrixKeys={{ + permissionMatrixFeatureKey: "MANAGE_SETTINGS", + permissionMatrixFunctionKey: "UPDATE_CREDIT_ACCOUNT_DETAILS", + }} /> ); } diff --git a/frontend/src/features/settings/pages/ViewCreditAccount.tsx b/frontend/src/features/settings/pages/ViewCreditAccount.tsx index 2cb38660f..f2d036ba3 100644 --- a/frontend/src/features/settings/pages/ViewCreditAccount.tsx +++ b/frontend/src/features/settings/pages/ViewCreditAccount.tsx @@ -56,8 +56,10 @@ export const ViewCreditAccount = ({ creditAccountId={creditAccountId} /> } - permissionMatrixFeatureKey="MANAGE_SETTINGS" - permissionMatrixFunctionKey="UPDATE_CREDIT_ACCOUNT_DETAILS" + permissionMatrixKeys={{ + permissionMatrixFeatureKey: "MANAGE_SETTINGS", + permissionMatrixFunctionKey: "UPDATE_CREDIT_ACCOUNT_DETAILS", + }} additionalConditionToCheck={() => isAccountHolder} /> } - permissionMatrixFeatureKey="MANAGE_SETTINGS" - permissionMatrixFunctionKey="UPDATE_CREDIT_ACCOUNT_DETAILS" + permissionMatrixKeys={{ + permissionMatrixFeatureKey: "MANAGE_SETTINGS", + permissionMatrixFunctionKey: "UPDATE_CREDIT_ACCOUNT_DETAILS", + }} additionalConditionToCheck={() => creditAccount?.creditAccountStatusType !== CREDIT_ACCOUNT_STATUS_TYPE.CLOSED && isAccountHolder @@ -81,8 +85,10 @@ export const ViewCreditAccount = ({ creditAccountMetadata={{ creditAccountId, userType }} /> } - permissionMatrixFeatureKey="MANAGE_SETTINGS" - permissionMatrixFunctionKey="VIEW_CREDIT_ACCOUNT_DETAILS" + permissionMatrixKeys={{ + permissionMatrixFeatureKey: "MANAGE_SETTINGS", + permissionMatrixFunctionKey: "VIEW_CREDIT_ACCOUNT_DETAILS", + }} /> } - permissionMatrixFeatureKey="MANAGE_SETTINGS" - permissionMatrixFunctionKey="VIEW_CREDIT_ACCOUNT_DETAILS" + permissionMatrixKeys={{ + permissionMatrixFeatureKey: "MANAGE_SETTINGS", + permissionMatrixFunctionKey: "VIEW_CREDIT_ACCOUNT_DETAILS", + }} additionalConditionToCheck={() => { // In case of BCeID user, CV - CA is only allowed // to see the account details if the status is active. diff --git a/frontend/src/routes/Routes.tsx b/frontend/src/routes/Routes.tsx index 2b8bef88e..8f8efd900 100644 --- a/frontend/src/routes/Routes.tsx +++ b/frontend/src/routes/Routes.tsx @@ -3,7 +3,6 @@ import { Route, Routes } from "react-router-dom"; import { BCeIDAuthWall } from "../common/authentication/auth-walls/BCeIDAuthWall"; import { IDIRAuthWall } from "../common/authentication/auth-walls/IDIRAuthWall"; import { NewBCeIDAuthWall } from "../common/authentication/auth-walls/NewBCeIDAuthWall"; -import { IDIR_USER_ROLE, CLAIMS } from "../common/authentication/types"; import { UniversalUnauthorized } from "../common/pages/UniversalUnauthorized"; import { UniversalUnexpected } from "../common/pages/UniversalUnexpected"; import { WelcomePage } from "../features/homePage/welcome/WelcomePage"; @@ -90,13 +89,10 @@ export const AppRoutes = () => { } > @@ -111,16 +107,46 @@ export const AppRoutes = () => { } + element={ + + } > } /> + + + + } + > } /> + + + } + > } @@ -131,11 +157,10 @@ export const AppRoutes = () => { } > @@ -151,8 +176,10 @@ export const AppRoutes = () => { } > @@ -188,11 +215,10 @@ export const AppRoutes = () => { } > @@ -205,11 +231,10 @@ export const AppRoutes = () => { } > @@ -217,6 +242,17 @@ export const AppRoutes = () => { path={routes.PROFILE_ROUTES.ADD_USER} element={} /> + + + } + > } @@ -226,8 +262,10 @@ export const AppRoutes = () => { } > @@ -244,8 +282,10 @@ export const AppRoutes = () => { } > @@ -258,13 +298,10 @@ export const AppRoutes = () => { } > @@ -294,8 +331,10 @@ export const AppRoutes = () => { } > @@ -305,7 +344,16 @@ export const AppRoutes = () => { /> - }> + + } + > } @@ -315,15 +363,10 @@ export const AppRoutes = () => { } > From 9c9ee8a19fa6f70be415d39ce048482ead0cc5c2 Mon Sep 17 00:00:00 2001 From: Krishnan Subramanian <84348052+krishnan-aot@users.noreply.github.com> Date: Wed, 4 Sep 2024 15:48:53 -0700 Subject: [PATCH 14/63] Permission Matrix updates - Credit Account (#1584) --- .../common/authentication/PermissionMatrix.ts | 115 +++++++++++++++--- .../components/IDIRCompanySearchResults.tsx | 3 - .../dashboard/ManageProfilesDashboard.tsx | 2 +- .../creditAccount/AccountDetails.tsx | 6 +- .../components/creditAccount/UserTable.tsx | 3 +- .../dashboard/ManageSettingsDashboard.tsx | 34 ++++-- .../pages/CreditAccountMetadataComponent.tsx | 5 +- .../settings/pages/ViewCreditAccount.tsx | 14 ++- 8 files changed, 147 insertions(+), 35 deletions(-) diff --git a/frontend/src/common/authentication/PermissionMatrix.ts b/frontend/src/common/authentication/PermissionMatrix.ts index 7d31b4265..607be52d4 100644 --- a/frontend/src/common/authentication/PermissionMatrix.ts +++ b/frontend/src/common/authentication/PermissionMatrix.ts @@ -207,6 +207,29 @@ const MANAGE_PROFILE = { allowedBCeIDRoles: [CA, PA], allowedIDIRRoles: [], }, + /** + * Credit Account Tab + */ + /** + * View Credit Account tab - Account holder + * Comment: Account number, status + */ + VIEW_CREDIT_ACCOUNT_TAB_ACCOUNT_HOLDER: { + allowedBCeIDRoles: [CA], + }, + /** + * View Credit Account users - Account holder + */ + VIEW_CREDIT_ACCOUNT_USERS_ACCOUNT_HOLDER: { + allowedBCeIDRoles: [CA], + }, + /** + * View Credit Account details - Account holder + * Comment: Credit Limit/Current Balance/Available Credit + */ + VIEW_CREDIT_ACCOUNT_DETAILS_ACCOUNT_HOLDER: { + allowedBCeIDRoles: [CA], + }, } as const; const MANAGE_SETTINGS = { @@ -220,22 +243,85 @@ const MANAGE_SETTINGS = { REMOVE_LCV_FLAG: { allowedIDIRRoles: [HQA] }, ADD_AN_LOA: { allowedIDIRRoles: [SA, HQA] }, EDIT_AN_LOA: { allowedIDIRRoles: [SA, HQA] }, - VIEW_LOA: { allowedIDIRRoles: [PC, SA, CTPO, EO, HQA] }, + VIEW_LOA: { allowedIDIRRoles: ALL_IDIR_ROLES }, REMOVE_LOA: { allowedIDIRRoles: [SA, HQA] }, /** * Credit Account Tab */ - VIEW_CREDIT_ACCOUNT_TAB: { - allowedBCeIDRoles: [CA], - allowedIDIRRoles: [PC, SA, FIN, CTPO], - featureFlag: "CREDIT-ACCOUNT", + /** + * View Credit Account tab - Account Holder + * Comment: Account number, status + */ + VIEW_CREDIT_ACCOUNT_TAB_ACCOUNT_HOLDER: { + allowedIDIRRoles: [PC, SA, FIN, CTPO, HQA], }, - VIEW_CREDIT_ACCOUNT_DETAILS: { - allowedBCeIDRoles: [CA], - allowedIDIRRoles: [SA, FIN], + /** + * View Credit Account Users - Account Holder + */ + VIEW_CREDIT_ACCOUNT_USERS_ACCOUNT_HOLDER: { + allowedIDIRRoles: [PC, SA, FIN, CTPO, HQA], }, - UPDATE_CREDIT_ACCOUNT_DETAILS: { allowedIDIRRoles: [FIN] }, + /** + * Manage Credit Account Users - Account Holder + * Comment: Add/remove users + */ + MANAGE_CREDIT_ACCOUNT_USERS_ACCOUNT_HOLDER: { allowedIDIRRoles: [FIN] }, + /** + * View Credit Account Details - Account Holder + * Comment: Credit Limit/Current Balance/Available Credit + */ + VIEW_CREDIT_ACCOUNT_DETAILS_ACCOUNT_HOLDER: { + allowedIDIRRoles: [SA, FIN, HQA], + }, + /** + * Perform Credit Account Detail actions - Account Holder + * + * Comment: Hold, Close, Remove Hold, Reopen Credit Account, + * update credit account - available actions vary depending on + * account state (see spec/hifi for details) + */ + PERFORM_CREDIT_ACCOUNT_DETAIL_ACTIONS_ACCOUNT_HOLDER: { + allowedIDIRRoles: [FIN], + }, + /** + * View Hold/Close History - Account Holder + */ + VIEW_HOLD_OR_CLOSE_HISTORY_ACCOUNT_HOLDER: { allowedIDIRRoles: [FIN] }, + + /** + * View Credit Account tab - Account User + * Comment: Account number, status + */ + VIEW_CREDIT_ACCOUNT_TAB_ACCOUNT_USER: { + allowedIDIRRoles: [PC, SA, FIN, CTPO, HQA], + }, + /** + * View Credit Account Users - Account User + */ + VIEW_CREDIT_ACCOUNT_USERS_ACCOUNT_USER: { + allowedIDIRRoles: [PC, SA, FIN, CTPO, HQA], + }, + /** + * View Credit Account Details - Account User + * Comment: Credit Limit/Current Balance/Available Credit + */ + VIEW_CREDIT_ACCOUNT_DETAILS_ACCOUNT_USER: { + allowedIDIRRoles: [SA, FIN, HQA], + }, + /** + * View Credit Account tab - Non-Holder/user + * Comment: Info box + * + * Todo: ORV2-2771 Implement info box. + */ + VIEW_CREDIT_ACCOUNT_TAB_NON_HOLDER_OR_USER: { + allowedIDIRRoles: [PC, SA, FIN, CTPO, HQA], + }, + /** + * Add Credit Account - Non-Holder/user + */ + ADD_CREDIT_ACCOUNT_NON_HOLDER_OR_USER: { allowedIDIRRoles: [FIN] }, /** * Suspend tab @@ -333,10 +419,6 @@ const MISCELLANEOUS = { allowedBCeIDRoles: [CA, PA], allowedIDIRRoles: [PC, SA, CTPO], }, - // Add this in permissions matrix document. - STAFF_ACT_AS_COMPANY: { - allowedIDIRRoles: [PC, SA, FIN, CTPO, HQA], - }, /** * The following are already controlled by API. * So, frontend needs no implementation for this. @@ -346,6 +428,11 @@ const MISCELLANEOUS = { * - sees applications from whole company * - sees IDIR-created applications */ + + // Add this in permissions matrix document. + STAFF_ACT_AS_COMPANY: { + allowedIDIRRoles: [PC, SA, FIN, CTPO, HQA], + }, } as const; /** @@ -355,7 +442,7 @@ const MISCELLANEOUS = { * @description All the keys and comments are identical to the feature keys used * in the permissions matrix document so that cross-verifying is easy. * - * Note that this is a general structure for as specified in the document. + * Note that this is a general structure for permissions as specified in the document. * Individual features may need custom checks based on data or API calls * and they are not in scope for this implementation. */ diff --git a/frontend/src/features/idir/search/components/IDIRCompanySearchResults.tsx b/frontend/src/features/idir/search/components/IDIRCompanySearchResults.tsx index 9f8405aa8..68a0b4252 100644 --- a/frontend/src/features/idir/search/components/IDIRCompanySearchResults.tsx +++ b/frontend/src/features/idir/search/components/IDIRCompanySearchResults.tsx @@ -124,9 +124,6 @@ export const IDIRCompanySearchResults = memo( pageIndex: 0, pageSize: 10, }); - - // TODO: if data is [] AND current_user is PPC_ADMIN then (eventually) - // display the UX to allow the creation of a new Company Profile const searchResultsQuery = useQuery({ queryKey: [ "search-entity", diff --git a/frontend/src/features/manageProfile/components/dashboard/ManageProfilesDashboard.tsx b/frontend/src/features/manageProfile/components/dashboard/ManageProfilesDashboard.tsx index 3e28e8815..a5c449317 100644 --- a/frontend/src/features/manageProfile/components/dashboard/ManageProfilesDashboard.tsx +++ b/frontend/src/features/manageProfile/components/dashboard/ManageProfilesDashboard.tsx @@ -88,7 +88,7 @@ export const ManageProfilesDashboard = React.memo(() => { featureFlag: "CREDIT-ACCOUNT", permissionMatrixKeys: { permissionMatrixFeatureKey: "MANAGE_SETTINGS", - permissionMatrixFunctionKey: "VIEW_CREDIT_ACCOUNT_TAB", + permissionMatrixFunctionKey: "VIEW_CREDIT_ACCOUNT_TAB_ACCOUNT_HOLDER", }, additionalConditionToCheck: () => isCreditAccountHolder, }); diff --git a/frontend/src/features/settings/components/creditAccount/AccountDetails.tsx b/frontend/src/features/settings/components/creditAccount/AccountDetails.tsx index 62939d2de..012f54f6b 100644 --- a/frontend/src/features/settings/components/creditAccount/AccountDetails.tsx +++ b/frontend/src/features/settings/components/creditAccount/AccountDetails.tsx @@ -25,6 +25,9 @@ import { CloseCreditAccountModal } from "./CloseCreditAccountModal"; import { HoldCreditAccountModal } from "./HoldCreditAccountModal"; import { useQueryClient } from "@tanstack/react-query"; +/** + * Component that displays credit limit, available balance etc. + */ export const AccountDetails = ({ companyId, creditAccountMetadata: { creditAccountId, userType }, @@ -199,7 +202,8 @@ export const AccountDetails = ({ } permissionMatrixKeys={{ permissionMatrixFeatureKey: "MANAGE_SETTINGS", - permissionMatrixFunctionKey: "UPDATE_CREDIT_ACCOUNT_DETAILS", + permissionMatrixFunctionKey: + "PERFORM_CREDIT_ACCOUNT_DETAIL_ACTIONS_ACCOUNT_HOLDER", }} additionalConditionToCheck={() => isAccountHolder} /> diff --git a/frontend/src/features/settings/components/creditAccount/UserTable.tsx b/frontend/src/features/settings/components/creditAccount/UserTable.tsx index 492163ed6..8ac37abd8 100644 --- a/frontend/src/features/settings/components/creditAccount/UserTable.tsx +++ b/frontend/src/features/settings/components/creditAccount/UserTable.tsx @@ -49,7 +49,8 @@ export const UserTable = ({ const canUserUpdateCreditAccount = usePermissionMatrix({ permissionMatrixKeys: { permissionMatrixFeatureKey: "MANAGE_SETTINGS", - permissionMatrixFunctionKey: "UPDATE_CREDIT_ACCOUNT_DETAILS", + permissionMatrixFunctionKey: + "PERFORM_CREDIT_ACCOUNT_DETAIL_ACTIONS_ACCOUNT_HOLDER", }, additionalConditionToCheck: () => isAccountHolder, }); diff --git a/frontend/src/features/settings/components/dashboard/ManageSettingsDashboard.tsx b/frontend/src/features/settings/components/dashboard/ManageSettingsDashboard.tsx index 9289b3bfa..6612c3e58 100644 --- a/frontend/src/features/settings/components/dashboard/ManageSettingsDashboard.tsx +++ b/frontend/src/features/settings/components/dashboard/ManageSettingsDashboard.tsx @@ -15,18 +15,31 @@ import { CreditAccountMetadataComponent } from "../../pages/CreditAccountMetadat import { usePermissionMatrix } from "../../../../common/authentication/PermissionMatrix"; import { useGetCreditAccountMetadataQuery } from "../../hooks/creditAccount"; import { IDIR_USER_ROLE } from "../../../../common/authentication/types"; +import { CREDIT_ACCOUNT_USER_TYPE } from "../../types/creditAccount"; export const ManageSettingsDashboard = React.memo(() => { - const { - userClaims, - companyId, - idirUserDetails, - } = useContext(OnRouteBCContext); + const { userClaims, companyId, idirUserDetails } = + useContext(OnRouteBCContext); const { data: featureFlags } = useFeatureFlagsQuery(); - const { data: creditAccountMetadata } = useGetCreditAccountMetadataQuery( - companyId as number, - ); + const { data: creditAccountMetadata, isPending } = + useGetCreditAccountMetadataQuery(companyId as number); + + const isCreditAccountHolder = + creditAccountMetadata?.userType === CREDIT_ACCOUNT_USER_TYPE.HOLDER; + + /** + * @returns The permission matrix function key. + */ + const getPermissionMatrixFunctionKey = () => { + if (!isPending && !creditAccountMetadata) + return "ADD_CREDIT_ACCOUNT_NON_HOLDER_OR_USER"; + if (isCreditAccountHolder) { + return "VIEW_CREDIT_ACCOUNT_TAB_ACCOUNT_HOLDER"; + } else { + return "VIEW_CREDIT_ACCOUNT_TAB_ACCOUNT_USER"; + } + }; const isStaffActingAsCompany = Boolean(idirUserDetails?.userRole); const isFinanceUser = idirUserDetails?.userRole === IDIR_USER_ROLE.FINANCE; @@ -42,10 +55,11 @@ export const ManageSettingsDashboard = React.memo(() => { featureFlag: "CREDIT-ACCOUNT", permissionMatrixKeys: { permissionMatrixFeatureKey: "MANAGE_SETTINGS", - permissionMatrixFunctionKey: "VIEW_CREDIT_ACCOUNT_TAB", + permissionMatrixFunctionKey: getPermissionMatrixFunctionKey(), }, additionalConditionToCheck: () => - // Show the tab for all users if the user is + // Show the tab if there is a credit account or if the user is a finance user. + // Todo: ORV2-2771 Display info box if there is no credit account. Boolean(creditAccountMetadata) || isFinanceUser, }); diff --git a/frontend/src/features/settings/pages/CreditAccountMetadataComponent.tsx b/frontend/src/features/settings/pages/CreditAccountMetadataComponent.tsx index f5fab013e..d966bf981 100644 --- a/frontend/src/features/settings/pages/CreditAccountMetadataComponent.tsx +++ b/frontend/src/features/settings/pages/CreditAccountMetadataComponent.tsx @@ -20,12 +20,15 @@ export const CreditAccountMetadataComponent = ({ /> ); } else { + // Todo: ORV2-2771 Display info box for non-finance staff users who + // do not have permission to create a new credit account. return ( } permissionMatrixKeys={{ permissionMatrixFeatureKey: "MANAGE_SETTINGS", - permissionMatrixFunctionKey: "UPDATE_CREDIT_ACCOUNT_DETAILS", + permissionMatrixFunctionKey: + "ADD_CREDIT_ACCOUNT_NON_HOLDER_OR_USER", }} /> ); diff --git a/frontend/src/features/settings/pages/ViewCreditAccount.tsx b/frontend/src/features/settings/pages/ViewCreditAccount.tsx index f2d036ba3..cb66f22d9 100644 --- a/frontend/src/features/settings/pages/ViewCreditAccount.tsx +++ b/frontend/src/features/settings/pages/ViewCreditAccount.tsx @@ -58,7 +58,8 @@ export const ViewCreditAccount = ({ } permissionMatrixKeys={{ permissionMatrixFeatureKey: "MANAGE_SETTINGS", - permissionMatrixFunctionKey: "UPDATE_CREDIT_ACCOUNT_DETAILS", + permissionMatrixFunctionKey: + "VIEW_HOLD_OR_CLOSE_HISTORY_ACCOUNT_HOLDER", }} additionalConditionToCheck={() => isAccountHolder} /> @@ -71,7 +72,8 @@ export const ViewCreditAccount = ({ } permissionMatrixKeys={{ permissionMatrixFeatureKey: "MANAGE_SETTINGS", - permissionMatrixFunctionKey: "UPDATE_CREDIT_ACCOUNT_DETAILS", + permissionMatrixFunctionKey: + "MANAGE_CREDIT_ACCOUNT_USERS_ACCOUNT_HOLDER", }} additionalConditionToCheck={() => creditAccount?.creditAccountStatusType !== @@ -87,7 +89,9 @@ export const ViewCreditAccount = ({ } permissionMatrixKeys={{ permissionMatrixFeatureKey: "MANAGE_SETTINGS", - permissionMatrixFunctionKey: "VIEW_CREDIT_ACCOUNT_DETAILS", + permissionMatrixFunctionKey: isAccountHolder + ? "VIEW_CREDIT_ACCOUNT_USERS_ACCOUNT_HOLDER" + : "VIEW_CREDIT_ACCOUNT_USERS_ACCOUNT_USER", }} /> @@ -101,7 +105,9 @@ export const ViewCreditAccount = ({ } permissionMatrixKeys={{ permissionMatrixFeatureKey: "MANAGE_SETTINGS", - permissionMatrixFunctionKey: "VIEW_CREDIT_ACCOUNT_DETAILS", + permissionMatrixFunctionKey: isAccountHolder + ? "VIEW_CREDIT_ACCOUNT_DETAILS_ACCOUNT_HOLDER" + : "VIEW_CREDIT_ACCOUNT_DETAILS_ACCOUNT_USER", }} additionalConditionToCheck={() => { // In case of BCeID user, CV - CA is only allowed From 0f08c8d8159744dd3251a1a5b3984bb9b8954eba Mon Sep 17 00:00:00 2001 From: bcgov-brwang <87880048+bcgov-brwang@users.noreply.github.com> Date: Wed, 4 Sep 2024 16:48:28 -0700 Subject: [PATCH 15/63] ORV2-2685: added document on the way page when pdf file unavailable (#1559) --- .../src/common/pages/DocumentUnavailable.tsx | 17 +++++++++++++++++ .../components/IDIRPermitSearchResults.tsx | 6 +++++- .../components/IDIRPermitSearchRowActions.tsx | 2 +- .../table/PermitSearchResultColumnDef.tsx | 9 +++++---- .../components/permit-list/BasePermitList.tsx | 3 ++- .../components/permit-list/Columns.tsx | 11 +++++------ .../permit-list/PermitRowOptions.tsx | 4 +++- .../permits/helpers/permitPDFHelper.ts | 19 +++++++++++++++++-- frontend/src/routes/Routes.tsx | 7 ++++++- frontend/src/routes/constants.ts | 1 + 10 files changed, 62 insertions(+), 17 deletions(-) create mode 100644 frontend/src/common/pages/DocumentUnavailable.tsx diff --git a/frontend/src/common/pages/DocumentUnavailable.tsx b/frontend/src/common/pages/DocumentUnavailable.tsx new file mode 100644 index 000000000..9bde63cb3 --- /dev/null +++ b/frontend/src/common/pages/DocumentUnavailable.tsx @@ -0,0 +1,17 @@ +import "./UniversalUnexpected.scss"; +import { ErrorPage } from "../components/error/ErrorPage"; + +export const DocumentUnavailable = () => { + return ( + + Your document is being created. +
+ Please check again later. + + } + /> + ); +}; diff --git a/frontend/src/features/idir/search/components/IDIRPermitSearchResults.tsx b/frontend/src/features/idir/search/components/IDIRPermitSearchResults.tsx index f5177e612..a3a23cc0f 100644 --- a/frontend/src/features/idir/search/components/IDIRPermitSearchResults.tsx +++ b/frontend/src/features/idir/search/components/IDIRPermitSearchResults.tsx @@ -25,6 +25,8 @@ import { defaultTableStateOptions, } from "../../../../common/helpers/tableHelper"; import "./IDIRPermitSearchResults.scss"; +import { ERROR_ROUTES } from "../../../../routes/constants"; +import { useNavigate } from "react-router-dom"; /** * Function to decide whether to show row actions icon or not. @@ -93,9 +95,11 @@ export const IDIRPermitSearchResults = memo( const { data, isPending, isError } = searchResultsQuery; + const navigate = useNavigate(); + // Column definitions for the table const columns = useMemo[]>( - () => PermitSearchResultColumnDef, + () => PermitSearchResultColumnDef(() => navigate(ERROR_ROUTES.DOCUMENT_UNAVAILABLE)), [], ); diff --git a/frontend/src/features/idir/search/components/IDIRPermitSearchRowActions.tsx b/frontend/src/features/idir/search/components/IDIRPermitSearchRowActions.tsx index 4bc427d84..fb0203822 100644 --- a/frontend/src/features/idir/search/components/IDIRPermitSearchRowActions.tsx +++ b/frontend/src/features/idir/search/components/IDIRPermitSearchRowActions.tsx @@ -129,7 +129,7 @@ export const IDIRPermitSearchRowActions = ({ if (selectedOption === PERMIT_ACTION_TYPES.RESEND) { setOpenResendDialog(() => true); } else if (selectedOption === PERMIT_ACTION_TYPES.VIEW_RECEIPT) { - viewReceiptPdf(permitId, companyId); + viewReceiptPdf(permitId, () => navigate(routes.ERROR_ROUTES.DOCUMENT_UNAVAILABLE), companyId ); } else if (selectedOption === PERMIT_ACTION_TYPES.VOID_REVOKE) { navigate(`${routes.PERMITS_ROUTES.VOID(companyId, permitId)}`); } else if (selectedOption === PERMIT_ACTION_TYPES.AMEND) { diff --git a/frontend/src/features/idir/search/table/PermitSearchResultColumnDef.tsx b/frontend/src/features/idir/search/table/PermitSearchResultColumnDef.tsx index abae86d6c..0358d69e0 100644 --- a/frontend/src/features/idir/search/table/PermitSearchResultColumnDef.tsx +++ b/frontend/src/features/idir/search/table/PermitSearchResultColumnDef.tsx @@ -13,7 +13,7 @@ import { formatCellValuetoDatetime, } from "../../../../common/helpers/tableHelper"; -export const PermitSearchResultColumnDef: MRT_ColumnDef[] = [ +export const PermitSearchResultColumnDef = (onDocumentUnavailable: () => void): MRT_ColumnDef[] => [ { accessorKey: "permitNumber", header: "Permit #", @@ -26,9 +26,10 @@ export const PermitSearchResultColumnDef: MRT_ColumnDef[] = [ return ( <> - viewPermitPdf(permitId.toString(), companyId.toString()) - } + onClick={() =>{ + viewPermitPdf(permitId.toString(), () => onDocumentUnavailable(), companyId.toString()); + } + } > {props.cell.getValue()} diff --git a/frontend/src/features/permits/components/permit-list/BasePermitList.tsx b/frontend/src/features/permits/components/permit-list/BasePermitList.tsx index 6c1117126..340b8bd33 100644 --- a/frontend/src/features/permits/components/permit-list/BasePermitList.tsx +++ b/frontend/src/features/permits/components/permit-list/BasePermitList.tsx @@ -90,7 +90,7 @@ export const BasePermitList = ({ const table = useMaterialReactTable({ ...defaultTableOptions, - columns: PermitsColumnDefinition, + columns: PermitsColumnDefinition(() => navigate(ERROR_ROUTES.DOCUMENT_UNAVAILABLE)), data: data?.items ?? [], enableRowSelection: false, initialState: { @@ -158,6 +158,7 @@ export const BasePermitList = ({ {navigate(ERROR_ROUTES.DOCUMENT_UNAVAILABLE)}} /> )} diff --git a/frontend/src/features/permits/components/permit-list/Columns.tsx b/frontend/src/features/permits/components/permit-list/Columns.tsx index 93a3aee41..cc9cd720a 100644 --- a/frontend/src/features/permits/components/permit-list/Columns.tsx +++ b/frontend/src/features/permits/components/permit-list/Columns.tsx @@ -12,7 +12,7 @@ import { Box, Tooltip } from "@mui/material"; /** * The column definition for Permits. */ -export const PermitsColumnDefinition: MRT_ColumnDef[] = [ +export const PermitsColumnDefinition = (onDocumentUnavailable: () => void): MRT_ColumnDef[] => [ { accessorKey: "permitNumber", id: "permitNumber", @@ -24,7 +24,9 @@ export const PermitsColumnDefinition: MRT_ColumnDef[] = [ return ( <> viewPermitPdf(props.row.original.permitId)} + onClick={() => viewPermitPdf( + props.row.original.permitId, + () => onDocumentUnavailable())} > {props.cell.getValue()} @@ -85,7 +87,4 @@ export const PermitsColumnDefinition: MRT_ColumnDef[] = [ header: "Applicant", enableSorting: true, }, -]; - -export const PermitsNotFoundColumnDefinition: MRT_ColumnDef[] = - PermitsColumnDefinition; +]; \ No newline at end of file diff --git a/frontend/src/features/permits/components/permit-list/PermitRowOptions.tsx b/frontend/src/features/permits/components/permit-list/PermitRowOptions.tsx index 59ba86629..ece4437dc 100644 --- a/frontend/src/features/permits/components/permit-list/PermitRowOptions.tsx +++ b/frontend/src/features/permits/components/permit-list/PermitRowOptions.tsx @@ -33,9 +33,11 @@ const getOptions = (isExpired: boolean) => { export const PermitRowOptions = ({ isExpired, permitId, + onDocumentUnavailable, }: { isExpired: boolean; permitId: string; + onDocumentUnavailable: () => void; }) => { /** * Action handler upon a select event. @@ -43,7 +45,7 @@ export const PermitRowOptions = ({ */ const onSelectOptionCallback = (selectedOption: string) => { if (selectedOption === PERMIT_ACTION_OPTION_TYPES.VIEW_RECEIPT) { - viewReceiptPdf(permitId); + viewReceiptPdf(permitId, () => onDocumentUnavailable()); } }; diff --git a/frontend/src/features/permits/helpers/permitPDFHelper.ts b/frontend/src/features/permits/helpers/permitPDFHelper.ts index 3d71f5918..c20dc06e8 100644 --- a/frontend/src/features/permits/helpers/permitPDFHelper.ts +++ b/frontend/src/features/permits/helpers/permitPDFHelper.ts @@ -19,7 +19,11 @@ export const openBlobInNewTab = (blob: Blob) => { * Opens the receipt pdf in a new tab. * @param permitId The permit id. */ -export const viewReceiptPdf = async (permitId: string, companyId?: string) => { +export const viewReceiptPdf = async ( + permitId: string, + onDocumentUnavailable?: () => void, + companyId?: string, +) => { if (permitId) { try { const { blobObj: blobObjWithoutType } = await downloadReceiptPdf( @@ -29,6 +33,9 @@ export const viewReceiptPdf = async (permitId: string, companyId?: string) => { openBlobInNewTab(blobObjWithoutType); } catch (err) { console.error(err); + if (onDocumentUnavailable) { + onDocumentUnavailable(); + } } } }; @@ -37,7 +44,12 @@ export const viewReceiptPdf = async (permitId: string, companyId?: string) => { * Opens the permit PDF in a new tab. * @param permitId The permitId of the permit. */ -export const viewPermitPdf = async (permitId: string, companyId?: string) => { +export const viewPermitPdf = async ( + permitId: string, + onDocumentUnavailable?: () => void, + companyId?: string, + +) => { try { const { blobObj: blobObjWithoutType } = await downloadPermitApplicationPdf( permitId, @@ -46,5 +58,8 @@ export const viewPermitPdf = async (permitId: string, companyId?: string) => { openBlobInNewTab(blobObjWithoutType); } catch (err) { console.error(err); + if (onDocumentUnavailable) { + onDocumentUnavailable(); + } } }; diff --git a/frontend/src/routes/Routes.tsx b/frontend/src/routes/Routes.tsx index 8f8efd900..a1eca01eb 100644 --- a/frontend/src/routes/Routes.tsx +++ b/frontend/src/routes/Routes.tsx @@ -32,6 +32,7 @@ import { ManageSettings } from "../features/settings/ManageSettings"; import { IssuanceErrorPage } from "../common/pages/IssuanceErrorPage"; import IDPRedirect from "../common/components/idpredirect/IDPRedirect"; import { ShoppingCartDashboard } from "../features/permits/ShoppingCartDashboard"; +import { DocumentUnavailable } from "../common/pages/DocumentUnavailable"; export const AppRoutes = () => { return ( @@ -55,8 +56,12 @@ export const AppRoutes = () => { path={routes.ERROR_ROUTES.ISSUANCE} element={} /> + } + /> } /> - + {/* Wizard Routes */} {/* Wizard Routes only require that a user diff --git a/frontend/src/routes/constants.ts b/frontend/src/routes/constants.ts index 4dbe8b609..4a914eba4 100644 --- a/frontend/src/routes/constants.ts +++ b/frontend/src/routes/constants.ts @@ -34,6 +34,7 @@ export const ERROR_ROUTES = { UNAUTHORIZED: "/unauthorized", UNEXPECTED: "/unexpected-error", ISSUANCE: "/issuance-error", + DOCUMENT_UNAVAILABLE: "/document-unavailable", }; // Manage Vehicles From 96670fa22436a7534bfdb57168d63975a5a56d0c Mon Sep 17 00:00:00 2001 From: bcgov-brwang Date: Thu, 5 Sep 2024 08:58:23 -0700 Subject: [PATCH 16/63] ORV2-2732: updated dops test cases ORV2-2732: updated dops test cases --- loadtests/dops/orbc_load_test_plan_dops.jmx | 201 +------------------- 1 file changed, 8 insertions(+), 193 deletions(-) diff --git a/loadtests/dops/orbc_load_test_plan_dops.jmx b/loadtests/dops/orbc_load_test_plan_dops.jmx index bb210a0f5..ac4bb85a7 100644 --- a/loadtests/dops/orbc_load_test_plan_dops.jmx +++ b/loadtests/dops/orbc_load_test_plan_dops.jmx @@ -1,5 +1,5 @@ - + @@ -107,7 +107,7 @@
BEARER_TOKEN - eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJXNk5hakRyZ2VUR2tYR0dtb28tRWJFSkJXQTM4OGEyYjdRN0p4eThSRjdzIn0.eyJleHAiOjE3MjQ0MzM1NjksImlhdCI6MTcyNDQzMzI2OSwiYXV0aF90aW1lIjoxNzI0NDMyMTk5LCJqdGkiOiJiZWM0NDk3Yy05OTdmLTQ4NTktYjhjZS0wYmU3ZjQzMWRlY2UiLCJpc3MiOiJodHRwczovL3Rlc3QubG9naW5wcm94eS5nb3YuYmMuY2EvYXV0aC9yZWFsbXMvc3RhbmRhcmQiLCJhdWQiOiJvbi1yb3V0ZS1iYy1kaXJlY3QtNDU5OCIsInN1YiI6IjMzMjRiNDFjNGI5OTQzZTg5MjdmYzMzODE2OThiZjYwQGlkaXIiLCJ0eXAiOiJCZWFyZXIiLCJhenAiOiJvbi1yb3V0ZS1iYy1kaXJlY3QtNDU5OCIsInNlc3Npb25fc3RhdGUiOiJjMDcyYWIwMi0wMzBiLTQ2ZTYtYjUyZC0zZjdmYzEwZjZmOTAiLCJzY29wZSI6Im9wZW5pZCBwcm9maWxlIGVtYWlsIGJjZWlkYm90aCBpZGlyIiwic2lkIjoiYzA3MmFiMDItMDMwYi00NmU2LWI1MmQtM2Y3ZmMxMGY2ZjkwIiwiaWRpcl91c2VyX2d1aWQiOiIzMzI0QjQxQzRCOTk0M0U4OTI3RkMzMzgxNjk4QkY2MCIsImlkZW50aXR5X3Byb3ZpZGVyIjoiaWRpciIsImlkaXJfdXNlcm5hbWUiOiJDQkVSRyIsImVtYWlsX3ZlcmlmaWVkIjpmYWxzZSwibmFtZSI6IkJlcmcsIENocmlzIE1PVEk6RVgiLCJwcmVmZXJyZWRfdXNlcm5hbWUiOiIzMzI0YjQxYzRiOTk0M2U4OTI3ZmMzMzgxNjk4YmY2MEBpZGlyIiwiZ2l2ZW5fbmFtZSI6IkNocmlzIiwiZGlzcGxheV9uYW1lIjoiQmVyZywgQ2hyaXMgTU9USTpFWCIsImZhbWlseV9uYW1lIjoiQmVyZyIsImVtYWlsIjoiY2hyaXMuYmVyZ0Bnb3YuYmMuY2EifQ.UiKoybZpovAtayyoG9cZYWt_evzg6akIQjzTqGj0zMZwTEFo8kYBTqBfIXN7XqQfvW9eleBw0bpUcc2kY3GWPbPxTyp5c0I4WS7iMUDlhD2zF8Z7HA9juV7WCCqpgojVzwRgfYlDXE0RGEX8wGkxwaNC5r1NJOmbADTm6QIrzuVLt9gLiSrr1XkEDizzZTiZolx6vJuXj5AMxg4AGibhQ9quiC_kKMyhV6H8_hryTqXD9R3tCYlUnAarffva_Pswkbn0rTN9BNCf15_KzyW1jP09jzLlg7gHPzKMFP27Ph1fauXM4p2HNfC8ILam_fbfmY1HJ5s1wjAELdA9NrAYBA + =
@@ -146,108 +146,6 @@ - - - - - - - - - https://${VEHICLES_API_URL}/users/roles?companyId=74 - GET - true - false - true - false - - - - - - - - - Host - ${VEHICLES_API_URL} - - - Connection - keep-alive - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - Accept - application/json - - - sec-ch-ua-mobile - ?0 - - - Authorization - Bearer ${BEARER_TOKEN} - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - sec-ch-ua-platform - "Windows" - - - Origin - https://${FRONTEND_API_URL} - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - cors - - - Sec-Fetch-Dest - empty - - - Referer - https://${FRONTEND_API_URL}/ - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - If-None-Match - W/"17b2-OQs45yY+9rxT8oaE549bg+d9IqA" - - - - - - - - Authorization - Bearer ${BEARER_TOKEN} - - - Accept - */* - - - - - @@ -358,98 +256,14 @@ - true - - - - false - { - "reportTemplate": "PAYMENT_AND_REFUND_DETAILED_REPORT", - "reportData": { - "issuedBy": "Self Issued and PPC", - "runDate": "Jul. 17, 2023, 09:00 PM, PDT", - "permitType": "All Permit Types", - "paymentMethod": "Cash, Cheque, Icepay - Mastercard, Icepay - Mastercard (Debit), Icepay - Visa, Icepay - Visa (Debit), Web - Mastercard (Debit), Web - Visa (Debit), PoS - Mastercard (Debit), PoS - Visa (Debit), PoS - Mastercard", - "timePeriod": "Jul. 17, 2023, 09:00 PM, PDT – Jul. 18, 2023, 09:00 PM, PDT", - "payments": [ - { - "issuedOn": "Jul. 17, 2023, 09:00 PM, PDT", - "providerTransactionId": "73582422238", - "orbcTransactionId": "OR-678904512857", - "paymentMethod": "Cash", - "receiptNo": "45098721098", - "permitNo": "P2-72106199-468", - "permitType": "STOW", - "user": "ANPETRIC", - "amount": "$90.00" - }, - { - "paymentMethod": "Cash", - "subTotalAmount": "$90.00" - }, - { - "paymentMethod": "Cash", - "totalAmount": "$90.00" - } - ], - "refunds": [ - { - "issuedOn": "Jul. 17, 2023, 09:00 PM, PDT", - "providerTransactionId": "73582422238", - "orbcTransactionId": "OR-678904512857", - "paymentMethod": "Cheque", - "receiptNo": "51961102630", - "permitNo": "P2-15348742-610", - "permitType": "TROS", - "user": "KOPARKIN", - "amount": "$10.00" - }, - { - "paymentMethod": "Cheque", - "subTotalAmount": "$190.00" - }, - { - "paymentMethod": "Credit Card", - "totalAmount": "$190.00" - } - ], - "summaryPayments": [ - { - "paymentMethod": "Cheque", - "payment": "$190", - "refund": "$190", - "deposit": "$190" - }, - { - "subTotalPaymentAmount": "$190.00", - "subTotalRefundAmount": "$190.00", - "subTotalDepositAmount": "$190.00" - }, - { - "grandTotalAmount": "$190.00" - } - ], - "summaryPermits": [ - { - "permitType": "TROS", - "permitCount": "1" - }, - { - "totalPermits": "1" - } - ] - }, - "generatedDocumentFileName": "FinancialA12345" -} - = - - + + - https://${DOPS_API_URL}/dms/1?download=proxy&companyId=74 + https://${DOPS_API_URL}/dms/1?download=url&companyId=74 GET true false @@ -650,7 +464,7 @@ false { - "templateName": "PERMIT_TROS", + "templateName": "PERMIT", "templateVersion": 1, "templateData": { "permitName": "Oversize: Term", @@ -696,6 +510,7 @@ "lastName": "Hamilton", "phone1": "(778) 952-1234", "email": "lewis@f1.com", + "additionalEmail": "lewis2@f1.com", "phone1Extension": "1", "phone2": null, "phone2Extension": null, @@ -735,7 +550,7 @@ - https://${DOPS_API_URL}/dgen/template/render + https://${DOPS_API_URL}/dgen/template/render?companyId=74 POST true false From 3e26684881b545c2ee3298584c8d5d2b56da08cb Mon Sep 17 00:00:00 2001 From: Chris Berg Date: Thu, 5 Sep 2024 10:05:27 -0700 Subject: [PATCH 17/63] fix: split bceid and idir for frontend --- loadtests/dops/orbc_load_test_plan_dops.jmx | 16 +- .../orbc_load_test_plan_frontend_bceid.jmx | 6455 +++++++++++++++++ ... => orbc_load_test_plan_frontend_idir.jmx} | 6266 +--------------- 3 files changed, 6488 insertions(+), 6249 deletions(-) create mode 100644 loadtests/frontend/orbc_load_test_plan_frontend_bceid.jmx rename loadtests/frontend/{orbc_load_test_plan_frontend.jmx => orbc_load_test_plan_frontend_idir.jmx} (50%) diff --git a/loadtests/dops/orbc_load_test_plan_dops.jmx b/loadtests/dops/orbc_load_test_plan_dops.jmx index ac4bb85a7..3097efb4f 100644 --- a/loadtests/dops/orbc_load_test_plan_dops.jmx +++ b/loadtests/dops/orbc_load_test_plan_dops.jmx @@ -1,5 +1,5 @@ - + @@ -105,8 +105,8 @@ ~/results = - - BEARER_TOKEN + + IDIR_BEARER_TOKEN = @@ -133,7 +133,7 @@ Authorization - Bearer ${BEARER_TOKEN} + Bearer ${IDIR_BEARER_TOKEN} Accept @@ -196,7 +196,7 @@ Authorization - Bearer ${BEARER_TOKEN} + Bearer ${IDIR_BEARER_TOKEN} User-Agent @@ -245,7 +245,7 @@ Authorization - Bearer ${BEARER_TOKEN} + Bearer ${IDIR_BEARER_TOKEN} Accept @@ -298,7 +298,7 @@ Authorization - Bearer ${BEARER_TOKEN} + Bearer ${IDIR_BEARER_TOKEN} User-Agent @@ -347,7 +347,7 @@ Authorization - Bearer ${BEARER_TOKEN} + Bearer ${IDIR_BEARER_TOKEN} Accept diff --git a/loadtests/frontend/orbc_load_test_plan_frontend_bceid.jmx b/loadtests/frontend/orbc_load_test_plan_frontend_bceid.jmx new file mode 100644 index 000000000..3d468b63c --- /dev/null +++ b/loadtests/frontend/orbc_load_test_plan_frontend_bceid.jmx @@ -0,0 +1,6455 @@ + + + + + + false + false + + + + Duration + 3180 + = + + + + + + + + true + false + false + + + + + true + false + + + + + + Accept-Language + en-us,en;q=0.5 + + + Accept + text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 + + + Keep-Alive + 115 + + + User-Agent + Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13 + + + Accept-Encoding + gzip,deflate + + + Accept-Charset + ISO-8859-1,utf-8;q=0.7,*;q=0.7 + + + X-BlazeMeter-Session + ${__P(blazemeter.session_id)} + + + + + + + + + + + + + + true + 2 + ^((?!google|facebook|youtube|pinterest|twimg|doubleclick).)*$ + 60000 + 120000 + + + + + + NUM_THREADS + 200 + = + + + FRONTEND_API_URL + onroutebc-test-frontend.apps.silver.devops.gov.bc.ca/ + = + + + VEHICLES_API_URL + onroutebc-test-vehicles.apps.silver.devops.gov.bc.ca/ + = + + + DOPS_API_URL + onroutebc-test-dops.apps.silver.devops.gov.bc.ca/ + = + + + BCEID_BEARER_TOKEN + + = + + + RESULTS_DIR + ~/results + = + + + KEYCLOAK_LOGIN_URL + test.loginproxy.gov.bc.ca + = + + + SITEMINDER_URL + logontest7.gov.bc.ca + = + + + + + + continue + + false + 1 + + ${NUM_THREADS} + ${__P(rampup,300)} + 1365261073000 + 1365261073000 + true + ${__P(duration,3000)} + + true + + + + ${__P(Delay,10000)} + + + + + + + false + + = + true + + + + + + + + https://${FRONTEND_API_URL}/ + GET + true + false + true + false + + + + + + + + + Host + ${FRONTEND_API_URL} + + + Connection + keep-alive + + + Cache-Control + max-age=0 + + + sec-ch-ua + "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" + + + sec-ch-ua-mobile + ?0 + + + sec-ch-ua-platform + "Windows" + + + Upgrade-Insecure-Requests + 1 + + + User-Agent + Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 + + + Accept + text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 + + + Sec-Fetch-Site + same-origin + + + Sec-Fetch-Mode + navigate + + + Sec-Fetch-User + ?1 + + + Sec-Fetch-Dest + document + + + Accept-Encoding + gzip, deflate, br + + + Accept-Language + en-US,en;q=0.9 + + + Cookie + _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; FAILREASON=0; 9a75866e187615f9e3e688e8297548f9=1f5b60b83338df80ae3a11e1286008b7; SMSESSION=LOGGEDOFF + + + If-None-Match + W/"653ca247-308" + + + If-Modified-Since + Sat, 28 Oct 2023 05:55:19 GMT + + + + + + + + + + false + + = + true + + + + + + + + https://${KEYCLOAK_LOGIN_URL}/auth/realms/standard/.well-known/openid-configuration + GET + true + false + true + false + + + + + + + + + Host + ${KEYCLOAK_LOGIN_URL} + + + Connection + keep-alive + + + sec-ch-ua + "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" + + + Accept + application/jwk-set+json, application/json + + + sec-ch-ua-mobile + ?0 + + + User-Agent + Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 + + + sec-ch-ua-platform + "Windows" + + + Origin + https://${FRONTEND_API_URL} + + + Sec-Fetch-Site + same-site + + + Sec-Fetch-Mode + cors + + + Sec-Fetch-Dest + empty + + + Referer + https://${FRONTEND_API_URL}/ + + + Accept-Encoding + gzip, deflate, br + + + Accept-Language + en-US,en;q=0.9 + + + + + + + + + + false + + = + true + + + + + + + + https://${KEYCLOAK_LOGIN_URL}/auth/realms/standard/protocol/openid-connect/auth?client_id=on-route-bc-direct-4598&redirect_uri=https%3A%2F%2F${FRONTEND_API_URL}%2F&response_type=code&scope=openid&state=7be0f498ddfa45e28ee8f2416475ba42&code_challenge=B4JszPcS0HOW7ECTTUURC1mp6z8at2b6K0lD1uK_11A&code_challenge_method=S256&response_mode=query&kc_idp_hint=bceidboth + GET + true + false + true + false + + + + + + + + + Host + ${KEYCLOAK_LOGIN_URL} + + + Connection + keep-alive + + + sec-ch-ua + "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" + + + sec-ch-ua-mobile + ?0 + + + sec-ch-ua-platform + "Windows" + + + Upgrade-Insecure-Requests + 1 + + + User-Agent + Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 + + + Accept + text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 + + + Sec-Fetch-Site + same-site + + + Sec-Fetch-Mode + navigate + + + Sec-Fetch-User + ?1 + + + Sec-Fetch-Dest + document + + + Referer + https://${FRONTEND_API_URL}/ + + + Accept-Encoding + gzip, deflate, br + + + Accept-Language + en-US,en;q=0.9 + + + Cookie + AUTH_SESSION_ID=2e364c60-0ead-4ec1-98fb-0e1bba001f08.ycloak-78b4c74bcf-vtmwp; AUTH_SESSION_ID_LEGACY=2e364c60-0ead-4ec1-98fb-0e1bba001f08.ycloak-78b4c74bcf-vtmwp; _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; FAILREASON=0; SMSESSION=LOGGEDOFF + + + + + + + + + + false + + = + true + + + + + + + + https://${KEYCLOAK_LOGIN_URL}/auth/realms/standard/broker/bceidboth/login?session_code=5b_D1WNhNIzE-FZe70dEmhs_J2mpDyFSyQzWPAxnjYc&client_id=on-route-bc-direct-4598&tab_id=KAxYXjoatGc + GET + true + false + true + false + + + + + + + + + Host + ${KEYCLOAK_LOGIN_URL} + + + Connection + keep-alive + + + Upgrade-Insecure-Requests + 1 + + + User-Agent + Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 + + + Accept + text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 + + + Sec-Fetch-Site + same-site + + + Sec-Fetch-Mode + navigate + + + Sec-Fetch-User + ?1 + + + Sec-Fetch-Dest + document + + + sec-ch-ua + "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" + + + sec-ch-ua-mobile + ?0 + + + sec-ch-ua-platform + "Windows" + + + Accept-Encoding + gzip, deflate, br + + + Accept-Language + en-US,en;q=0.9 + + + Cookie + AUTH_SESSION_ID=0e56ff7b-e277-400f-84f5-25801c43c829.ycloak-78b4c74bcf-kh476; AUTH_SESSION_ID_LEGACY=0e56ff7b-e277-400f-84f5-25801c43c829.ycloak-78b4c74bcf-kh476; KC_RESTART=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICIzMmI0MzNkNC02NjgwLTQxODMtOTc2Yy1kZDdjMTg0YjExMTQifQ.eyJjaWQiOiJvbi1yb3V0ZS1iYy1kaXJlY3QtNDU5OCIsInB0eSI6Im9wZW5pZC1jb25uZWN0IiwicnVyaSI6Imh0dHBzOi8vb25yb3V0ZWJjLXRlc3QtZnJvbnRlbmQuYXBwcy5zaWx2ZXIuZGV2b3BzLmdvdi5iYy5jYS8iLCJhY3QiOiJBVVRIRU5USUNBVEUiLCJub3RlcyI6eyJzY29wZSI6Im9wZW5pZCIsImlzcyI6Imh0dHBzOi8vdGVzdC5sb2dpbnByb3h5Lmdvdi5iYy5jYS9hdXRoL3JlYWxtcy9zdGFuZGFyZCIsInJlc3BvbnNlX3R5cGUiOiJjb2RlIiwiY29kZV9jaGFsbGVuZ2VfbWV0aG9kIjoiUzI1NiIsInJlZGlyZWN0X3VyaSI6Imh0dHBzOi8vb25yb3V0ZWJjLXRlc3QtZnJvbnRlbmQuYXBwcy5zaWx2ZXIuZGV2b3BzLmdvdi5iYy5jYS8iLCJzdGF0ZSI6IjdiZTBmNDk4ZGRmYTQ1ZTI4ZWU4ZjI0MTY0NzViYTQyIiwiY29kZV9jaGFsbGVuZ2UiOiJCNEpzelBjUzBIT1c3RUNUVFVVUkMxbXA2ejhhdDJiNkswbEQxdUtfMTFBIiwia2NfaWRwX2hpbnQiOiJiY2VpZGJvdGgiLCJyZXNwb25zZV9tb2RlIjoicXVlcnkifX0.2dLZTTjk8ZY0EFAaE88sAWQlfo7T17XcYLztnQwI_Yk; _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; FAILREASON=0; SMSESSION=LOGGEDOFF + + + + + + + + + + false + + = + true + + + + + + + + https://${KEYCLOAK_LOGIN_URL}/auth/realms/bceidboth/protocol/openid-connect/auth?scope=openid&state=JvIyfmoj0AzmBZWw0ZS8lBmhMJXd7lA_uAR8JQvLNlE.KAxYXjoatGc.on-route-bc-direct-4598&response_type=code&client_id=standard-realm&redirect_uri=https%3A%2F%2F${KEYCLOAK_LOGIN_URL}%2Fauth%2Frealms%2Fstandard%2Fbroker%2Fbceidboth%2Fendpoint&nonce=1sKWmdZ0aV6QIscb65Lrmg + GET + true + false + true + false + + + + + + + + + Host + ${KEYCLOAK_LOGIN_URL} + + + Connection + keep-alive + + + Upgrade-Insecure-Requests + 1 + + + User-Agent + Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 + + + Accept + text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 + + + Sec-Fetch-Site + same-site + + + Sec-Fetch-Mode + navigate + + + Sec-Fetch-User + ?1 + + + Sec-Fetch-Dest + document + + + sec-ch-ua + "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" + + + sec-ch-ua-mobile + ?0 + + + sec-ch-ua-platform + "Windows" + + + Accept-Encoding + gzip, deflate, br + + + Accept-Language + en-US,en;q=0.9 + + + Cookie + AUTH_SESSION_ID=33769057-e4e2-49e9-821b-bab26d4e7507.ycloak-78b4c74bcf-gj9d6; AUTH_SESSION_ID_LEGACY=33769057-e4e2-49e9-821b-bab26d4e7507.ycloak-78b4c74bcf-gj9d6; KEYCLOAK_IDENTITY=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI1ZjExNjBiNS03Y2RjLTQ5NGQtYmFkOS0yZGRkNjU3MDU5Y2UifQ.eyJleHAiOjE2OTg3MzE3MzQsImlhdCI6MTY5ODY5NTczNCwianRpIjoiNzY3ZDEzMGEtMzczMC00NDdhLWEzNTUtNjhhNDhiMjgzZTI3IiwiaXNzIjoiaHR0cHM6Ly90ZXN0LmxvZ2lucHJveHkuZ292LmJjLmNhL2F1dGgvcmVhbG1zL2JjZWlkYm90aCIsInN1YiI6ImQ3M2FiN2IwLWUyMmEtNDg0NC04Yzc3LWU3YTQ2ODQyOTNmZCIsInR5cCI6IlNlcmlhbGl6ZWQtSUQiLCJzZXNzaW9uX3N0YXRlIjoiMzM3NjkwNTctZTRlMi00OWU5LTgyMWItYmFiMjZkNGU3NTA3Iiwic2lkIjoiMzM3NjkwNTctZTRlMi00OWU5LTgyMWItYmFiMjZkNGU3NTA3Iiwic3RhdGVfY2hlY2tlciI6Ik9SWEI4amY3Q3hPUWhzTUNhWU5nMHF2WHNzZG52cnlxUHFjMnFpUkthZncifQ.1kpL3Qpg4pyqSLBE0iDz7WZ0fdGzCCf6RCiN6HvFWqE; KEYCLOAK_IDENTITY_LEGACY=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI1ZjExNjBiNS03Y2RjLTQ5NGQtYmFkOS0yZGRkNjU3MDU5Y2UifQ.eyJleHAiOjE2OTg3MzE3MzQsImlhdCI6MTY5ODY5NTczNCwianRpIjoiNzY3ZDEzMGEtMzczMC00NDdhLWEzNTUtNjhhNDhiMjgzZTI3IiwiaXNzIjoiaHR0cHM6Ly90ZXN0LmxvZ2lucHJveHkuZ292LmJjLmNhL2F1dGgvcmVhbG1zL2JjZWlkYm90aCIsInN1YiI6ImQ3M2FiN2IwLWUyMmEtNDg0NC04Yzc3LWU3YTQ2ODQyOTNmZCIsInR5cCI6IlNlcmlhbGl6ZWQtSUQiLCJzZXNzaW9uX3N0YXRlIjoiMzM3NjkwNTctZTRlMi00OWU5LTgyMWItYmFiMjZkNGU3NTA3Iiwic2lkIjoiMzM3NjkwNTctZTRlMi00OWU5LTgyMWItYmFiMjZkNGU3NTA3Iiwic3RhdGVfY2hlY2tlciI6Ik9SWEI4amY3Q3hPUWhzTUNhWU5nMHF2WHNzZG52cnlxUHFjMnFpUkthZncifQ.1kpL3Qpg4pyqSLBE0iDz7WZ0fdGzCCf6RCiN6HvFWqE; KEYCLOAK_SESSION=bceidboth/d73ab7b0-e22a-4844-8c77-e7a4684293fd/33769057-e4e2-49e9-821b-bab26d4e7507; KEYCLOAK_SESSION_LEGACY=bceidboth/d73ab7b0-e22a-4844-8c77-e7a4684293fd/33769057-e4e2-49e9-821b-bab26d4e7507; _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; FAILREASON=0; SMSESSION=LOGGEDOFF + + + + + + + + + + false + + = + true + + + + + + + + https://${KEYCLOAK_LOGIN_URL}/auth/realms/bceidboth/broker/bceidboth/login?session_code=oRr0p7JZ9oL7vptnFPfNKhf_nrB8DND1rBojsNPjot0&client_id=standard-realm&tab_id=k5Vw5BDlfVQ + GET + true + false + true + false + + + + + + + + + Host + ${KEYCLOAK_LOGIN_URL} + + + Connection + keep-alive + + + Upgrade-Insecure-Requests + 1 + + + User-Agent + Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 + + + Accept + text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 + + + Sec-Fetch-Site + same-site + + + Sec-Fetch-Mode + navigate + + + Sec-Fetch-User + ?1 + + + Sec-Fetch-Dest + document + + + sec-ch-ua + "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" + + + sec-ch-ua-mobile + ?0 + + + sec-ch-ua-platform + "Windows" + + + Accept-Encoding + gzip, deflate, br + + + Accept-Language + en-US,en;q=0.9 + + + Cookie + AUTH_SESSION_ID=f26f78a0-28d2-40b4-9e57-b83fa590e32e.ycloak-78b4c74bcf-vtmwp; AUTH_SESSION_ID_LEGACY=f26f78a0-28d2-40b4-9e57-b83fa590e32e.ycloak-78b4c74bcf-vtmwp; KC_RESTART=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI1ZjExNjBiNS03Y2RjLTQ5NGQtYmFkOS0yZGRkNjU3MDU5Y2UifQ.eyJjaWQiOiJzdGFuZGFyZC1yZWFsbSIsInB0eSI6Im9wZW5pZC1jb25uZWN0IiwicnVyaSI6Imh0dHBzOi8vdGVzdC5sb2dpbnByb3h5Lmdvdi5iYy5jYS9hdXRoL3JlYWxtcy9zdGFuZGFyZC9icm9rZXIvYmNlaWRib3RoL2VuZHBvaW50IiwiYWN0IjoiQVVUSEVOVElDQVRFIiwibm90ZXMiOnsic2NvcGUiOiJvcGVuaWQiLCJpc3MiOiJodHRwczovL3Rlc3QubG9naW5wcm94eS5nb3YuYmMuY2EvYXV0aC9yZWFsbXMvYmNlaWRib3RoIiwicmVzcG9uc2VfdHlwZSI6ImNvZGUiLCJyZWRpcmVjdF91cmkiOiJodHRwczovL3Rlc3QubG9naW5wcm94eS5nb3YuYmMuY2EvYXV0aC9yZWFsbXMvc3RhbmRhcmQvYnJva2VyL2JjZWlkYm90aC9lbmRwb2ludCIsInN0YXRlIjoiSnZJeWZtb2owQXptQlpXdzBaUzhsQm1oTUpYZDdsQV91QVI4SlF2TE5sRS5LQXhZWGpvYXRHYy5vbi1yb3V0ZS1iYy1kaXJlY3QtNDU5OCIsIm5vbmNlIjoiMXNLV21kWjBhVjZRSXNjYjY1THJtZyJ9fQ.08S_Qi57kTkuLj_eH5VElw2zeuH4AVhfOUois5IUzEI; _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; FAILREASON=0; SMSESSION=LOGGEDOFF + + + + + + + + + + false + + = + true + + + + + + + + https://${SITEMINDER_URL}/clp-cgi/capBceid/logon.cgi?flags=0101:0,7&TYPE=33554433&REALMOID=06-b02c7ed2-895e-4953-bd03-8008c64ec906&GUID=&SMAUTHREASON=0&METHOD=GET&SMAGENTNAME=$SM$Lk6VtkyHw8x3zQIIsMiOiEXYFJF%2fJzjVT7eioCjxBjJck5VMlbxxrR%2bLZSo%2flIBX&TARGET=$SM$HTTPS%3a%2f%2fsfstest7%2egov%2ebc%2eca%2faffwebservices%2fredirectjsp%2ftestkeycloak-basicbusinessbceid%2fredirect%2ejsp%3fSMPORTALURL%3dhttps$%3A$%2F$%2Fsfstest7%2egov%2ebc%2eca$%2Faffwebservices$%2Fpublic$%2Fsaml2sso%26SAMLTRANSACTIONID%3dc9f189ad-7324de1b-2e045e1a-e8bcf162-a78af00c-c5 + GET + true + false + true + false + + + + + + + + + Host + ${SITEMINDER_URL} + + + Connection + keep-alive + + + Cache-Control + max-age=0 + + + Upgrade-Insecure-Requests + 1 + + + User-Agent + Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 + + + Accept + text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 + + + Sec-Fetch-Site + same-site + + + Sec-Fetch-Mode + navigate + + + Sec-Fetch-Dest + document + + + sec-ch-ua + "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" + + + sec-ch-ua-mobile + ?0 + + + sec-ch-ua-platform + "Windows" + + + Accept-Encoding + gzip, deflate, br + + + Accept-Language + en-US,en;q=0.9 + + + Cookie + _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; Dummy1=DummyVal1; BCGOVFlags=0101%3A0%2C7; BCGOVCustom=NULL; BCGOVBrand=NULL; BCGOVBehavior=NULL; Dummy2=DummyVal2; preDummy1=DummyVal1; preDummy2=DummyVal2; preDummy3=DummyVal3; BCGOVDoNotShow=1; preDummy4=DummyVal4; FAILREASON=0; BCGOVTarget=HTTPS%3A%2F%2Fsfstest7.gov.bc.ca%2Faffwebservices%2Fredirectjsp%2Ftestkeycloak-basicbusinessbceid%2Fredirect.jsp%3FSMPORTALURL%3Dhttps%253A%252F%252Fsfstest7.gov.bc.ca%252Faffwebservices%252Fpublic%252Fsaml2sso%26SAMLTRANSACTIONID%3Df7917115-57286b4a-df9cf6ff-b50e2f11-c566ac5a-f6; BCGOVclptryno=0; clp001=0; SMSESSION=LOGGEDOFF; SMFED_OLD_SESSION=""; SMFED_OLD_IDENTITY=""; GUID=1:26feb557-62af2c8c-4ef3a8d7-2e2277be-6a76895c-697 + + + + + + + true + + + + false + instance=instance_capBceid&user=ORBCTST3&password=orbcTST%2B2023 + = + + + + + + + + https://${SITEMINDER_URL}/clp-cgi/preLogon.cgi + POST + true + false + true + false + + + + + + + + + Host + ${SITEMINDER_URL} + + + Connection + keep-alive + + + Content-Length + 64 + + + Cache-Control + max-age=0 + + + sec-ch-ua + "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" + + + sec-ch-ua-mobile + ?0 + + + sec-ch-ua-platform + "Windows" + + + Upgrade-Insecure-Requests + 1 + + + Origin + https://${SITEMINDER_URL} + + + Content-Type + application/x-www-form-urlencoded + + + User-Agent + Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 + + + Accept + text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 + + + Sec-Fetch-Site + same-origin + + + Sec-Fetch-Mode + navigate + + + Sec-Fetch-User + ?1 + + + Sec-Fetch-Dest + document + + + Referer + https://${SITEMINDER_URL}/clp-cgi/capBceid/logon.cgi?flags=0101:0,7&TYPE=33554433&REALMOID=06-b02c7ed2-895e-4953-bd03-8008c64ec906&GUID=&SMAUTHREASON=0&METHOD=GET&SMAGENTNAME=$SM$Lk6VtkyHw8x3zQIIsMiOiEXYFJF%2fJzjVT7eioCjxBjJck5VMlbxxrR%2bLZSo%2flIBX&TARGET=$SM$HTTPS%3a%2f%2fsfstest7%2egov%2ebc%2eca%2faffwebservices%2fredirectjsp%2ftestkeycloak-basicbusinessbceid%2fredirect%2ejsp%3fSMPORTALURL%3dhttps$%3A$%2F$%2Fsfstest7%2egov%2ebc%2eca$%2Faffwebservices$%2Fpublic$%2Fsaml2sso%26SAMLTRANSACTIONID%3dc9f189ad-7324de1b-2e045e1a-e8bcf162-a78af00c-c5 + + + Accept-Encoding + gzip, deflate, br + + + Accept-Language + en-US,en;q=0.9 + + + Cookie + _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; Dummy1=DummyVal1; BCGOVFlags=0101%3A0%2C7; BCGOVCustom=NULL; BCGOVBrand=NULL; BCGOVBehavior=NULL; Dummy2=DummyVal2; preDummy1=DummyVal1; preDummy2=DummyVal2; preDummy3=DummyVal3; BCGOVDoNotShow=1; preDummy4=DummyVal4; FAILREASON=0; clp001=0; SMSESSION=LOGGEDOFF; SMFED_OLD_SESSION=""; SMFED_OLD_IDENTITY=""; GUID=1:26feb557-62af2c8c-4ef3a8d7-2e2277be-6a76895c-697; BCGOVTarget=HTTPS%3A%2F%2Fsfstest7.gov.bc.ca%2Faffwebservices%2Fredirectjsp%2Ftestkeycloak-basicbusinessbceid%2Fredirect.jsp%3FSMPORTALURL%3Dhttps%253A%252F%252Fsfstest7.gov.bc.ca%252Faffwebservices%252Fpublic%252Fsaml2sso%26SAMLTRANSACTIONID%3Dc9f189ad-7324de1b-2e045e1a-e8bcf162-a78af00c-c5; BCGOVclptryno=1 + + + + + + + true + + + + false + SMENC=ISO-8859-1&SMLOCALE=US-EN&target=%2Fclp-cgi%2Fcap07%2Fprivate%2FpostLogon.cgi&smauthreason=0&smagentname=&user=ORBCTST3&password=orbcTST%2B2023 + = + + + + + + + + https://${SITEMINDER_URL}/clp-cgi/cap07/logon.fcc + POST + true + false + true + false + + + + + + + + + Host + ${SITEMINDER_URL} + + + Connection + keep-alive + + + Content-Length + 149 + + + Cache-Control + max-age=0 + + + sec-ch-ua + "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" + + + sec-ch-ua-mobile + ?0 + + + sec-ch-ua-platform + "Windows" + + + Upgrade-Insecure-Requests + 1 + + + Origin + https://${SITEMINDER_URL} + + + Content-Type + application/x-www-form-urlencoded + + + User-Agent + Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 + + + Accept + text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 + + + Sec-Fetch-Site + same-origin + + + Sec-Fetch-Mode + navigate + + + Sec-Fetch-Dest + document + + + Referer + https://${SITEMINDER_URL}/clp-cgi/preLogon.cgi + + + Accept-Encoding + gzip, deflate, br + + + Accept-Language + en-US,en;q=0.9 + + + Cookie + _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; Dummy1=DummyVal1; BCGOVFlags=0101%3A0%2C7; BCGOVCustom=NULL; BCGOVBrand=NULL; BCGOVBehavior=NULL; Dummy2=DummyVal2; preDummy1=DummyVal1; preDummy2=DummyVal2; preDummy3=DummyVal3; BCGOVDoNotShow=1; preDummy4=DummyVal4; FAILREASON=0; SMSESSION=LOGGEDOFF; SMFED_OLD_SESSION=""; SMFED_OLD_IDENTITY=""; GUID=1:26feb557-62af2c8c-4ef3a8d7-2e2277be-6a76895c-697; BCGOVTarget=HTTPS%3A%2F%2Fsfstest7.gov.bc.ca%2Faffwebservices%2Fredirectjsp%2Ftestkeycloak-basicbusinessbceid%2Fredirect.jsp%3FSMPORTALURL%3Dhttps%253A%252F%252Fsfstest7.gov.bc.ca%252Faffwebservices%252Fpublic%252Fsaml2sso%26SAMLTRANSACTIONID%3Dc9f189ad-7324de1b-2e045e1a-e8bcf162-a78af00c-c5; BCGOVclptryno=1; clp001=Salted__%8E%F5%14%93%F3.%C8%8C%C2%B3%84%8B%8EC%E0%88%AAK%01%C77%B6%C4g%C3%D2%3ELS%06%7CdJp%18%E9TJ%8A%D3a%A9%AD%3C%5E%DBZ%D7 + + + + + + + + + + false + + = + + + + + + + + https://${SITEMINDER_URL}/clp-cgi/cap07/private/postLogon.cgi + GET + true + false + true + false + + + + + + + + + Host + ${SITEMINDER_URL} + + + Connection + keep-alive + + + Cache-Control + max-age=0 + + + Upgrade-Insecure-Requests + 1 + + + User-Agent + Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 + + + Accept + text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 + + + Sec-Fetch-Site + same-origin + + + Sec-Fetch-Mode + navigate + + + Sec-Fetch-Dest + document + + + sec-ch-ua + "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" + + + sec-ch-ua-mobile + ?0 + + + sec-ch-ua-platform + "Windows" + + + Referer + https://${SITEMINDER_URL}/clp-cgi/preLogon.cgi + + + Accept-Encoding + gzip, deflate, br + + + Accept-Language + en-US,en;q=0.9 + + + Cookie + _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; Dummy1=DummyVal1; BCGOVFlags=0101%3A0%2C7; BCGOVCustom=NULL; BCGOVBrand=NULL; BCGOVBehavior=NULL; Dummy2=DummyVal2; preDummy1=DummyVal1; preDummy2=DummyVal2; preDummy3=DummyVal3; BCGOVDoNotShow=1; preDummy4=DummyVal4; FAILREASON=0; SMSESSION=LOGGEDOFF; SMFED_OLD_SESSION=""; SMFED_OLD_IDENTITY=""; GUID=1:26feb557-62af2c8c-4ef3a8d7-2e2277be-6a76895c-697; BCGOVTarget=HTTPS%3A%2F%2Fsfstest7.gov.bc.ca%2Faffwebservices%2Fredirectjsp%2Ftestkeycloak-basicbusinessbceid%2Fredirect.jsp%3FSMPORTALURL%3Dhttps%253A%252F%252Fsfstest7.gov.bc.ca%252Faffwebservices%252Fpublic%252Fsaml2sso%26SAMLTRANSACTIONID%3Dc9f189ad-7324de1b-2e045e1a-e8bcf162-a78af00c-c5; BCGOVclptryno=1; clp001=Salted__%8E%F5%14%93%F3.%C8%8C%C2%B3%84%8B%8EC%E0%88%AAK%01%C77%B6%C4g%C3%D2%3ELS%06%7CdJp%18%E9TJ%8A%D3a%A9%AD%3C%5E%DBZ%D7; FORMCRED=2ZS4S2F4tb41FWGyAD293ZV3eiMsCRYZ+ktOitYzjWY/fG/2BFtCWHSnbkvgJfBEm8aTuwAg3nMfeG0h8ahL0C1Q+SZp1d30x/imUNpQkjqP7yK+smpXGQMNWzNb15A+UXcYa0yUQLQ5rFoH720FIoiqZ4Nmikk7a67vktQxd8rpIduHeZJ7tAYb/b+pXPha + + + + + + + + + + false + + = + + + + + + + + https://${KEYCLOAK_LOGIN_URL}/auth/realms/standard/broker/bceidboth/endpoint?state=JvIyfmoj0AzmBZWw0ZS8lBmhMJXd7lA_uAR8JQvLNlE.KAxYXjoatGc.on-route-bc-direct-4598&session_state=f26f78a0-28d2-40b4-9e57-b83fa590e32e&code=c5719177-78e8-4d75-857a-0ef191c765d1.f26f78a0-28d2-40b4-9e57-b83fa590e32e.1123d85b-badf-4084-a3a6-b1c920ccb0c0 + GET + true + false + true + false + + + + + + + + + Host + ${KEYCLOAK_LOGIN_URL} + + + Connection + keep-alive + + + Cache-Control + max-age=0 + + + Upgrade-Insecure-Requests + 1 + + + User-Agent + Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 + + + Accept + text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 + + + Sec-Fetch-Site + same-site + + + Sec-Fetch-Mode + navigate + + + Sec-Fetch-Dest + document + + + sec-ch-ua + "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" + + + sec-ch-ua-mobile + ?0 + + + sec-ch-ua-platform + "Windows" + + + Accept-Encoding + gzip, deflate, br + + + Accept-Language + en-US,en;q=0.9 + + + Cookie + AUTH_SESSION_ID=0e56ff7b-e277-400f-84f5-25801c43c829.ycloak-78b4c74bcf-kh476; AUTH_SESSION_ID_LEGACY=0e56ff7b-e277-400f-84f5-25801c43c829.ycloak-78b4c74bcf-kh476; KC_RESTART=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICIzMmI0MzNkNC02NjgwLTQxODMtOTc2Yy1kZDdjMTg0YjExMTQifQ.eyJjaWQiOiJvbi1yb3V0ZS1iYy1kaXJlY3QtNDU5OCIsInB0eSI6Im9wZW5pZC1jb25uZWN0IiwicnVyaSI6Imh0dHBzOi8vb25yb3V0ZWJjLXRlc3QtZnJvbnRlbmQuYXBwcy5zaWx2ZXIuZGV2b3BzLmdvdi5iYy5jYS8iLCJhY3QiOiJBVVRIRU5USUNBVEUiLCJub3RlcyI6eyJzY29wZSI6Im9wZW5pZCIsImlzcyI6Imh0dHBzOi8vdGVzdC5sb2dpbnByb3h5Lmdvdi5iYy5jYS9hdXRoL3JlYWxtcy9zdGFuZGFyZCIsInJlc3BvbnNlX3R5cGUiOiJjb2RlIiwiY29kZV9jaGFsbGVuZ2VfbWV0aG9kIjoiUzI1NiIsInJlZGlyZWN0X3VyaSI6Imh0dHBzOi8vb25yb3V0ZWJjLXRlc3QtZnJvbnRlbmQuYXBwcy5zaWx2ZXIuZGV2b3BzLmdvdi5iYy5jYS8iLCJzdGF0ZSI6IjdiZTBmNDk4ZGRmYTQ1ZTI4ZWU4ZjI0MTY0NzViYTQyIiwiY29kZV9jaGFsbGVuZ2UiOiJCNEpzelBjUzBIT1c3RUNUVFVVUkMxbXA2ejhhdDJiNkswbEQxdUtfMTFBIiwia2NfaWRwX2hpbnQiOiJiY2VpZGJvdGgiLCJyZXNwb25zZV9tb2RlIjoicXVlcnkifX0.2dLZTTjk8ZY0EFAaE88sAWQlfo7T17XcYLztnQwI_Yk; _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; FAILREASON=0; SMSESSION=Awk9KIrMNenX09Vl2cEMuy/VxV9CFVP4fsBzCp8Zo3AX2VsrDVWkOMVOdJyoY1Q1J9F8Vs8XFBtHTU29qS7+jlhEMK3f9j8tgudEVWHJq8LTizGhEj1cf8r7CX2QuxWMbdAHvK90hFnpocsL5xv2cAaFVdqhBKlIYkzwkY+r0YuH3Uh6DJVIhAhwjWeKfO6BAg5/jNFxQ31EPvzn4N7RxJK2bGyfAxzi6Cs6O7ieJ10MzcB8nWSIsO4ksfG8pzeGp9a+arl4maKnd9Je2L2FQohmiOjfGcrsezOgLgiWFl1B3+EL8ytArvtKhsFvr7WJsQuhYsQYzfY8shcfhNSltyqxLD422bDmU3NyZdhWY9313YG5I1U2vbO7zvXhxaCJYnpMrJR+inz8XsyqnGY1xu7AepY3pNd2wJH3twQJ42N6R2WlJVVN3oc3DvEHUbk85xrqHdwngd/FiMdEC2f5Kt51VYp8G/3R+sbFiy6Wt7wlZw2+/wI8EfxXs31HQ5q/RDUTXz6JMbzsR7EUOF+WkOrgi1nDugu13/O9hDnxPJnkzNGEfjt0xPxdhoDdl4vWdwRe1awBEn90SyJwc8+cFk1XACtvWoGwtPdf1xnHUwx5Ge1TqEd46xdjjlu+iTw2Xu5AsESUVVw81STsKA7vC8EBabQ+yXQHZlNFcFCKa1+AutNxfWHNQtnFK03kUCai4ZPJc/TQrhvf9DWjSyX+KknWdV6aQyz65KOpwtQWpd4ZlqAAKvf9vCQIBgk+YdsxFzAq6ySnLPcBLbFvP+Xyo5bcABg8IS9aJr6+05KT3ZOv49G1uYvz1ILaDED83D5NHF57ZswKR2911SevaqIO2i8NkZAJUMBpgroSejoJ1MxzpL/a7I26u6+p/08uMt/dT7vuo5OTTjayEtIlXy1IRXA/jU/uX/pKk1JrsZFhhwj7G5KEQpMAx+YvZUaaidqyfj3+fLb6+rsa8BukV8x0zfgUg20dm+Wu9XjDvyQHFP4Qt65CaUbhAKcVTgCChgTfSSdUJZIPPa5Yhzr7SmTuVGmYV/1cC4jGzNdSqr3Fq28fWukiEnRtqfZRXlOdA6xb + + + + + + + + + + false + + = + true + + + + + + + + https://${KEYCLOAK_LOGIN_URL}/auth/realms/standard/login-actions/post-broker-login?client_id=on-route-bc-direct-4598&tab_id=KAxYXjoatGc + GET + true + false + true + false + + + + + + + + + Host + ${KEYCLOAK_LOGIN_URL} + + + Connection + keep-alive + + + Cache-Control + max-age=0 + + + Upgrade-Insecure-Requests + 1 + + + User-Agent + Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 + + + Accept + text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 + + + Sec-Fetch-Site + same-site + + + Sec-Fetch-Mode + navigate + + + Sec-Fetch-Dest + document + + + sec-ch-ua + "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" + + + sec-ch-ua-mobile + ?0 + + + sec-ch-ua-platform + "Windows" + + + Accept-Encoding + gzip, deflate, br + + + Accept-Language + en-US,en;q=0.9 + + + Cookie + AUTH_SESSION_ID=0e56ff7b-e277-400f-84f5-25801c43c829.ycloak-78b4c74bcf-kh476; AUTH_SESSION_ID_LEGACY=0e56ff7b-e277-400f-84f5-25801c43c829.ycloak-78b4c74bcf-kh476; KC_RESTART=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICIzMmI0MzNkNC02NjgwLTQxODMtOTc2Yy1kZDdjMTg0YjExMTQifQ.eyJjaWQiOiJvbi1yb3V0ZS1iYy1kaXJlY3QtNDU5OCIsInB0eSI6Im9wZW5pZC1jb25uZWN0IiwicnVyaSI6Imh0dHBzOi8vb25yb3V0ZWJjLXRlc3QtZnJvbnRlbmQuYXBwcy5zaWx2ZXIuZGV2b3BzLmdvdi5iYy5jYS8iLCJhY3QiOiJBVVRIRU5USUNBVEUiLCJub3RlcyI6eyJzY29wZSI6Im9wZW5pZCIsImlzcyI6Imh0dHBzOi8vdGVzdC5sb2dpbnByb3h5Lmdvdi5iYy5jYS9hdXRoL3JlYWxtcy9zdGFuZGFyZCIsInJlc3BvbnNlX3R5cGUiOiJjb2RlIiwiY29kZV9jaGFsbGVuZ2VfbWV0aG9kIjoiUzI1NiIsInJlZGlyZWN0X3VyaSI6Imh0dHBzOi8vb25yb3V0ZWJjLXRlc3QtZnJvbnRlbmQuYXBwcy5zaWx2ZXIuZGV2b3BzLmdvdi5iYy5jYS8iLCJzdGF0ZSI6IjdiZTBmNDk4ZGRmYTQ1ZTI4ZWU4ZjI0MTY0NzViYTQyIiwiY29kZV9jaGFsbGVuZ2UiOiJCNEpzelBjUzBIT1c3RUNUVFVVUkMxbXA2ejhhdDJiNkswbEQxdUtfMTFBIiwia2NfaWRwX2hpbnQiOiJiY2VpZGJvdGgiLCJyZXNwb25zZV9tb2RlIjoicXVlcnkifX0.2dLZTTjk8ZY0EFAaE88sAWQlfo7T17XcYLztnQwI_Yk; _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; FAILREASON=0; SMSESSION=Awk9KIrMNenX09Vl2cEMuy/VxV9CFVP4fsBzCp8Zo3AX2VsrDVWkOMVOdJyoY1Q1J9F8Vs8XFBtHTU29qS7+jlhEMK3f9j8tgudEVWHJq8LTizGhEj1cf8r7CX2QuxWMbdAHvK90hFnpocsL5xv2cAaFVdqhBKlIYkzwkY+r0YuH3Uh6DJVIhAhwjWeKfO6BAg5/jNFxQ31EPvzn4N7RxJK2bGyfAxzi6Cs6O7ieJ10MzcB8nWSIsO4ksfG8pzeGp9a+arl4maKnd9Je2L2FQohmiOjfGcrsezOgLgiWFl1B3+EL8ytArvtKhsFvr7WJsQuhYsQYzfY8shcfhNSltyqxLD422bDmU3NyZdhWY9313YG5I1U2vbO7zvXhxaCJYnpMrJR+inz8XsyqnGY1xu7AepY3pNd2wJH3twQJ42N6R2WlJVVN3oc3DvEHUbk85xrqHdwngd/FiMdEC2f5Kt51VYp8G/3R+sbFiy6Wt7wlZw2+/wI8EfxXs31HQ5q/RDUTXz6JMbzsR7EUOF+WkOrgi1nDugu13/O9hDnxPJnkzNGEfjt0xPxdhoDdl4vWdwRe1awBEn90SyJwc8+cFk1XACtvWoGwtPdf1xnHUwx5Ge1TqEd46xdjjlu+iTw2Xu5AsESUVVw81STsKA7vC8EBabQ+yXQHZlNFcFCKa1+AutNxfWHNQtnFK03kUCai4ZPJc/TQrhvf9DWjSyX+KknWdV6aQyz65KOpwtQWpd4ZlqAAKvf9vCQIBgk+YdsxFzAq6ySnLPcBLbFvP+Xyo5bcABg8IS9aJr6+05KT3ZOv49G1uYvz1ILaDED83D5NHF57ZswKR2911SevaqIO2i8NkZAJUMBpgroSejoJ1MxzpL/a7I26u6+p/08uMt/dT7vuo5OTTjayEtIlXy1IRXA/jU/uX/pKk1JrsZFhhwj7G5KEQpMAx+YvZUaaidqyfj3+fLb6+rsa8BukV8x0zfgUg20dm+Wu9XjDvyQHFP4Qt65CaUbhAKcVTgCChgTfSSdUJZIPPa5Yhzr7SmTuVGmYV/1cC4jGzNdSqr3Fq28fWukiEnRtqfZRXlOdA6xb + + + + + + + + + + false + + = + true + + + + + + + + https://${KEYCLOAK_LOGIN_URL}/auth/realms/standard/.well-known/openid-configuration + GET + true + false + true + false + + + + + + + + + Host + ${KEYCLOAK_LOGIN_URL} + + + Connection + keep-alive + + + sec-ch-ua + "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" + + + Accept + application/jwk-set+json, application/json + + + sec-ch-ua-mobile + ?0 + + + User-Agent + Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 + + + sec-ch-ua-platform + "Windows" + + + Origin + https://${FRONTEND_API_URL} + + + Sec-Fetch-Site + same-site + + + Sec-Fetch-Mode + cors + + + Sec-Fetch-Dest + empty + + + Referer + https://${FRONTEND_API_URL}/ + + + Accept-Encoding + gzip, deflate, br + + + Accept-Language + en-US,en;q=0.9 + + + + + + + + continue + + false + 1 + + 1 + ${__P(rampup,300)} + 1365261073000 + 1365261073000 + true + ${__P(duration,3000)} + + true + + + + ${__P(Delay,10000)} + + + + + + + false + + = + true + + + + + + + + https://${FRONTEND_API_URL}/ + GET + true + false + true + false + + + + + + + + + Host + ${FRONTEND_API_URL} + + + Connection + keep-alive + + + Cache-Control + max-age=0 + + + sec-ch-ua + "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" + + + sec-ch-ua-mobile + ?0 + + + sec-ch-ua-platform + "Windows" + + + Upgrade-Insecure-Requests + 1 + + + User-Agent + Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 + + + Accept + text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 + + + Sec-Fetch-Site + same-origin + + + Sec-Fetch-Mode + navigate + + + Sec-Fetch-User + ?1 + + + Sec-Fetch-Dest + document + + + Accept-Encoding + gzip, deflate, br + + + Accept-Language + en-US,en;q=0.9 + + + Cookie + _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; FAILREASON=0; 9a75866e187615f9e3e688e8297548f9=1f5b60b83338df80ae3a11e1286008b7; SMSESSION=LOGGEDOFF + + + If-None-Match + W/"653ca247-308" + + + If-Modified-Since + Sat, 28 Oct 2023 05:55:19 GMT + + + + + + + + + + false + + = + true + + + + + + + + https://${KEYCLOAK_LOGIN_URL}/auth/realms/standard/.well-known/openid-configuration + GET + true + false + true + false + + + + + + + + + Host + ${KEYCLOAK_LOGIN_URL} + + + Connection + keep-alive + + + sec-ch-ua + "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" + + + Accept + application/jwk-set+json, application/json + + + sec-ch-ua-mobile + ?0 + + + User-Agent + Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 + + + sec-ch-ua-platform + "Windows" + + + Origin + https://${FRONTEND_API_URL} + + + Sec-Fetch-Site + same-site + + + Sec-Fetch-Mode + cors + + + Sec-Fetch-Dest + empty + + + Referer + https://${FRONTEND_API_URL}/ + + + Accept-Encoding + gzip, deflate, br + + + Accept-Language + en-US,en;q=0.9 + + + + + + + + + + false + + = + true + + + + + + + + https://${KEYCLOAK_LOGIN_URL}/auth/realms/standard/protocol/openid-connect/auth?client_id=on-route-bc-direct-4598&redirect_uri=https%3A%2F%2F${FRONTEND_API_URL}%2F&response_type=code&scope=openid&state=7be0f498ddfa45e28ee8f2416475ba42&code_challenge=B4JszPcS0HOW7ECTTUURC1mp6z8at2b6K0lD1uK_11A&code_challenge_method=S256&response_mode=query&kc_idp_hint=bceidboth + GET + true + false + true + false + + + + + + + + + Host + ${KEYCLOAK_LOGIN_URL} + + + Connection + keep-alive + + + sec-ch-ua + "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" + + + sec-ch-ua-mobile + ?0 + + + sec-ch-ua-platform + "Windows" + + + Upgrade-Insecure-Requests + 1 + + + User-Agent + Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 + + + Accept + text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 + + + Sec-Fetch-Site + same-site + + + Sec-Fetch-Mode + navigate + + + Sec-Fetch-User + ?1 + + + Sec-Fetch-Dest + document + + + Referer + https://${FRONTEND_API_URL}/ + + + Accept-Encoding + gzip, deflate, br + + + Accept-Language + en-US,en;q=0.9 + + + Cookie + AUTH_SESSION_ID=2e364c60-0ead-4ec1-98fb-0e1bba001f08.ycloak-78b4c74bcf-vtmwp; AUTH_SESSION_ID_LEGACY=2e364c60-0ead-4ec1-98fb-0e1bba001f08.ycloak-78b4c74bcf-vtmwp; _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; FAILREASON=0; SMSESSION=LOGGEDOFF + + + + + + + + + + false + + = + true + + + + + + + + https://${KEYCLOAK_LOGIN_URL}/auth/realms/standard/broker/bceidboth/login?session_code=5b_D1WNhNIzE-FZe70dEmhs_J2mpDyFSyQzWPAxnjYc&client_id=on-route-bc-direct-4598&tab_id=KAxYXjoatGc + GET + true + false + true + false + + + + + + + + + Host + ${KEYCLOAK_LOGIN_URL} + + + Connection + keep-alive + + + Upgrade-Insecure-Requests + 1 + + + User-Agent + Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 + + + Accept + text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 + + + Sec-Fetch-Site + same-site + + + Sec-Fetch-Mode + navigate + + + Sec-Fetch-User + ?1 + + + Sec-Fetch-Dest + document + + + sec-ch-ua + "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" + + + sec-ch-ua-mobile + ?0 + + + sec-ch-ua-platform + "Windows" + + + Accept-Encoding + gzip, deflate, br + + + Accept-Language + en-US,en;q=0.9 + + + Cookie + AUTH_SESSION_ID=0e56ff7b-e277-400f-84f5-25801c43c829.ycloak-78b4c74bcf-kh476; AUTH_SESSION_ID_LEGACY=0e56ff7b-e277-400f-84f5-25801c43c829.ycloak-78b4c74bcf-kh476; KC_RESTART=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICIzMmI0MzNkNC02NjgwLTQxODMtOTc2Yy1kZDdjMTg0YjExMTQifQ.eyJjaWQiOiJvbi1yb3V0ZS1iYy1kaXJlY3QtNDU5OCIsInB0eSI6Im9wZW5pZC1jb25uZWN0IiwicnVyaSI6Imh0dHBzOi8vb25yb3V0ZWJjLXRlc3QtZnJvbnRlbmQuYXBwcy5zaWx2ZXIuZGV2b3BzLmdvdi5iYy5jYS8iLCJhY3QiOiJBVVRIRU5USUNBVEUiLCJub3RlcyI6eyJzY29wZSI6Im9wZW5pZCIsImlzcyI6Imh0dHBzOi8vdGVzdC5sb2dpbnByb3h5Lmdvdi5iYy5jYS9hdXRoL3JlYWxtcy9zdGFuZGFyZCIsInJlc3BvbnNlX3R5cGUiOiJjb2RlIiwiY29kZV9jaGFsbGVuZ2VfbWV0aG9kIjoiUzI1NiIsInJlZGlyZWN0X3VyaSI6Imh0dHBzOi8vb25yb3V0ZWJjLXRlc3QtZnJvbnRlbmQuYXBwcy5zaWx2ZXIuZGV2b3BzLmdvdi5iYy5jYS8iLCJzdGF0ZSI6IjdiZTBmNDk4ZGRmYTQ1ZTI4ZWU4ZjI0MTY0NzViYTQyIiwiY29kZV9jaGFsbGVuZ2UiOiJCNEpzelBjUzBIT1c3RUNUVFVVUkMxbXA2ejhhdDJiNkswbEQxdUtfMTFBIiwia2NfaWRwX2hpbnQiOiJiY2VpZGJvdGgiLCJyZXNwb25zZV9tb2RlIjoicXVlcnkifX0.2dLZTTjk8ZY0EFAaE88sAWQlfo7T17XcYLztnQwI_Yk; _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; FAILREASON=0; SMSESSION=LOGGEDOFF + + + + + + + + + + false + + = + true + + + + + + + + https://${KEYCLOAK_LOGIN_URL}/auth/realms/bceidboth/protocol/openid-connect/auth?scope=openid&state=JvIyfmoj0AzmBZWw0ZS8lBmhMJXd7lA_uAR8JQvLNlE.KAxYXjoatGc.on-route-bc-direct-4598&response_type=code&client_id=standard-realm&redirect_uri=https%3A%2F%2F${KEYCLOAK_LOGIN_URL}%2Fauth%2Frealms%2Fstandard%2Fbroker%2Fbceidboth%2Fendpoint&nonce=1sKWmdZ0aV6QIscb65Lrmg + GET + true + false + true + false + + + + + + + + + Host + ${KEYCLOAK_LOGIN_URL} + + + Connection + keep-alive + + + Upgrade-Insecure-Requests + 1 + + + User-Agent + Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 + + + Accept + text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 + + + Sec-Fetch-Site + same-site + + + Sec-Fetch-Mode + navigate + + + Sec-Fetch-User + ?1 + + + Sec-Fetch-Dest + document + + + sec-ch-ua + "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" + + + sec-ch-ua-mobile + ?0 + + + sec-ch-ua-platform + "Windows" + + + Accept-Encoding + gzip, deflate, br + + + Accept-Language + en-US,en;q=0.9 + + + Cookie + AUTH_SESSION_ID=33769057-e4e2-49e9-821b-bab26d4e7507.ycloak-78b4c74bcf-gj9d6; AUTH_SESSION_ID_LEGACY=33769057-e4e2-49e9-821b-bab26d4e7507.ycloak-78b4c74bcf-gj9d6; KEYCLOAK_IDENTITY=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI1ZjExNjBiNS03Y2RjLTQ5NGQtYmFkOS0yZGRkNjU3MDU5Y2UifQ.eyJleHAiOjE2OTg3MzE3MzQsImlhdCI6MTY5ODY5NTczNCwianRpIjoiNzY3ZDEzMGEtMzczMC00NDdhLWEzNTUtNjhhNDhiMjgzZTI3IiwiaXNzIjoiaHR0cHM6Ly90ZXN0LmxvZ2lucHJveHkuZ292LmJjLmNhL2F1dGgvcmVhbG1zL2JjZWlkYm90aCIsInN1YiI6ImQ3M2FiN2IwLWUyMmEtNDg0NC04Yzc3LWU3YTQ2ODQyOTNmZCIsInR5cCI6IlNlcmlhbGl6ZWQtSUQiLCJzZXNzaW9uX3N0YXRlIjoiMzM3NjkwNTctZTRlMi00OWU5LTgyMWItYmFiMjZkNGU3NTA3Iiwic2lkIjoiMzM3NjkwNTctZTRlMi00OWU5LTgyMWItYmFiMjZkNGU3NTA3Iiwic3RhdGVfY2hlY2tlciI6Ik9SWEI4amY3Q3hPUWhzTUNhWU5nMHF2WHNzZG52cnlxUHFjMnFpUkthZncifQ.1kpL3Qpg4pyqSLBE0iDz7WZ0fdGzCCf6RCiN6HvFWqE; KEYCLOAK_IDENTITY_LEGACY=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI1ZjExNjBiNS03Y2RjLTQ5NGQtYmFkOS0yZGRkNjU3MDU5Y2UifQ.eyJleHAiOjE2OTg3MzE3MzQsImlhdCI6MTY5ODY5NTczNCwianRpIjoiNzY3ZDEzMGEtMzczMC00NDdhLWEzNTUtNjhhNDhiMjgzZTI3IiwiaXNzIjoiaHR0cHM6Ly90ZXN0LmxvZ2lucHJveHkuZ292LmJjLmNhL2F1dGgvcmVhbG1zL2JjZWlkYm90aCIsInN1YiI6ImQ3M2FiN2IwLWUyMmEtNDg0NC04Yzc3LWU3YTQ2ODQyOTNmZCIsInR5cCI6IlNlcmlhbGl6ZWQtSUQiLCJzZXNzaW9uX3N0YXRlIjoiMzM3NjkwNTctZTRlMi00OWU5LTgyMWItYmFiMjZkNGU3NTA3Iiwic2lkIjoiMzM3NjkwNTctZTRlMi00OWU5LTgyMWItYmFiMjZkNGU3NTA3Iiwic3RhdGVfY2hlY2tlciI6Ik9SWEI4amY3Q3hPUWhzTUNhWU5nMHF2WHNzZG52cnlxUHFjMnFpUkthZncifQ.1kpL3Qpg4pyqSLBE0iDz7WZ0fdGzCCf6RCiN6HvFWqE; KEYCLOAK_SESSION=bceidboth/d73ab7b0-e22a-4844-8c77-e7a4684293fd/33769057-e4e2-49e9-821b-bab26d4e7507; KEYCLOAK_SESSION_LEGACY=bceidboth/d73ab7b0-e22a-4844-8c77-e7a4684293fd/33769057-e4e2-49e9-821b-bab26d4e7507; _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; FAILREASON=0; SMSESSION=LOGGEDOFF + + + + + + + + + + false + + = + true + + + + + + + + https://${KEYCLOAK_LOGIN_URL}/auth/realms/bceidboth/broker/bceidboth/login?session_code=oRr0p7JZ9oL7vptnFPfNKhf_nrB8DND1rBojsNPjot0&client_id=standard-realm&tab_id=k5Vw5BDlfVQ + GET + true + false + true + false + + + + + + + + + Host + ${KEYCLOAK_LOGIN_URL} + + + Connection + keep-alive + + + Upgrade-Insecure-Requests + 1 + + + User-Agent + Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 + + + Accept + text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 + + + Sec-Fetch-Site + same-site + + + Sec-Fetch-Mode + navigate + + + Sec-Fetch-User + ?1 + + + Sec-Fetch-Dest + document + + + sec-ch-ua + "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" + + + sec-ch-ua-mobile + ?0 + + + sec-ch-ua-platform + "Windows" + + + Accept-Encoding + gzip, deflate, br + + + Accept-Language + en-US,en;q=0.9 + + + Cookie + AUTH_SESSION_ID=f26f78a0-28d2-40b4-9e57-b83fa590e32e.ycloak-78b4c74bcf-vtmwp; AUTH_SESSION_ID_LEGACY=f26f78a0-28d2-40b4-9e57-b83fa590e32e.ycloak-78b4c74bcf-vtmwp; KC_RESTART=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI1ZjExNjBiNS03Y2RjLTQ5NGQtYmFkOS0yZGRkNjU3MDU5Y2UifQ.eyJjaWQiOiJzdGFuZGFyZC1yZWFsbSIsInB0eSI6Im9wZW5pZC1jb25uZWN0IiwicnVyaSI6Imh0dHBzOi8vdGVzdC5sb2dpbnByb3h5Lmdvdi5iYy5jYS9hdXRoL3JlYWxtcy9zdGFuZGFyZC9icm9rZXIvYmNlaWRib3RoL2VuZHBvaW50IiwiYWN0IjoiQVVUSEVOVElDQVRFIiwibm90ZXMiOnsic2NvcGUiOiJvcGVuaWQiLCJpc3MiOiJodHRwczovL3Rlc3QubG9naW5wcm94eS5nb3YuYmMuY2EvYXV0aC9yZWFsbXMvYmNlaWRib3RoIiwicmVzcG9uc2VfdHlwZSI6ImNvZGUiLCJyZWRpcmVjdF91cmkiOiJodHRwczovL3Rlc3QubG9naW5wcm94eS5nb3YuYmMuY2EvYXV0aC9yZWFsbXMvc3RhbmRhcmQvYnJva2VyL2JjZWlkYm90aC9lbmRwb2ludCIsInN0YXRlIjoiSnZJeWZtb2owQXptQlpXdzBaUzhsQm1oTUpYZDdsQV91QVI4SlF2TE5sRS5LQXhZWGpvYXRHYy5vbi1yb3V0ZS1iYy1kaXJlY3QtNDU5OCIsIm5vbmNlIjoiMXNLV21kWjBhVjZRSXNjYjY1THJtZyJ9fQ.08S_Qi57kTkuLj_eH5VElw2zeuH4AVhfOUois5IUzEI; _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; FAILREASON=0; SMSESSION=LOGGEDOFF + + + + + + + + + + false + + = + true + + + + + + + + https://${SITEMINDER_URL}/clp-cgi/capBceid/logon.cgi?flags=0101:0,7&TYPE=33554433&REALMOID=06-b02c7ed2-895e-4953-bd03-8008c64ec906&GUID=&SMAUTHREASON=0&METHOD=GET&SMAGENTNAME=$SM$Lk6VtkyHw8x3zQIIsMiOiEXYFJF%2fJzjVT7eioCjxBjJck5VMlbxxrR%2bLZSo%2flIBX&TARGET=$SM$HTTPS%3a%2f%2fsfstest7%2egov%2ebc%2eca%2faffwebservices%2fredirectjsp%2ftestkeycloak-basicbusinessbceid%2fredirect%2ejsp%3fSMPORTALURL%3dhttps$%3A$%2F$%2Fsfstest7%2egov%2ebc%2eca$%2Faffwebservices$%2Fpublic$%2Fsaml2sso%26SAMLTRANSACTIONID%3dc9f189ad-7324de1b-2e045e1a-e8bcf162-a78af00c-c5 + GET + true + false + true + false + + + + + + + + + Host + ${SITEMINDER_URL} + + + Connection + keep-alive + + + Cache-Control + max-age=0 + + + Upgrade-Insecure-Requests + 1 + + + User-Agent + Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 + + + Accept + text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 + + + Sec-Fetch-Site + same-site + + + Sec-Fetch-Mode + navigate + + + Sec-Fetch-Dest + document + + + sec-ch-ua + "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" + + + sec-ch-ua-mobile + ?0 + + + sec-ch-ua-platform + "Windows" + + + Accept-Encoding + gzip, deflate, br + + + Accept-Language + en-US,en;q=0.9 + + + Cookie + _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; Dummy1=DummyVal1; BCGOVFlags=0101%3A0%2C7; BCGOVCustom=NULL; BCGOVBrand=NULL; BCGOVBehavior=NULL; Dummy2=DummyVal2; preDummy1=DummyVal1; preDummy2=DummyVal2; preDummy3=DummyVal3; BCGOVDoNotShow=1; preDummy4=DummyVal4; FAILREASON=0; BCGOVTarget=HTTPS%3A%2F%2Fsfstest7.gov.bc.ca%2Faffwebservices%2Fredirectjsp%2Ftestkeycloak-basicbusinessbceid%2Fredirect.jsp%3FSMPORTALURL%3Dhttps%253A%252F%252Fsfstest7.gov.bc.ca%252Faffwebservices%252Fpublic%252Fsaml2sso%26SAMLTRANSACTIONID%3Df7917115-57286b4a-df9cf6ff-b50e2f11-c566ac5a-f6; BCGOVclptryno=0; clp001=0; SMSESSION=LOGGEDOFF; SMFED_OLD_SESSION=""; SMFED_OLD_IDENTITY=""; GUID=1:26feb557-62af2c8c-4ef3a8d7-2e2277be-6a76895c-697 + + + + + + + true + + + + false + instance=instance_capBceid&user=ORBCTST3&password=orbcTST%2B2023 + = + + + + + + + + https://${SITEMINDER_URL}/clp-cgi/preLogon.cgi + POST + true + false + true + false + + + + + + + + + Host + ${SITEMINDER_URL} + + + Connection + keep-alive + + + Content-Length + 64 + + + Cache-Control + max-age=0 + + + sec-ch-ua + "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" + + + sec-ch-ua-mobile + ?0 + + + sec-ch-ua-platform + "Windows" + + + Upgrade-Insecure-Requests + 1 + + + Origin + https://${SITEMINDER_URL} + + + Content-Type + application/x-www-form-urlencoded + + + User-Agent + Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 + + + Accept + text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 + + + Sec-Fetch-Site + same-origin + + + Sec-Fetch-Mode + navigate + + + Sec-Fetch-User + ?1 + + + Sec-Fetch-Dest + document + + + Referer + https://${SITEMINDER_URL}/clp-cgi/capBceid/logon.cgi?flags=0101:0,7&TYPE=33554433&REALMOID=06-b02c7ed2-895e-4953-bd03-8008c64ec906&GUID=&SMAUTHREASON=0&METHOD=GET&SMAGENTNAME=$SM$Lk6VtkyHw8x3zQIIsMiOiEXYFJF%2fJzjVT7eioCjxBjJck5VMlbxxrR%2bLZSo%2flIBX&TARGET=$SM$HTTPS%3a%2f%2fsfstest7%2egov%2ebc%2eca%2faffwebservices%2fredirectjsp%2ftestkeycloak-basicbusinessbceid%2fredirect%2ejsp%3fSMPORTALURL%3dhttps$%3A$%2F$%2Fsfstest7%2egov%2ebc%2eca$%2Faffwebservices$%2Fpublic$%2Fsaml2sso%26SAMLTRANSACTIONID%3dc9f189ad-7324de1b-2e045e1a-e8bcf162-a78af00c-c5 + + + Accept-Encoding + gzip, deflate, br + + + Accept-Language + en-US,en;q=0.9 + + + Cookie + _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; Dummy1=DummyVal1; BCGOVFlags=0101%3A0%2C7; BCGOVCustom=NULL; BCGOVBrand=NULL; BCGOVBehavior=NULL; Dummy2=DummyVal2; preDummy1=DummyVal1; preDummy2=DummyVal2; preDummy3=DummyVal3; BCGOVDoNotShow=1; preDummy4=DummyVal4; FAILREASON=0; clp001=0; SMSESSION=LOGGEDOFF; SMFED_OLD_SESSION=""; SMFED_OLD_IDENTITY=""; GUID=1:26feb557-62af2c8c-4ef3a8d7-2e2277be-6a76895c-697; BCGOVTarget=HTTPS%3A%2F%2Fsfstest7.gov.bc.ca%2Faffwebservices%2Fredirectjsp%2Ftestkeycloak-basicbusinessbceid%2Fredirect.jsp%3FSMPORTALURL%3Dhttps%253A%252F%252Fsfstest7.gov.bc.ca%252Faffwebservices%252Fpublic%252Fsaml2sso%26SAMLTRANSACTIONID%3Dc9f189ad-7324de1b-2e045e1a-e8bcf162-a78af00c-c5; BCGOVclptryno=1 + + + + + + + true + + + + false + SMENC=ISO-8859-1&SMLOCALE=US-EN&target=%2Fclp-cgi%2Fcap07%2Fprivate%2FpostLogon.cgi&smauthreason=0&smagentname=&user=ORBCTST3&password=orbcTST%2B2023 + = + + + + + + + + https://${SITEMINDER_URL}/clp-cgi/cap07/logon.fcc + POST + true + false + true + false + + + + + + + + + Host + ${SITEMINDER_URL} + + + Connection + keep-alive + + + Content-Length + 149 + + + Cache-Control + max-age=0 + + + sec-ch-ua + "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" + + + sec-ch-ua-mobile + ?0 + + + sec-ch-ua-platform + "Windows" + + + Upgrade-Insecure-Requests + 1 + + + Origin + https://${SITEMINDER_URL} + + + Content-Type + application/x-www-form-urlencoded + + + User-Agent + Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 + + + Accept + text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 + + + Sec-Fetch-Site + same-origin + + + Sec-Fetch-Mode + navigate + + + Sec-Fetch-Dest + document + + + Referer + https://${SITEMINDER_URL}/clp-cgi/preLogon.cgi + + + Accept-Encoding + gzip, deflate, br + + + Accept-Language + en-US,en;q=0.9 + + + Cookie + _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; Dummy1=DummyVal1; BCGOVFlags=0101%3A0%2C7; BCGOVCustom=NULL; BCGOVBrand=NULL; BCGOVBehavior=NULL; Dummy2=DummyVal2; preDummy1=DummyVal1; preDummy2=DummyVal2; preDummy3=DummyVal3; BCGOVDoNotShow=1; preDummy4=DummyVal4; FAILREASON=0; SMSESSION=LOGGEDOFF; SMFED_OLD_SESSION=""; SMFED_OLD_IDENTITY=""; GUID=1:26feb557-62af2c8c-4ef3a8d7-2e2277be-6a76895c-697; BCGOVTarget=HTTPS%3A%2F%2Fsfstest7.gov.bc.ca%2Faffwebservices%2Fredirectjsp%2Ftestkeycloak-basicbusinessbceid%2Fredirect.jsp%3FSMPORTALURL%3Dhttps%253A%252F%252Fsfstest7.gov.bc.ca%252Faffwebservices%252Fpublic%252Fsaml2sso%26SAMLTRANSACTIONID%3Dc9f189ad-7324de1b-2e045e1a-e8bcf162-a78af00c-c5; BCGOVclptryno=1; clp001=Salted__%8E%F5%14%93%F3.%C8%8C%C2%B3%84%8B%8EC%E0%88%AAK%01%C77%B6%C4g%C3%D2%3ELS%06%7CdJp%18%E9TJ%8A%D3a%A9%AD%3C%5E%DBZ%D7 + + + + + + + + + + false + + = + + + + + + + + https://${SITEMINDER_URL}/clp-cgi/cap07/private/postLogon.cgi + GET + true + false + true + false + + + + + + + + + Host + ${SITEMINDER_URL} + + + Connection + keep-alive + + + Cache-Control + max-age=0 + + + Upgrade-Insecure-Requests + 1 + + + User-Agent + Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 + + + Accept + text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 + + + Sec-Fetch-Site + same-origin + + + Sec-Fetch-Mode + navigate + + + Sec-Fetch-Dest + document + + + sec-ch-ua + "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" + + + sec-ch-ua-mobile + ?0 + + + sec-ch-ua-platform + "Windows" + + + Referer + https://${SITEMINDER_URL}/clp-cgi/preLogon.cgi + + + Accept-Encoding + gzip, deflate, br + + + Accept-Language + en-US,en;q=0.9 + + + Cookie + _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; Dummy1=DummyVal1; BCGOVFlags=0101%3A0%2C7; BCGOVCustom=NULL; BCGOVBrand=NULL; BCGOVBehavior=NULL; Dummy2=DummyVal2; preDummy1=DummyVal1; preDummy2=DummyVal2; preDummy3=DummyVal3; BCGOVDoNotShow=1; preDummy4=DummyVal4; FAILREASON=0; SMSESSION=LOGGEDOFF; SMFED_OLD_SESSION=""; SMFED_OLD_IDENTITY=""; GUID=1:26feb557-62af2c8c-4ef3a8d7-2e2277be-6a76895c-697; BCGOVTarget=HTTPS%3A%2F%2Fsfstest7.gov.bc.ca%2Faffwebservices%2Fredirectjsp%2Ftestkeycloak-basicbusinessbceid%2Fredirect.jsp%3FSMPORTALURL%3Dhttps%253A%252F%252Fsfstest7.gov.bc.ca%252Faffwebservices%252Fpublic%252Fsaml2sso%26SAMLTRANSACTIONID%3Dc9f189ad-7324de1b-2e045e1a-e8bcf162-a78af00c-c5; BCGOVclptryno=1; clp001=Salted__%8E%F5%14%93%F3.%C8%8C%C2%B3%84%8B%8EC%E0%88%AAK%01%C77%B6%C4g%C3%D2%3ELS%06%7CdJp%18%E9TJ%8A%D3a%A9%AD%3C%5E%DBZ%D7; FORMCRED=2ZS4S2F4tb41FWGyAD293ZV3eiMsCRYZ+ktOitYzjWY/fG/2BFtCWHSnbkvgJfBEm8aTuwAg3nMfeG0h8ahL0C1Q+SZp1d30x/imUNpQkjqP7yK+smpXGQMNWzNb15A+UXcYa0yUQLQ5rFoH720FIoiqZ4Nmikk7a67vktQxd8rpIduHeZJ7tAYb/b+pXPha + + + + + + + true + + + + false + RelayState=pkQKGHDSoVdRPpUZ1XHJWrVAUBtEl2EOcIu2bUhv0V0.k5Vw5BDlfVQ.standard-realm&SAMLResponse=PG5zNTpSZXNwb25zZSB4bWxuczpuczU9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpwcm90b2NvbCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDkveG1sZW5jMTEjIiB4bWxuczpuczI9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphc3NlcnRpb24iIHhtbG5zOm5zMz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyIgeG1sbnM6bnM0PSJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzA0L3htbGVuYyMiIERlc3RpbmF0aW9uPSJodHRwczovL3Rlc3QubG9naW5wcm94eS5nb3YuYmMuY2EvYXV0aC9yZWFsbXMvYmNlaWRib3RoL2Jyb2tlci9iY2VpZGJvdGgvZW5kcG9pbnQiIElEPSJfMzU0NWZlNjJmOGY3OThhNTk1ZWNlM2I2YzYxM2RmNmU5ZWFkIiBJblJlc3BvbnNlVG89IklEX2FhYTM1M2Q0LTdlNmMtNDQxNS05N2FkLWI2NmEzM2FhOTBkYyIgSXNzdWVJbnN0YW50PSIyMDIzLTEwLTMwVDE5OjU2OjM3LjE4MFoiIFZlcnNpb249IjIuMCI%2BDQogICAgPG5zMjpJc3N1ZXIgRm9ybWF0PSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6bmFtZWlkLWZvcm1hdDplbnRpdHkiPmh0dHBzOi8vdGVzdC5sb2dpbnByb3h5Lmdvdi5iYy5jYS9hdXRoL3JlYWxtcy9fYmNlaWRiYXNpY2J1c2luZXNzMS88L25zMjpJc3N1ZXI%2BDQogICAgPG5zNTpTdGF0dXM%2BDQogICAgICAgIDxuczU6U3RhdHVzQ29kZSBWYWx1ZT0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOnN0YXR1czpTdWNjZXNzIi8%2BDQogICAgPC9uczU6U3RhdHVzPg0KICAgIDxuczI6QXNzZXJ0aW9uIElEPSJfZWFmZTRjYWQ5MjU0MTEyZjQ5YTcxMDI1MGM3YjVhNDVjYmI2IiBJc3N1ZUluc3RhbnQ9IjIwMjMtMTAtMzBUMTk6NTY6MzcuMTgwWiIgVmVyc2lvbj0iMi4wIiB4bWxuczpuczI9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphc3NlcnRpb24iPg0KICAgICAgICA8bnMyOklzc3VlciBGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpuYW1laWQtZm9ybWF0OmVudGl0eSI%2BaHR0cHM6Ly90ZXN0LmxvZ2lucHJveHkuZ292LmJjLmNhL2F1dGgvcmVhbG1zL19iY2VpZGJhc2ljYnVzaW5lc3MxLzwvbnMyOklzc3Vlcj48ZHM6U2lnbmF0dXJlIHhtbG5zOmRzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIj48ZHM6U2lnbmVkSW5mbz48ZHM6Q2Fub25pY2FsaXphdGlvbk1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvMTAveG1sLWV4Yy1jMTRuIyIvPjxkczpTaWduYXR1cmVNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzA0L3htbGRzaWctbW9yZSNyc2Etc2hhMjU2Ii8%2BPGRzOlJlZmVyZW5jZSBVUkk9IiNfZWFmZTRjYWQ5MjU0MTEyZjQ5YTcxMDI1MGM3YjVhNDVjYmI2Ij48ZHM6VHJhbnNmb3Jtcz48ZHM6VHJhbnNmb3JtIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI2VudmVsb3BlZC1zaWduYXR1cmUiLz48ZHM6VHJhbnNmb3JtIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS8xMC94bWwtZXhjLWMxNG4jIi8%2BPC9kczpUcmFuc2Zvcm1zPjxkczpEaWdlc3RNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzA0L3htbGVuYyNzaGEyNTYiLz48ZHM6RGlnZXN0VmFsdWU%2BS0c3SWRyMko3ODNGVGFkNkVZM0hHUklyRFpnUXU1TmdOQ1JBRU1vcERkYz08L2RzOkRpZ2VzdFZhbHVlPjwvZHM6UmVmZXJlbmNlPjwvZHM6U2lnbmVkSW5mbz48ZHM6U2lnbmF0dXJlVmFsdWU%2BbHJlNnpwalpyUEpKZmVqYStkUHN3cUhlVDN6a3VkNjA4emppZE4vWlBRMjdmSW56aHFWQ2lreDhHcld4V29jSWM4ekhHb1cxZmJqTXlBSkIwNnRHS2pXdzBXMWExTlIyL2VlVGQ1MFY1RnF4NndIb001NFVmYUkvY0N6dDdsMUNUQ2lHZzB6UkVLZjRDK3RxcWJaQ3QyRlFCQ20vd0xaNHRrdXVsZUh4WTZqdGJxWXBlbmpvSzQ2TGlocE1CejIvczBDRmQ3c1BxVjF4bHJpWXVtd1dtSlV1b0o1d0M1L2ZMZ3djTUlmSVMwd29SZmQzclBTN1pBWk5vWXExVVpWQ2xmemZMZ1hNc3JsM2k2S0F3SS80N01pSVpzeGNaaFd1Q3dMTFdFSXdzRWQzWlNLZFhXUTF1U0RrSGlIUGIrcXFmSTJQRGJwK2l1bHFDdlo2S3BCVzdnPT08L2RzOlNpZ25hdHVyZVZhbHVlPjxkczpLZXlJbmZvIHhtbG5zOmRzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIj48ZHM6WDUwOURhdGE%2BPGRzOlg1MDlDZXJ0aWZpY2F0ZT5NSUlFQ3pDQ0F2TUNDUUNkb1dONFh0VUk2VEFOQmdrcWhraUc5dzBCQVFzRkFEQ0J5akVMTUFrR0ExVUVCaE1DUTBFeEdUQVhCZ05WQkFnVEVFSnlhWFJwYzJnZ1EyOXNkVzFpYVdFeEVUQVBCZ05WQkFjVENGWnBZM1J2Y21saE1UY3dOUVlEVlFRS0V5NUhiM1psY201dFpXNTBJRzltSUhSb1pTQlFjbTkyYVc1alpTQnZaaUJDY21sMGFYTm9JRU52YkhWdFltbGhNUTh3RFFZRFZRUUxFd1pUUmxNdFEwRXhJakFnQmdOVkJBTVRHVk5HVXlCRFpYSjBhV1pwWTJGMFpTQkJkWFJvYjNKcGRIa3hIekFkQmdrcWhraUc5dzBCQ1FFV0VGZFVVMWRCVFVCbmIzWXVZbU11WTJFd0hoY05NVE13TkRBMU1qSTFOalUzV2hjTk16TXdOREExTWpJMU5qVTNXakNCd3pFTE1Ba0dBMVVFQmhNQ1EwRXhHVEFYQmdOVkJBZ1RFRUp5YVhScGMyZ2dRMjlzZFcxaWFXRXhFVEFQQmdOVkJBY1RDRlpwWTNSdmNtbGhNVGN3TlFZRFZRUUtFeTVIYjNabGNtNXRaVzUwSUc5bUlIUm9aU0JRY205MmFXNWpaU0J2WmlCQ2NtbDBhWE5vSUVOdmJIVnRZbWxoTVF3d0NnWURWUVFMRXdOVFJsTXhIakFjQmdOVkJBTVRGWE5tY3kxelpuTjBaWE4wTG1kdmRpNWlZeTVqWVRFZk1CMEdDU3FHU0liM0RRRUpBUllRVjFSVFYwRk5RR2R2ZGk1aVl5NWpZVENDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFKdzVFMDQ1amxKK3NiU2dOZmt2eUpBMysyN0tSQm1BbHErTVVSb1IzT1NpV2MyME1XZHQ1cEt4ZFJVcTJmWXhyUWp0cnRQdUdxa2tFR2FlSTBpTlp3UkluYnk2SHU2dWJDd2YxUTdmVGxXNzhscytDak5rWU5VQzMvd3VDM21uMVFuZzhVMGxkUTd0UVU0Y1BPcXdMSXZTaUpkaUpacm1GOFJEcHBvZFljSGhiaWo3N3Q2dGlIVkN4UVlncXhOY3V0M2d3bnhWcjI0MTZ5V0hYVnFxcGNjS0xUaUkvSm9lQ2I1b0kyVVVDcmRldnlXZDRINXFOWmx5NGhMNVBCQ1lZNFR1cFVheWpoYldmeEpLNFVXY0R2N09PYSt1eHE0a1luR2V4RHBxQ2JXNmJ2Y0hiazQ3UDVSQVpJdmd2bkdvQmdTZm9oMzd6eFEvRnA2VkU0aVdBdWNDQXdFQUFUQU5CZ2txaGtpRzl3MEJBUXNGQUFPQ0FRRUFiZGtqUTl1SHB2ZGtTZUlHT25meHU0Vm5mM2pHTzR5bzgrQnJub0dhTEM4aTJDV21Wb2RpOUdPdTNIM2pyR3ZzU296N242QzJBK3ZJdkR4dkE3dHdqd0xBcXVaVlFKbkJDcE1LbXdsUENBQ0F3WitFbGI0cjJxTW14YTJGbTBJZVl6M3gyQldZT0FUdGljODFmRnpoSjhRa1dCdXdiOStkSiswbC9HR1FmOXBPMnFpSXFVRWQyb0lVVkR4cVdSWXpoUGV6ZWpwZlZqQnNUUFhZNXhRaGRCVUtITXIwWnBTVTlrTW9KemNNMW42bEpIN3BGSFpCVUtONzkyaG9FNTVPbEszTFFMVW9oKzNXNEROL1lWS2tEczZrSHI0b0w2dXo5ajJXODRIVVBYNURMbUZGaUorTHBTMDUyVkJ0WWNoangyQnQwRlBzSEpKNEMwRjByNUc0b3c9PTwvZHM6WDUwOUNlcnRpZmljYXRlPjwvZHM6WDUwOURhdGE%2BPC9kczpLZXlJbmZvPjwvZHM6U2lnbmF0dXJlPg0KICAgICAgICA8bnMyOlN1YmplY3Q%2BDQogICAgICAgICAgICA8bnMyOk5hbWVJRCBGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpuYW1laWQtZm9ybWF0OnBlcnNpc3RlbnQiPkE5RUQyQzU3NDJEQzQ1NTk5ODY3MkNDMkExMTgxNzRCPC9uczI6TmFtZUlEPg0KICAgICAgICAgICAgPG5zMjpTdWJqZWN0Q29uZmlybWF0aW9uIE1ldGhvZD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmNtOmJlYXJlciI%2BDQogICAgICAgICAgICAgICAgPG5zMjpTdWJqZWN0Q29uZmlybWF0aW9uRGF0YSBJblJlc3BvbnNlVG89IklEX2FhYTM1M2Q0LTdlNmMtNDQxNS05N2FkLWI2NmEzM2FhOTBkYyIgTm90T25PckFmdGVyPSIyMDIzLTEwLTMwVDE5OjU4OjA3LjE0OFoiIFJlY2lwaWVudD0iaHR0cHM6Ly90ZXN0LmxvZ2lucHJveHkuZ292LmJjLmNhL2F1dGgvcmVhbG1zL2JjZWlkYm90aC9icm9rZXIvYmNlaWRib3RoL2VuZHBvaW50Ii8%2BDQogICAgICAgICAgICA8L25zMjpTdWJqZWN0Q29uZmlybWF0aW9uPg0KICAgICAgICA8L25zMjpTdWJqZWN0Pg0KICAgICAgICA8bnMyOkNvbmRpdGlvbnMgTm90QmVmb3JlPSIyMDIzLTEwLTMwVDE5OjU2OjA3LjE0OFoiIE5vdE9uT3JBZnRlcj0iMjAyMy0xMC0zMFQxOTo1ODowNy4xNDhaIj4NCiAgICAgICAgICAgIDxuczI6QXVkaWVuY2VSZXN0cmljdGlvbj4NCiAgICAgICAgICAgICAgICA8bnMyOkF1ZGllbmNlPmh0dHBzOi8vdGVzdC5sb2dpbnByb3h5Lmdvdi5iYy5jYS9hdXRoL3JlYWxtcy9fYmNlaWRiYXNpY2J1c2luZXNzMS88L25zMjpBdWRpZW5jZT4NCiAgICAgICAgICAgIDwvbnMyOkF1ZGllbmNlUmVzdHJpY3Rpb24%2BDQogICAgICAgIDwvbnMyOkNvbmRpdGlvbnM%2BDQogICAgICAgIDxuczI6QXV0aG5TdGF0ZW1lbnQgQXV0aG5JbnN0YW50PSIyMDIzLTEwLTMwVDE5OjU2OjM1LjEzMloiIFNlc3Npb25JbmRleD0ibGdlQ1pvN01aRnpJaFFiU1dGcXg1SDJiK1U0PXlMMWRQUT09IiBTZXNzaW9uTm90T25PckFmdGVyPSIyMDIzLTEwLTMwVDE5OjU4OjA3LjEzMloiPg0KICAgICAgICAgICAgPG5zMjpBdXRobkNvbnRleHQ%2BDQogICAgICAgICAgICAgICAgPG5zMjpBdXRobkNvbnRleHRDbGFzc1JlZj51cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6YWM6Y2xhc3NlczpQYXNzd29yZDwvbnMyOkF1dGhuQ29udGV4dENsYXNzUmVmPg0KICAgICAgICAgICAgPC9uczI6QXV0aG5Db250ZXh0Pg0KICAgICAgICA8L25zMjpBdXRoblN0YXRlbWVudD4NCiAgICAgICAgPG5zMjpBdHRyaWJ1dGVTdGF0ZW1lbnQ%2BDQogICAgICAgICAgICA8bnMyOkF0dHJpYnV0ZSBOYW1lPSJiY2VpZF91c2VybmFtZSIgTmFtZUZvcm1hdD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmF0dHJuYW1lLWZvcm1hdDp1bnNwZWNpZmllZCI%2BDQogICAgICAgICAgICAgICAgPG5zMjpBdHRyaWJ1dGVWYWx1ZSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTp0eXBlPSJ4czpzdHJpbmciPk9SQkNUU1QzPC9uczI6QXR0cmlidXRlVmFsdWU%2BDQogICAgICAgICAgICA8L25zMjpBdHRyaWJ1dGU%2BDQogICAgICAgICAgICA8bnMyOkF0dHJpYnV0ZSBOYW1lPSJkaXNwbGF5X25hbWUiIE5hbWVGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphdHRybmFtZS1mb3JtYXQ6dW5zcGVjaWZpZWQiPg0KICAgICAgICAgICAgICAgIDxuczI6QXR0cmlidXRlVmFsdWUgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6dHlwZT0ieHM6c3RyaW5nIj5CcnlhbiBMYW5lPC9uczI6QXR0cmlidXRlVmFsdWU%2BDQogICAgICAgICAgICA8L25zMjpBdHRyaWJ1dGU%2BDQogICAgICAgICAgICA8bnMyOkF0dHJpYnV0ZSBOYW1lPSJiY2VpZF91c2VyX2d1aWQiIE5hbWVGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphdHRybmFtZS1mb3JtYXQ6dW5zcGVjaWZpZWQiPg0KICAgICAgICAgICAgICAgIDxuczI6QXR0cmlidXRlVmFsdWUgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6dHlwZT0ieHM6c3RyaW5nIj5BOUVEMkM1NzQyREM0NTU5OTg2NzJDQzJBMTE4MTc0QjwvbnMyOkF0dHJpYnV0ZVZhbHVlPg0KICAgICAgICAgICAgPC9uczI6QXR0cmlidXRlPg0KICAgICAgICAgICAgPG5zMjpBdHRyaWJ1dGUgTmFtZT0iZW1haWwiIE5hbWVGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphdHRybmFtZS1mb3JtYXQ6dW5zcGVjaWZpZWQiPg0KICAgICAgICAgICAgICAgIDxuczI6QXR0cmlidXRlVmFsdWUgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6dHlwZT0ieHM6c3RyaW5nIj5icnlhbi5sYW5lQGdvdi5iYy5jYTwvbnMyOkF0dHJpYnV0ZVZhbHVlPg0KICAgICAgICAgICAgPC9uczI6QXR0cmlidXRlPg0KICAgICAgICA8bnMyOkF0dHJpYnV0ZSBOYW1lPSJTTUdPVl9CVVNJTkVTU0dVSUQiIE5hbWVGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphdHRybmFtZS1mb3JtYXQ6dW5zcGVjaWZpZWQiPjxuczI6QXR0cmlidXRlVmFsdWU%2BRjQwMjNEQjNDMzBGNDg3QjlBRjVCMTRDOTU4OTg5Rjg8L25zMjpBdHRyaWJ1dGVWYWx1ZT48L25zMjpBdHRyaWJ1dGU%2BPG5zMjpBdHRyaWJ1dGUgTmFtZT0iU01HT1ZfQlVTSU5FU1NMRUdBTE5BTUUiIE5hbWVGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphdHRybmFtZS1mb3JtYXQ6dW5zcGVjaWZpZWQiPjxuczI6QXR0cmlidXRlVmFsdWU%2BU29uaWMgRGVsaXZlcnkgU2VydmljZXM8L25zMjpBdHRyaWJ1dGVWYWx1ZT48L25zMjpBdHRyaWJ1dGU%2BPC9uczI6QXR0cmlidXRlU3RhdGVtZW50Pg0KICAgIDwvbnMyOkFzc2VydGlvbj4NCjwvbnM1OlJlc3BvbnNlPg%3D%3D + = + + + + + + + + https://${KEYCLOAK_LOGIN_URL}/auth/realms/bceidboth/broker/bceidboth/endpoint + POST + true + false + true + false + + + + + + + + + Host + ${KEYCLOAK_LOGIN_URL} + + + Connection + keep-alive + + + Content-Length + 9217 + + + Cache-Control + max-age=0 + + + sec-ch-ua + "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" + + + sec-ch-ua-mobile + ?0 + + + sec-ch-ua-platform + "Windows" + + + Upgrade-Insecure-Requests + 1 + + + Origin + https://sfstest7.gov.bc.ca + + + Content-Type + application/x-www-form-urlencoded + + + User-Agent + Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 + + + Accept + text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 + + + Sec-Fetch-Site + same-site + + + Sec-Fetch-Mode + navigate + + + Sec-Fetch-Dest + document + + + Referer + https://sfstest7.gov.bc.ca/ + + + Accept-Encoding + gzip, deflate, br + + + Accept-Language + en-US,en;q=0.9 + + + Cookie + AUTH_SESSION_ID=f26f78a0-28d2-40b4-9e57-b83fa590e32e.ycloak-78b4c74bcf-vtmwp; AUTH_SESSION_ID_LEGACY=f26f78a0-28d2-40b4-9e57-b83fa590e32e.ycloak-78b4c74bcf-vtmwp; KC_RESTART=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI1ZjExNjBiNS03Y2RjLTQ5NGQtYmFkOS0yZGRkNjU3MDU5Y2UifQ.eyJjaWQiOiJzdGFuZGFyZC1yZWFsbSIsInB0eSI6Im9wZW5pZC1jb25uZWN0IiwicnVyaSI6Imh0dHBzOi8vdGVzdC5sb2dpbnByb3h5Lmdvdi5iYy5jYS9hdXRoL3JlYWxtcy9zdGFuZGFyZC9icm9rZXIvYmNlaWRib3RoL2VuZHBvaW50IiwiYWN0IjoiQVVUSEVOVElDQVRFIiwibm90ZXMiOnsic2NvcGUiOiJvcGVuaWQiLCJpc3MiOiJodHRwczovL3Rlc3QubG9naW5wcm94eS5nb3YuYmMuY2EvYXV0aC9yZWFsbXMvYmNlaWRib3RoIiwicmVzcG9uc2VfdHlwZSI6ImNvZGUiLCJyZWRpcmVjdF91cmkiOiJodHRwczovL3Rlc3QubG9naW5wcm94eS5nb3YuYmMuY2EvYXV0aC9yZWFsbXMvc3RhbmRhcmQvYnJva2VyL2JjZWlkYm90aC9lbmRwb2ludCIsInN0YXRlIjoiSnZJeWZtb2owQXptQlpXdzBaUzhsQm1oTUpYZDdsQV91QVI4SlF2TE5sRS5LQXhZWGpvYXRHYy5vbi1yb3V0ZS1iYy1kaXJlY3QtNDU5OCIsIm5vbmNlIjoiMXNLV21kWjBhVjZRSXNjYjY1THJtZyJ9fQ.08S_Qi57kTkuLj_eH5VElw2zeuH4AVhfOUois5IUzEI; _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; FAILREASON=0; SMSESSION=Awk9KIrMNenX09Vl2cEMuy/VxV9CFVP4fsBzCp8Zo3AX2VsrDVWkOMVOdJyoY1Q1J9F8Vs8XFBtHTU29qS7+jlhEMK3f9j8tgudEVWHJq8LTizGhEj1cf8r7CX2QuxWMbdAHvK90hFnpocsL5xv2cAaFVdqhBKlIYkzwkY+r0YuH3Uh6DJVIhAhwjWeKfO6BAg5/jNFxQ31EPvzn4N7RxJK2bGyfAxzi6Cs6O7ieJ10MzcB8nWSIsO4ksfG8pzeGp9a+arl4maKnd9Je2L2FQohmiOjfGcrsezOgLgiWFl1B3+EL8ytArvtKhsFvr7WJsQuhYsQYzfY8shcfhNSltyqxLD422bDmU3NyZdhWY9313YG5I1U2vbO7zvXhxaCJYnpMrJR+inz8XsyqnGY1xu7AepY3pNd2wJH3twQJ42N6R2WlJVVN3oc3DvEHUbk85xrqHdwngd/FiMdEC2f5Kt51VYp8G/3R+sbFiy6Wt7wlZw2+/wI8EfxXs31HQ5q/RDUTXz6JMbzsR7EUOF+WkOrgi1nDugu13/O9hDnxPJnkzNGEfjt0xPxdhoDdl4vWdwRe1awBEn90SyJwc8+cFk1XACtvWoGwtPdf1xnHUwx5Ge1TqEd46xdjjlu+iTw2Xu5AsESUVVw81STsKA7vC8EBabQ+yXQHZlNFcFCKa1+AutNxfWHNQtnFK03kUCai4ZPJc/TQrhvf9DWjSyX+KknWdV6aQyz65KOpwtQWpd4ZlqAAKvf9vCQIBgk+YdsxFzAq6ySnLPcBLbFvP+Xyo5bcABg8IS9aJr6+05KT3ZOv49G1uYvz1ILaDED83D5NHF57ZswKR2911SevaqIO2i8NkZAJUMBpgroSejoJ1MxzpL/a7I26u6+p/08uMt/dT7vuo5OTTjayEtIlXy1IRXA/jU/uX/pKk1JrsZFhhwj7G5KEQpMAx+YvZUaaidqyfj3+fLb6+rsa8BukV8x0zfgUg20dm+Wu9XjDvyQHFP4Qt65CaUbhAKcVTgCChgTfSSdUJZIPPa5Yhzr7SmTuVGmYV/1cC4jGzNdSqr3Fq28fWukiEnRtqfZRXlOdA6xb + + + + + + + + + + false + + = + + + + + + + + https://${KEYCLOAK_LOGIN_URL}/auth/realms/standard/broker/bceidboth/endpoint?state=JvIyfmoj0AzmBZWw0ZS8lBmhMJXd7lA_uAR8JQvLNlE.KAxYXjoatGc.on-route-bc-direct-4598&session_state=f26f78a0-28d2-40b4-9e57-b83fa590e32e&code=c5719177-78e8-4d75-857a-0ef191c765d1.f26f78a0-28d2-40b4-9e57-b83fa590e32e.1123d85b-badf-4084-a3a6-b1c920ccb0c0 + GET + true + false + true + false + + + + + + + + + Host + ${KEYCLOAK_LOGIN_URL} + + + Connection + keep-alive + + + Cache-Control + max-age=0 + + + Upgrade-Insecure-Requests + 1 + + + User-Agent + Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 + + + Accept + text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 + + + Sec-Fetch-Site + same-site + + + Sec-Fetch-Mode + navigate + + + Sec-Fetch-Dest + document + + + sec-ch-ua + "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" + + + sec-ch-ua-mobile + ?0 + + + sec-ch-ua-platform + "Windows" + + + Accept-Encoding + gzip, deflate, br + + + Accept-Language + en-US,en;q=0.9 + + + Cookie + AUTH_SESSION_ID=0e56ff7b-e277-400f-84f5-25801c43c829.ycloak-78b4c74bcf-kh476; AUTH_SESSION_ID_LEGACY=0e56ff7b-e277-400f-84f5-25801c43c829.ycloak-78b4c74bcf-kh476; KC_RESTART=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICIzMmI0MzNkNC02NjgwLTQxODMtOTc2Yy1kZDdjMTg0YjExMTQifQ.eyJjaWQiOiJvbi1yb3V0ZS1iYy1kaXJlY3QtNDU5OCIsInB0eSI6Im9wZW5pZC1jb25uZWN0IiwicnVyaSI6Imh0dHBzOi8vb25yb3V0ZWJjLXRlc3QtZnJvbnRlbmQuYXBwcy5zaWx2ZXIuZGV2b3BzLmdvdi5iYy5jYS8iLCJhY3QiOiJBVVRIRU5USUNBVEUiLCJub3RlcyI6eyJzY29wZSI6Im9wZW5pZCIsImlzcyI6Imh0dHBzOi8vdGVzdC5sb2dpbnByb3h5Lmdvdi5iYy5jYS9hdXRoL3JlYWxtcy9zdGFuZGFyZCIsInJlc3BvbnNlX3R5cGUiOiJjb2RlIiwiY29kZV9jaGFsbGVuZ2VfbWV0aG9kIjoiUzI1NiIsInJlZGlyZWN0X3VyaSI6Imh0dHBzOi8vb25yb3V0ZWJjLXRlc3QtZnJvbnRlbmQuYXBwcy5zaWx2ZXIuZGV2b3BzLmdvdi5iYy5jYS8iLCJzdGF0ZSI6IjdiZTBmNDk4ZGRmYTQ1ZTI4ZWU4ZjI0MTY0NzViYTQyIiwiY29kZV9jaGFsbGVuZ2UiOiJCNEpzelBjUzBIT1c3RUNUVFVVUkMxbXA2ejhhdDJiNkswbEQxdUtfMTFBIiwia2NfaWRwX2hpbnQiOiJiY2VpZGJvdGgiLCJyZXNwb25zZV9tb2RlIjoicXVlcnkifX0.2dLZTTjk8ZY0EFAaE88sAWQlfo7T17XcYLztnQwI_Yk; _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; FAILREASON=0; SMSESSION=Awk9KIrMNenX09Vl2cEMuy/VxV9CFVP4fsBzCp8Zo3AX2VsrDVWkOMVOdJyoY1Q1J9F8Vs8XFBtHTU29qS7+jlhEMK3f9j8tgudEVWHJq8LTizGhEj1cf8r7CX2QuxWMbdAHvK90hFnpocsL5xv2cAaFVdqhBKlIYkzwkY+r0YuH3Uh6DJVIhAhwjWeKfO6BAg5/jNFxQ31EPvzn4N7RxJK2bGyfAxzi6Cs6O7ieJ10MzcB8nWSIsO4ksfG8pzeGp9a+arl4maKnd9Je2L2FQohmiOjfGcrsezOgLgiWFl1B3+EL8ytArvtKhsFvr7WJsQuhYsQYzfY8shcfhNSltyqxLD422bDmU3NyZdhWY9313YG5I1U2vbO7zvXhxaCJYnpMrJR+inz8XsyqnGY1xu7AepY3pNd2wJH3twQJ42N6R2WlJVVN3oc3DvEHUbk85xrqHdwngd/FiMdEC2f5Kt51VYp8G/3R+sbFiy6Wt7wlZw2+/wI8EfxXs31HQ5q/RDUTXz6JMbzsR7EUOF+WkOrgi1nDugu13/O9hDnxPJnkzNGEfjt0xPxdhoDdl4vWdwRe1awBEn90SyJwc8+cFk1XACtvWoGwtPdf1xnHUwx5Ge1TqEd46xdjjlu+iTw2Xu5AsESUVVw81STsKA7vC8EBabQ+yXQHZlNFcFCKa1+AutNxfWHNQtnFK03kUCai4ZPJc/TQrhvf9DWjSyX+KknWdV6aQyz65KOpwtQWpd4ZlqAAKvf9vCQIBgk+YdsxFzAq6ySnLPcBLbFvP+Xyo5bcABg8IS9aJr6+05KT3ZOv49G1uYvz1ILaDED83D5NHF57ZswKR2911SevaqIO2i8NkZAJUMBpgroSejoJ1MxzpL/a7I26u6+p/08uMt/dT7vuo5OTTjayEtIlXy1IRXA/jU/uX/pKk1JrsZFhhwj7G5KEQpMAx+YvZUaaidqyfj3+fLb6+rsa8BukV8x0zfgUg20dm+Wu9XjDvyQHFP4Qt65CaUbhAKcVTgCChgTfSSdUJZIPPa5Yhzr7SmTuVGmYV/1cC4jGzNdSqr3Fq28fWukiEnRtqfZRXlOdA6xb + + + + + + + + + + false + + = + + + + + + + + https://${KEYCLOAK_LOGIN_URL}/auth/realms/standard/login-actions/post-broker-login?client_id=on-route-bc-direct-4598&tab_id=KAxYXjoatGc + GET + true + false + true + false + + + + + + + + + Host + ${KEYCLOAK_LOGIN_URL} + + + Connection + keep-alive + + + Cache-Control + max-age=0 + + + Upgrade-Insecure-Requests + 1 + + + User-Agent + Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 + + + Accept + text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 + + + Sec-Fetch-Site + same-site + + + Sec-Fetch-Mode + navigate + + + Sec-Fetch-Dest + document + + + sec-ch-ua + "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" + + + sec-ch-ua-mobile + ?0 + + + sec-ch-ua-platform + "Windows" + + + Accept-Encoding + gzip, deflate, br + + + Accept-Language + en-US,en;q=0.9 + + + Cookie + AUTH_SESSION_ID=0e56ff7b-e277-400f-84f5-25801c43c829.ycloak-78b4c74bcf-kh476; AUTH_SESSION_ID_LEGACY=0e56ff7b-e277-400f-84f5-25801c43c829.ycloak-78b4c74bcf-kh476; KC_RESTART=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICIzMmI0MzNkNC02NjgwLTQxODMtOTc2Yy1kZDdjMTg0YjExMTQifQ.eyJjaWQiOiJvbi1yb3V0ZS1iYy1kaXJlY3QtNDU5OCIsInB0eSI6Im9wZW5pZC1jb25uZWN0IiwicnVyaSI6Imh0dHBzOi8vb25yb3V0ZWJjLXRlc3QtZnJvbnRlbmQuYXBwcy5zaWx2ZXIuZGV2b3BzLmdvdi5iYy5jYS8iLCJhY3QiOiJBVVRIRU5USUNBVEUiLCJub3RlcyI6eyJzY29wZSI6Im9wZW5pZCIsImlzcyI6Imh0dHBzOi8vdGVzdC5sb2dpbnByb3h5Lmdvdi5iYy5jYS9hdXRoL3JlYWxtcy9zdGFuZGFyZCIsInJlc3BvbnNlX3R5cGUiOiJjb2RlIiwiY29kZV9jaGFsbGVuZ2VfbWV0aG9kIjoiUzI1NiIsInJlZGlyZWN0X3VyaSI6Imh0dHBzOi8vb25yb3V0ZWJjLXRlc3QtZnJvbnRlbmQuYXBwcy5zaWx2ZXIuZGV2b3BzLmdvdi5iYy5jYS8iLCJzdGF0ZSI6IjdiZTBmNDk4ZGRmYTQ1ZTI4ZWU4ZjI0MTY0NzViYTQyIiwiY29kZV9jaGFsbGVuZ2UiOiJCNEpzelBjUzBIT1c3RUNUVFVVUkMxbXA2ejhhdDJiNkswbEQxdUtfMTFBIiwia2NfaWRwX2hpbnQiOiJiY2VpZGJvdGgiLCJyZXNwb25zZV9tb2RlIjoicXVlcnkifX0.2dLZTTjk8ZY0EFAaE88sAWQlfo7T17XcYLztnQwI_Yk; _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; FAILREASON=0; SMSESSION=Awk9KIrMNenX09Vl2cEMuy/VxV9CFVP4fsBzCp8Zo3AX2VsrDVWkOMVOdJyoY1Q1J9F8Vs8XFBtHTU29qS7+jlhEMK3f9j8tgudEVWHJq8LTizGhEj1cf8r7CX2QuxWMbdAHvK90hFnpocsL5xv2cAaFVdqhBKlIYkzwkY+r0YuH3Uh6DJVIhAhwjWeKfO6BAg5/jNFxQ31EPvzn4N7RxJK2bGyfAxzi6Cs6O7ieJ10MzcB8nWSIsO4ksfG8pzeGp9a+arl4maKnd9Je2L2FQohmiOjfGcrsezOgLgiWFl1B3+EL8ytArvtKhsFvr7WJsQuhYsQYzfY8shcfhNSltyqxLD422bDmU3NyZdhWY9313YG5I1U2vbO7zvXhxaCJYnpMrJR+inz8XsyqnGY1xu7AepY3pNd2wJH3twQJ42N6R2WlJVVN3oc3DvEHUbk85xrqHdwngd/FiMdEC2f5Kt51VYp8G/3R+sbFiy6Wt7wlZw2+/wI8EfxXs31HQ5q/RDUTXz6JMbzsR7EUOF+WkOrgi1nDugu13/O9hDnxPJnkzNGEfjt0xPxdhoDdl4vWdwRe1awBEn90SyJwc8+cFk1XACtvWoGwtPdf1xnHUwx5Ge1TqEd46xdjjlu+iTw2Xu5AsESUVVw81STsKA7vC8EBabQ+yXQHZlNFcFCKa1+AutNxfWHNQtnFK03kUCai4ZPJc/TQrhvf9DWjSyX+KknWdV6aQyz65KOpwtQWpd4ZlqAAKvf9vCQIBgk+YdsxFzAq6ySnLPcBLbFvP+Xyo5bcABg8IS9aJr6+05KT3ZOv49G1uYvz1ILaDED83D5NHF57ZswKR2911SevaqIO2i8NkZAJUMBpgroSejoJ1MxzpL/a7I26u6+p/08uMt/dT7vuo5OTTjayEtIlXy1IRXA/jU/uX/pKk1JrsZFhhwj7G5KEQpMAx+YvZUaaidqyfj3+fLb6+rsa8BukV8x0zfgUg20dm+Wu9XjDvyQHFP4Qt65CaUbhAKcVTgCChgTfSSdUJZIPPa5Yhzr7SmTuVGmYV/1cC4jGzNdSqr3Fq28fWukiEnRtqfZRXlOdA6xb + + + + + + + + + + false + + = + + + + + + + + https://${FRONTEND_API_URL}/?state=7be0f498ddfa45e28ee8f2416475ba42&session_state=0e56ff7b-e277-400f-84f5-25801c43c829&code=e1db6532-ce36-4aa5-845c-26c6d9f6e19f.0e56ff7b-e277-400f-84f5-25801c43c829.f462b30d-0893-4a2d-8169-3461d82c36eb + GET + true + false + true + false + + + + + + + + + Host + ${FRONTEND_API_URL} + + + Connection + keep-alive + + + Cache-Control + max-age=0 + + + Upgrade-Insecure-Requests + 1 + + + User-Agent + Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 + + + Accept + text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 + + + Sec-Fetch-Site + same-site + + + Sec-Fetch-Mode + navigate + + + Sec-Fetch-Dest + document + + + sec-ch-ua + "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" + + + sec-ch-ua-mobile + ?0 + + + sec-ch-ua-platform + "Windows" + + + Accept-Encoding + gzip, deflate, br + + + Accept-Language + en-US,en;q=0.9 + + + Cookie + _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; FAILREASON=0; 9a75866e187615f9e3e688e8297548f9=1f5b60b83338df80ae3a11e1286008b7; SMSESSION=Awk9KIrMNenX09Vl2cEMuy/VxV9CFVP4fsBzCp8Zo3AX2VsrDVWkOMVOdJyoY1Q1J9F8Vs8XFBtHTU29qS7+jlhEMK3f9j8tgudEVWHJq8LTizGhEj1cf8r7CX2QuxWMbdAHvK90hFnpocsL5xv2cAaFVdqhBKlIYkzwkY+r0YuH3Uh6DJVIhAhwjWeKfO6BAg5/jNFxQ31EPvzn4N7RxJK2bGyfAxzi6Cs6O7ieJ10MzcB8nWSIsO4ksfG8pzeGp9a+arl4maKnd9Je2L2FQohmiOjfGcrsezOgLgiWFl1B3+EL8ytArvtKhsFvr7WJsQuhYsQYzfY8shcfhNSltyqxLD422bDmU3NyZdhWY9313YG5I1U2vbO7zvXhxaCJYnpMrJR+inz8XsyqnGY1xu7AepY3pNd2wJH3twQJ42N6R2WlJVVN3oc3DvEHUbk85xrqHdwngd/FiMdEC2f5Kt51VYp8G/3R+sbFiy6Wt7wlZw2+/wI8EfxXs31HQ5q/RDUTXz6JMbzsR7EUOF+WkOrgi1nDugu13/O9hDnxPJnkzNGEfjt0xPxdhoDdl4vWdwRe1awBEn90SyJwc8+cFk1XACtvWoGwtPdf1xnHUwx5Ge1TqEd46xdjjlu+iTw2Xu5AsESUVVw81STsKA7vC8EBabQ+yXQHZlNFcFCKa1+AutNxfWHNQtnFK03kUCai4ZPJc/TQrhvf9DWjSyX+KknWdV6aQyz65KOpwtQWpd4ZlqAAKvf9vCQIBgk+YdsxFzAq6ySnLPcBLbFvP+Xyo5bcABg8IS9aJr6+05KT3ZOv49G1uYvz1ILaDED83D5NHF57ZswKR2911SevaqIO2i8NkZAJUMBpgroSejoJ1MxzpL/a7I26u6+p/08uMt/dT7vuo5OTTjayEtIlXy1IRXA/jU/uX/pKk1JrsZFhhwj7G5KEQpMAx+YvZUaaidqyfj3+fLb6+rsa8BukV8x0zfgUg20dm+Wu9XjDvyQHFP4Qt65CaUbhAKcVTgCChgTfSSdUJZIPPa5Yhzr7SmTuVGmYV/1cC4jGzNdSqr3Fq28fWukiEnRtqfZRXlOdA6xb + + + + + + + + + + false + + = + + + + + + + + https://${KEYCLOAK_LOGIN_URL}/auth/realms/standard/.well-known/openid-configuration + GET + true + false + true + false + + + + + + + + + Host + ${KEYCLOAK_LOGIN_URL} + + + Connection + keep-alive + + + sec-ch-ua + "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" + + + Accept + application/jwk-set+json, application/json + + + sec-ch-ua-mobile + ?0 + + + User-Agent + Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 + + + sec-ch-ua-platform + "Windows" + + + Origin + https://${FRONTEND_API_URL} + + + Sec-Fetch-Site + same-site + + + Sec-Fetch-Mode + cors + + + Sec-Fetch-Dest + empty + + + Referer + https://${FRONTEND_API_URL}/ + + + Accept-Encoding + gzip, deflate, br + + + Accept-Language + en-US,en;q=0.9 + + + + + + + + + + false + + = + + + + + + + + https://${VEHICLES_API_URL}/users/user-context + OPTIONS + true + false + true + false + + + + + + + + + Host + ${VEHICLES_API_URL} + + + Connection + keep-alive + + + Accept + */* + + + Access-Control-Request-Method + POST + + + Access-Control-Request-Headers + authorization,content-type + + + Origin + https://${FRONTEND_API_URL} + + + User-Agent + Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 + + + Sec-Fetch-Mode + cors + + + Sec-Fetch-Site + same-site + + + Sec-Fetch-Dest + empty + + + Referer + https://${FRONTEND_API_URL}/ + + + Accept-Encoding + gzip, deflate, br + + + Accept-Language + en-US,en;q=0.9 + + + + + + + true + + + + false + {} + = + + + + + + + + https://${VEHICLES_API_URL}/users/user-context + POST + true + false + true + false + + + + + + + + + Host + ${VEHICLES_API_URL} + + + Connection + keep-alive + + + Content-Length + 2 + + + sec-ch-ua + "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" + + + Accept + application/json, text/plain, */* + + + Content-Type + application/json + + + sec-ch-ua-mobile + ?0 + + + Authorization + Bearer ${BCEID_BEARER_TOKEN} + + + User-Agent + Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 + + + sec-ch-ua-platform + "Windows" + + + Origin + https://${FRONTEND_API_URL} + + + Sec-Fetch-Site + same-site + + + Sec-Fetch-Mode + cors + + + Sec-Fetch-Dest + empty + + + Referer + https://${FRONTEND_API_URL}/ + + + Accept-Encoding + gzip, deflate, br + + + Accept-Language + en-US,en;q=0.9 + + + + + + + + + + false + + = + + + + + + + + https://${VEHICLES_API_URL}/users/roles?companyId=102 + OPTIONS + true + false + true + false + + + + + + + + + Host + ${VEHICLES_API_URL} + + + Connection + keep-alive + + + Accept + */* + + + Access-Control-Request-Method + GET + + + Access-Control-Request-Headers + authorization + + + Origin + https://${FRONTEND_API_URL} + + + User-Agent + Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 + + + Sec-Fetch-Mode + cors + + + Sec-Fetch-Site + same-site + + + Sec-Fetch-Dest + empty + + + Referer + https://${FRONTEND_API_URL}/ + + + Accept-Encoding + gzip, deflate, br + + + Accept-Language + en-US,en;q=0.9 + + + + + + + + + + false + + = + + + + + + + + https://${VEHICLES_API_URL}/users/roles?companyId=102 + GET + true + false + true + false + + + + + + + + + Host + ${VEHICLES_API_URL} + + + Connection + keep-alive + + + sec-ch-ua + "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" + + + Accept + application/json, text/plain, */* + + + sec-ch-ua-mobile + ?0 + + + Authorization + Bearer ${BCEID_BEARER_TOKEN} + + + User-Agent + Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 + + + sec-ch-ua-platform + "Windows" + + + Origin + https://${FRONTEND_API_URL} + + + Sec-Fetch-Site + same-site + + + Sec-Fetch-Mode + cors + + + Sec-Fetch-Dest + empty + + + Referer + https://${FRONTEND_API_URL}/ + + + Accept-Encoding + gzip, deflate, br + + + Accept-Language + en-US,en;q=0.9 + + + If-None-Match + W/"1b4-DdYKGtaFZ5+U7pxjw6uu3owPOfo" + + + + + + + + + + false + + = + + + + + + + + https://${VEHICLES_API_URL}/permits/applications?status=IN_PROGRESS&companyId=102&userGUID=A9ED2C5742DC455998672CC2A118174B + OPTIONS + true + false + true + false + + + + + + + + + Host + ${VEHICLES_API_URL} + + + Connection + keep-alive + + + Accept + */* + + + Access-Control-Request-Method + GET + + + Access-Control-Request-Headers + authorization + + + Origin + https://${FRONTEND_API_URL} + + + User-Agent + Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 + + + Sec-Fetch-Mode + cors + + + Sec-Fetch-Site + same-site + + + Sec-Fetch-Dest + empty + + + Referer + https://${FRONTEND_API_URL}/ + + + Accept-Encoding + gzip, deflate, br + + + Accept-Language + en-US,en;q=0.9 + + + + + + + + + + false + + = + true + + + + + + + + https://${VEHICLES_API_URL}/permits/applications?status=IN_PROGRESS&companyId=102&userGUID=A9ED2C5742DC455998672CC2A118174B + GET + true + false + true + false + + + + + + + + + Host + ${VEHICLES_API_URL} + + + Connection + keep-alive + + + sec-ch-ua + "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" + + + Accept + application/json, text/plain, */* + + + sec-ch-ua-mobile + ?0 + + + Authorization + Bearer ${BCEID_BEARER_TOKEN} + + + User-Agent + Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 + + + sec-ch-ua-platform + "Windows" + + + Origin + https://${FRONTEND_API_URL} + + + Sec-Fetch-Site + same-site + + + Sec-Fetch-Mode + cors + + + Sec-Fetch-Dest + empty + + + Referer + https://${FRONTEND_API_URL}/ + + + Accept-Encoding + gzip, deflate, br + + + Accept-Language + en-US,en;q=0.9 + + + If-None-Match + W/"17b2-OQs45yY+9rxT8oaE549bg+d9IqA" + + + + + + + + + + + + + + https://${VEHICLES_API_URL}/users/roles?companyId=102 + GET + true + false + true + false + + + + + + + + + Host + ${VEHICLES_API_URL} + + + Connection + keep-alive + + + sec-ch-ua + "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" + + + Accept + application/json + + + sec-ch-ua-mobile + ?0 + + + Authorization + Bearer ${BCEID_BEARER_TOKEN} + + + User-Agent + Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 + + + sec-ch-ua-platform + "Windows" + + + Origin + https://${FRONTEND_API_URL} + + + Sec-Fetch-Site + same-site + + + Sec-Fetch-Mode + cors + + + Sec-Fetch-Dest + empty + + + Referer + https://${FRONTEND_API_URL}/ + + + Accept-Encoding + gzip, deflate, br + + + Accept-Language + en-US,en;q=0.9 + + + If-None-Match + W/"17b2-OQs45yY+9rxT8oaE549bg+d9IqA" + + + + + + + + Authorization + Bearer ${BCEID_BEARER_TOKEN} + + + Accept + */* + + + + + + + + + + false + + = + true + + + + + + + + https://${VEHICLES_API_URL}/permits/applications?companyId=102&status=IN_PROGRESS + GET + true + false + true + false + + + + + + + + + Host + ${VEHICLES_API_URL} + + + Connection + keep-alive + + + sec-ch-ua + "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" + + + Accept + application/json + + + sec-ch-ua-mobile + ?0 + + + Authorization + Bearer ${BCEID_BEARER_TOKEN} + + + User-Agent + Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 + + + sec-ch-ua-platform + "Windows" + + + Origin + https://${FRONTEND_API_URL} + + + Sec-Fetch-Site + same-site + + + Sec-Fetch-Mode + cors + + + Sec-Fetch-Dest + empty + + + Referer + https://${FRONTEND_API_URL}/ + + + Accept-Encoding + gzip, deflate, br + + + Accept-Language + en-US,en;q=0.9 + + + If-None-Match + W/"17b2-OQs45yY+9rxT8oaE549bg+d9IqA" + + + + + + + + Authorization + Bearer ${BCEID_BEARER_TOKEN} + + + Accept + */* + + + + + + + + + + false + + = + true + + + + + + + + https://${VEHICLES_API_URL}/permits/applications/20?companyId=102 + GET + true + false + true + false + + + + + + + + + Host + ${VEHICLES_API_URL} + + + Connection + keep-alive + + + sec-ch-ua + "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" + + + Accept + application/json + + + sec-ch-ua-mobile + ?0 + + + Authorization + Bearer ${BCEID_BEARER_TOKEN} + + + User-Agent + Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 + + + sec-ch-ua-platform + "Windows" + + + Origin + https://${FRONTEND_API_URL} + + + Sec-Fetch-Site + same-site + + + Sec-Fetch-Mode + cors + + + Sec-Fetch-Dest + empty + + + Referer + https://${FRONTEND_API_URL}/ + + + Accept-Encoding + gzip, deflate, br + + + Accept-Language + en-US,en;q=0.9 + + + If-None-Match + W/"17b2-OQs45yY+9rxT8oaE549bg+d9IqA" + + + + + + + + Authorization + Bearer ${BCEID_BEARER_TOKEN} + + + Accept + */* + + + + + + + true + + + + false + { + "companyId": 102, + "userGuid": "06267945F2EB4E31B585932F78B76269", + "permitType": "TROS", + "permitStatus": "IN_PROGRESS", + "permitApplicationOrigin": "ONLINE", + "permitData": {} +} + = + + + + + + + + https://${VEHICLES_API_URL}/permits/applications/A2-00010002-520-R00 + PUT + true + false + true + false + + + + + + + + + Authorization + Bearer ${BCEID_BEARER_TOKEN} + + + Accept + application/json + + + Content-Type + application/json + + + + + + + + Host + ${VEHICLES_API_URL} + + + Connection + keep-alive + + + sec-ch-ua + "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" + + + Accept + application/json + + + sec-ch-ua-mobile + ?0 + + + Authorization + Bearer ${BCEID_BEARER_TOKEN} + + + User-Agent + Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 + + + sec-ch-ua-platform + "Windows" + + + Origin + https://${FRONTEND_API_URL} + + + Sec-Fetch-Site + same-site + + + Sec-Fetch-Mode + cors + + + Sec-Fetch-Dest + empty + + + Referer + https://${FRONTEND_API_URL}/ + + + Accept-Encoding + gzip, deflate, br + + + Accept-Language + en-US,en;q=0.9 + + + If-None-Match + W/"17b2-OQs45yY+9rxT8oaE549bg+d9IqA" + + + + + + + + + + false + + = + true + + + + + + + + https://${VEHICLES_API_URL}/permits/applications/20?companyId=102 + GET + true + false + true + false + + + + + + + + + Host + ${VEHICLES_API_URL} + + + Connection + keep-alive + + + sec-ch-ua + "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" + + + Accept + application/json + + + sec-ch-ua-mobile + ?0 + + + Authorization + Bearer ${BCEID_BEARER_TOKEN} + + + User-Agent + Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 + + + sec-ch-ua-platform + "Windows" + + + Origin + https://${FRONTEND_API_URL} + + + Sec-Fetch-Site + same-site + + + Sec-Fetch-Mode + cors + + + Sec-Fetch-Dest + empty + + + Referer + https://${FRONTEND_API_URL}/ + + + Accept-Encoding + gzip, deflate, br + + + Accept-Language + en-US,en;q=0.9 + + + If-None-Match + W/"17b2-OQs45yY+9rxT8oaE549bg+d9IqA" + + + + + + + + Authorization + Bearer ${BCEID_BEARER_TOKEN} + + + Accept + */* + + + + + + + true + + + + false + { + "companyId": 102, + "userGuid": "06267945F2EB4E31B585932F78B76269", + "permitType": "TROS", + "permitStatus": "IN_PROGRESS", + "permitApplicationOrigin": "ONLINE", + "permitData": {} +} + = + + + + + + + + https://${VEHICLES_API_URL}/permits/applications/A2-00010002-520-R00 + PUT + true + false + true + false + + + + + + + + + Authorization + Bearer ${BCEID_BEARER_TOKEN} + + + Accept + application/json + + + Content-Type + application/json + + + + + + + + Host + ${VEHICLES_API_URL} + + + Connection + keep-alive + + + sec-ch-ua + "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" + + + Accept + application/json + + + sec-ch-ua-mobile + ?0 + + + Authorization + Bearer ${BCEID_BEARER_TOKEN} + + + User-Agent + Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 + + + sec-ch-ua-platform + "Windows" + + + Origin + https://${FRONTEND_API_URL} + + + Sec-Fetch-Site + same-site + + + Sec-Fetch-Mode + cors + + + Sec-Fetch-Dest + empty + + + Referer + https://${FRONTEND_API_URL}/ + + + Accept-Encoding + gzip, deflate, br + + + Accept-Language + en-US,en;q=0.9 + + + If-None-Match + W/"17b2-OQs45yY+9rxT8oaE549bg+d9IqA" + + + + + + + + continue + + false + 1 + + 1 + ${__P(rampup,300)} + 1365261073000 + 1365261073000 + true + ${__P(duration,3000)} + + true + + + + ${__P(Delay,10000)} + + + + + + + false + + = + true + + + + + + + + https://${FRONTEND_API_URL}/ + GET + true + false + true + false + + + + + + + + + Host + ${FRONTEND_API_URL} + + + Connection + keep-alive + + + Cache-Control + max-age=0 + + + sec-ch-ua + "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" + + + sec-ch-ua-mobile + ?0 + + + sec-ch-ua-platform + "Windows" + + + Upgrade-Insecure-Requests + 1 + + + User-Agent + Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 + + + Accept + text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 + + + Sec-Fetch-Site + same-origin + + + Sec-Fetch-Mode + navigate + + + Sec-Fetch-User + ?1 + + + Sec-Fetch-Dest + document + + + Accept-Encoding + gzip, deflate, br + + + Accept-Language + en-US,en;q=0.9 + + + Cookie + _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; FAILREASON=0; 9a75866e187615f9e3e688e8297548f9=1f5b60b83338df80ae3a11e1286008b7; SMSESSION=LOGGEDOFF + + + If-None-Match + W/"653ca247-308" + + + If-Modified-Since + Sat, 28 Oct 2023 05:55:19 GMT + + + + + + + + + + false + + = + true + + + + + + + + https://${KEYCLOAK_LOGIN_URL}/auth/realms/standard/.well-known/openid-configuration + GET + true + false + true + false + + + + + + + + + Host + ${KEYCLOAK_LOGIN_URL} + + + Connection + keep-alive + + + sec-ch-ua + "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" + + + Accept + application/jwk-set+json, application/json + + + sec-ch-ua-mobile + ?0 + + + User-Agent + Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 + + + sec-ch-ua-platform + "Windows" + + + Origin + https://${FRONTEND_API_URL} + + + Sec-Fetch-Site + same-site + + + Sec-Fetch-Mode + cors + + + Sec-Fetch-Dest + empty + + + Referer + https://${FRONTEND_API_URL}/ + + + Accept-Encoding + gzip, deflate, br + + + Accept-Language + en-US,en;q=0.9 + + + + + + + + + + false + + = + true + + + + + + + + https://${KEYCLOAK_LOGIN_URL}/auth/realms/standard/protocol/openid-connect/auth?client_id=on-route-bc-direct-4598&redirect_uri=https%3A%2F%2F${FRONTEND_API_URL}%2F&response_type=code&scope=openid&state=7be0f498ddfa45e28ee8f2416475ba42&code_challenge=B4JszPcS0HOW7ECTTUURC1mp6z8at2b6K0lD1uK_11A&code_challenge_method=S256&response_mode=query&kc_idp_hint=bceidboth + GET + true + false + true + false + + + + + + + + + Host + ${KEYCLOAK_LOGIN_URL} + + + Connection + keep-alive + + + sec-ch-ua + "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" + + + sec-ch-ua-mobile + ?0 + + + sec-ch-ua-platform + "Windows" + + + Upgrade-Insecure-Requests + 1 + + + User-Agent + Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 + + + Accept + text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 + + + Sec-Fetch-Site + same-site + + + Sec-Fetch-Mode + navigate + + + Sec-Fetch-User + ?1 + + + Sec-Fetch-Dest + document + + + Referer + https://${FRONTEND_API_URL}/ + + + Accept-Encoding + gzip, deflate, br + + + Accept-Language + en-US,en;q=0.9 + + + Cookie + AUTH_SESSION_ID=2e364c60-0ead-4ec1-98fb-0e1bba001f08.ycloak-78b4c74bcf-vtmwp; AUTH_SESSION_ID_LEGACY=2e364c60-0ead-4ec1-98fb-0e1bba001f08.ycloak-78b4c74bcf-vtmwp; _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; FAILREASON=0; SMSESSION=LOGGEDOFF + + + + + + + + + + false + + = + true + + + + + + + + https://${KEYCLOAK_LOGIN_URL}/auth/realms/standard/broker/bceidboth/login?session_code=5b_D1WNhNIzE-FZe70dEmhs_J2mpDyFSyQzWPAxnjYc&client_id=on-route-bc-direct-4598&tab_id=KAxYXjoatGc + GET + true + false + true + false + + + + + + + + + Host + ${KEYCLOAK_LOGIN_URL} + + + Connection + keep-alive + + + Upgrade-Insecure-Requests + 1 + + + User-Agent + Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 + + + Accept + text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 + + + Sec-Fetch-Site + same-site + + + Sec-Fetch-Mode + navigate + + + Sec-Fetch-User + ?1 + + + Sec-Fetch-Dest + document + + + sec-ch-ua + "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" + + + sec-ch-ua-mobile + ?0 + + + sec-ch-ua-platform + "Windows" + + + Accept-Encoding + gzip, deflate, br + + + Accept-Language + en-US,en;q=0.9 + + + Cookie + AUTH_SESSION_ID=0e56ff7b-e277-400f-84f5-25801c43c829.ycloak-78b4c74bcf-kh476; AUTH_SESSION_ID_LEGACY=0e56ff7b-e277-400f-84f5-25801c43c829.ycloak-78b4c74bcf-kh476; KC_RESTART=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICIzMmI0MzNkNC02NjgwLTQxODMtOTc2Yy1kZDdjMTg0YjExMTQifQ.eyJjaWQiOiJvbi1yb3V0ZS1iYy1kaXJlY3QtNDU5OCIsInB0eSI6Im9wZW5pZC1jb25uZWN0IiwicnVyaSI6Imh0dHBzOi8vb25yb3V0ZWJjLXRlc3QtZnJvbnRlbmQuYXBwcy5zaWx2ZXIuZGV2b3BzLmdvdi5iYy5jYS8iLCJhY3QiOiJBVVRIRU5USUNBVEUiLCJub3RlcyI6eyJzY29wZSI6Im9wZW5pZCIsImlzcyI6Imh0dHBzOi8vdGVzdC5sb2dpbnByb3h5Lmdvdi5iYy5jYS9hdXRoL3JlYWxtcy9zdGFuZGFyZCIsInJlc3BvbnNlX3R5cGUiOiJjb2RlIiwiY29kZV9jaGFsbGVuZ2VfbWV0aG9kIjoiUzI1NiIsInJlZGlyZWN0X3VyaSI6Imh0dHBzOi8vb25yb3V0ZWJjLXRlc3QtZnJvbnRlbmQuYXBwcy5zaWx2ZXIuZGV2b3BzLmdvdi5iYy5jYS8iLCJzdGF0ZSI6IjdiZTBmNDk4ZGRmYTQ1ZTI4ZWU4ZjI0MTY0NzViYTQyIiwiY29kZV9jaGFsbGVuZ2UiOiJCNEpzelBjUzBIT1c3RUNUVFVVUkMxbXA2ejhhdDJiNkswbEQxdUtfMTFBIiwia2NfaWRwX2hpbnQiOiJiY2VpZGJvdGgiLCJyZXNwb25zZV9tb2RlIjoicXVlcnkifX0.2dLZTTjk8ZY0EFAaE88sAWQlfo7T17XcYLztnQwI_Yk; _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; FAILREASON=0; SMSESSION=LOGGEDOFF + + + + + + + + + + false + + = + true + + + + + + + + https://${KEYCLOAK_LOGIN_URL}/auth/realms/bceidboth/protocol/openid-connect/auth?scope=openid&state=JvIyfmoj0AzmBZWw0ZS8lBmhMJXd7lA_uAR8JQvLNlE.KAxYXjoatGc.on-route-bc-direct-4598&response_type=code&client_id=standard-realm&redirect_uri=https%3A%2F%2F${KEYCLOAK_LOGIN_URL}%2Fauth%2Frealms%2Fstandard%2Fbroker%2Fbceidboth%2Fendpoint&nonce=1sKWmdZ0aV6QIscb65Lrmg + GET + true + false + true + false + + + + + + + + + Host + ${KEYCLOAK_LOGIN_URL} + + + Connection + keep-alive + + + Upgrade-Insecure-Requests + 1 + + + User-Agent + Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 + + + Accept + text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 + + + Sec-Fetch-Site + same-site + + + Sec-Fetch-Mode + navigate + + + Sec-Fetch-User + ?1 + + + Sec-Fetch-Dest + document + + + sec-ch-ua + "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" + + + sec-ch-ua-mobile + ?0 + + + sec-ch-ua-platform + "Windows" + + + Accept-Encoding + gzip, deflate, br + + + Accept-Language + en-US,en;q=0.9 + + + Cookie + AUTH_SESSION_ID=33769057-e4e2-49e9-821b-bab26d4e7507.ycloak-78b4c74bcf-gj9d6; AUTH_SESSION_ID_LEGACY=33769057-e4e2-49e9-821b-bab26d4e7507.ycloak-78b4c74bcf-gj9d6; KEYCLOAK_IDENTITY=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI1ZjExNjBiNS03Y2RjLTQ5NGQtYmFkOS0yZGRkNjU3MDU5Y2UifQ.eyJleHAiOjE2OTg3MzE3MzQsImlhdCI6MTY5ODY5NTczNCwianRpIjoiNzY3ZDEzMGEtMzczMC00NDdhLWEzNTUtNjhhNDhiMjgzZTI3IiwiaXNzIjoiaHR0cHM6Ly90ZXN0LmxvZ2lucHJveHkuZ292LmJjLmNhL2F1dGgvcmVhbG1zL2JjZWlkYm90aCIsInN1YiI6ImQ3M2FiN2IwLWUyMmEtNDg0NC04Yzc3LWU3YTQ2ODQyOTNmZCIsInR5cCI6IlNlcmlhbGl6ZWQtSUQiLCJzZXNzaW9uX3N0YXRlIjoiMzM3NjkwNTctZTRlMi00OWU5LTgyMWItYmFiMjZkNGU3NTA3Iiwic2lkIjoiMzM3NjkwNTctZTRlMi00OWU5LTgyMWItYmFiMjZkNGU3NTA3Iiwic3RhdGVfY2hlY2tlciI6Ik9SWEI4amY3Q3hPUWhzTUNhWU5nMHF2WHNzZG52cnlxUHFjMnFpUkthZncifQ.1kpL3Qpg4pyqSLBE0iDz7WZ0fdGzCCf6RCiN6HvFWqE; KEYCLOAK_IDENTITY_LEGACY=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI1ZjExNjBiNS03Y2RjLTQ5NGQtYmFkOS0yZGRkNjU3MDU5Y2UifQ.eyJleHAiOjE2OTg3MzE3MzQsImlhdCI6MTY5ODY5NTczNCwianRpIjoiNzY3ZDEzMGEtMzczMC00NDdhLWEzNTUtNjhhNDhiMjgzZTI3IiwiaXNzIjoiaHR0cHM6Ly90ZXN0LmxvZ2lucHJveHkuZ292LmJjLmNhL2F1dGgvcmVhbG1zL2JjZWlkYm90aCIsInN1YiI6ImQ3M2FiN2IwLWUyMmEtNDg0NC04Yzc3LWU3YTQ2ODQyOTNmZCIsInR5cCI6IlNlcmlhbGl6ZWQtSUQiLCJzZXNzaW9uX3N0YXRlIjoiMzM3NjkwNTctZTRlMi00OWU5LTgyMWItYmFiMjZkNGU3NTA3Iiwic2lkIjoiMzM3NjkwNTctZTRlMi00OWU5LTgyMWItYmFiMjZkNGU3NTA3Iiwic3RhdGVfY2hlY2tlciI6Ik9SWEI4amY3Q3hPUWhzTUNhWU5nMHF2WHNzZG52cnlxUHFjMnFpUkthZncifQ.1kpL3Qpg4pyqSLBE0iDz7WZ0fdGzCCf6RCiN6HvFWqE; KEYCLOAK_SESSION=bceidboth/d73ab7b0-e22a-4844-8c77-e7a4684293fd/33769057-e4e2-49e9-821b-bab26d4e7507; KEYCLOAK_SESSION_LEGACY=bceidboth/d73ab7b0-e22a-4844-8c77-e7a4684293fd/33769057-e4e2-49e9-821b-bab26d4e7507; _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; FAILREASON=0; SMSESSION=LOGGEDOFF + + + + + + + + + + false + + = + true + + + + + + + + https://${KEYCLOAK_LOGIN_URL}/auth/realms/bceidboth/broker/bceidboth/login?session_code=oRr0p7JZ9oL7vptnFPfNKhf_nrB8DND1rBojsNPjot0&client_id=standard-realm&tab_id=k5Vw5BDlfVQ + GET + true + false + true + false + + + + + + + + + Host + ${KEYCLOAK_LOGIN_URL} + + + Connection + keep-alive + + + Upgrade-Insecure-Requests + 1 + + + User-Agent + Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 + + + Accept + text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 + + + Sec-Fetch-Site + same-site + + + Sec-Fetch-Mode + navigate + + + Sec-Fetch-User + ?1 + + + Sec-Fetch-Dest + document + + + sec-ch-ua + "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" + + + sec-ch-ua-mobile + ?0 + + + sec-ch-ua-platform + "Windows" + + + Accept-Encoding + gzip, deflate, br + + + Accept-Language + en-US,en;q=0.9 + + + Cookie + AUTH_SESSION_ID=f26f78a0-28d2-40b4-9e57-b83fa590e32e.ycloak-78b4c74bcf-vtmwp; AUTH_SESSION_ID_LEGACY=f26f78a0-28d2-40b4-9e57-b83fa590e32e.ycloak-78b4c74bcf-vtmwp; KC_RESTART=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI1ZjExNjBiNS03Y2RjLTQ5NGQtYmFkOS0yZGRkNjU3MDU5Y2UifQ.eyJjaWQiOiJzdGFuZGFyZC1yZWFsbSIsInB0eSI6Im9wZW5pZC1jb25uZWN0IiwicnVyaSI6Imh0dHBzOi8vdGVzdC5sb2dpbnByb3h5Lmdvdi5iYy5jYS9hdXRoL3JlYWxtcy9zdGFuZGFyZC9icm9rZXIvYmNlaWRib3RoL2VuZHBvaW50IiwiYWN0IjoiQVVUSEVOVElDQVRFIiwibm90ZXMiOnsic2NvcGUiOiJvcGVuaWQiLCJpc3MiOiJodHRwczovL3Rlc3QubG9naW5wcm94eS5nb3YuYmMuY2EvYXV0aC9yZWFsbXMvYmNlaWRib3RoIiwicmVzcG9uc2VfdHlwZSI6ImNvZGUiLCJyZWRpcmVjdF91cmkiOiJodHRwczovL3Rlc3QubG9naW5wcm94eS5nb3YuYmMuY2EvYXV0aC9yZWFsbXMvc3RhbmRhcmQvYnJva2VyL2JjZWlkYm90aC9lbmRwb2ludCIsInN0YXRlIjoiSnZJeWZtb2owQXptQlpXdzBaUzhsQm1oTUpYZDdsQV91QVI4SlF2TE5sRS5LQXhZWGpvYXRHYy5vbi1yb3V0ZS1iYy1kaXJlY3QtNDU5OCIsIm5vbmNlIjoiMXNLV21kWjBhVjZRSXNjYjY1THJtZyJ9fQ.08S_Qi57kTkuLj_eH5VElw2zeuH4AVhfOUois5IUzEI; _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; FAILREASON=0; SMSESSION=LOGGEDOFF + + + + + + + + + + false + + = + true + + + + + + + + https://${SITEMINDER_URL}/clp-cgi/capBceid/logon.cgi?flags=0101:0,7&TYPE=33554433&REALMOID=06-b02c7ed2-895e-4953-bd03-8008c64ec906&GUID=&SMAUTHREASON=0&METHOD=GET&SMAGENTNAME=$SM$Lk6VtkyHw8x3zQIIsMiOiEXYFJF%2fJzjVT7eioCjxBjJck5VMlbxxrR%2bLZSo%2flIBX&TARGET=$SM$HTTPS%3a%2f%2fsfstest7%2egov%2ebc%2eca%2faffwebservices%2fredirectjsp%2ftestkeycloak-basicbusinessbceid%2fredirect%2ejsp%3fSMPORTALURL%3dhttps$%3A$%2F$%2Fsfstest7%2egov%2ebc%2eca$%2Faffwebservices$%2Fpublic$%2Fsaml2sso%26SAMLTRANSACTIONID%3dc9f189ad-7324de1b-2e045e1a-e8bcf162-a78af00c-c5 + GET + true + false + true + false + + + + + + + + + Host + ${SITEMINDER_URL} + + + Connection + keep-alive + + + Cache-Control + max-age=0 + + + Upgrade-Insecure-Requests + 1 + + + User-Agent + Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 + + + Accept + text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 + + + Sec-Fetch-Site + same-site + + + Sec-Fetch-Mode + navigate + + + Sec-Fetch-Dest + document + + + sec-ch-ua + "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" + + + sec-ch-ua-mobile + ?0 + + + sec-ch-ua-platform + "Windows" + + + Accept-Encoding + gzip, deflate, br + + + Accept-Language + en-US,en;q=0.9 + + + Cookie + _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; Dummy1=DummyVal1; BCGOVFlags=0101%3A0%2C7; BCGOVCustom=NULL; BCGOVBrand=NULL; BCGOVBehavior=NULL; Dummy2=DummyVal2; preDummy1=DummyVal1; preDummy2=DummyVal2; preDummy3=DummyVal3; BCGOVDoNotShow=1; preDummy4=DummyVal4; FAILREASON=0; BCGOVTarget=HTTPS%3A%2F%2Fsfstest7.gov.bc.ca%2Faffwebservices%2Fredirectjsp%2Ftestkeycloak-basicbusinessbceid%2Fredirect.jsp%3FSMPORTALURL%3Dhttps%253A%252F%252Fsfstest7.gov.bc.ca%252Faffwebservices%252Fpublic%252Fsaml2sso%26SAMLTRANSACTIONID%3Df7917115-57286b4a-df9cf6ff-b50e2f11-c566ac5a-f6; BCGOVclptryno=0; clp001=0; SMSESSION=LOGGEDOFF; SMFED_OLD_SESSION=""; SMFED_OLD_IDENTITY=""; GUID=1:26feb557-62af2c8c-4ef3a8d7-2e2277be-6a76895c-697 + + + + + + + true + + + + false + instance=instance_capBceid&user=ORBCTST3&password=orbcTST%2B2023 + = + + + + + + + + https://${SITEMINDER_URL}/clp-cgi/preLogon.cgi + POST + true + false + true + false + + + + + + + + + Host + ${SITEMINDER_URL} + + + Connection + keep-alive + + + Content-Length + 64 + + + Cache-Control + max-age=0 + + + sec-ch-ua + "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" + + + sec-ch-ua-mobile + ?0 + + + sec-ch-ua-platform + "Windows" + + + Upgrade-Insecure-Requests + 1 + + + Origin + https://${SITEMINDER_URL} + + + Content-Type + application/x-www-form-urlencoded + + + User-Agent + Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 + + + Accept + text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 + + + Sec-Fetch-Site + same-origin + + + Sec-Fetch-Mode + navigate + + + Sec-Fetch-User + ?1 + + + Sec-Fetch-Dest + document + + + Referer + https://${SITEMINDER_URL}/clp-cgi/capBceid/logon.cgi?flags=0101:0,7&TYPE=33554433&REALMOID=06-b02c7ed2-895e-4953-bd03-8008c64ec906&GUID=&SMAUTHREASON=0&METHOD=GET&SMAGENTNAME=$SM$Lk6VtkyHw8x3zQIIsMiOiEXYFJF%2fJzjVT7eioCjxBjJck5VMlbxxrR%2bLZSo%2flIBX&TARGET=$SM$HTTPS%3a%2f%2fsfstest7%2egov%2ebc%2eca%2faffwebservices%2fredirectjsp%2ftestkeycloak-basicbusinessbceid%2fredirect%2ejsp%3fSMPORTALURL%3dhttps$%3A$%2F$%2Fsfstest7%2egov%2ebc%2eca$%2Faffwebservices$%2Fpublic$%2Fsaml2sso%26SAMLTRANSACTIONID%3dc9f189ad-7324de1b-2e045e1a-e8bcf162-a78af00c-c5 + + + Accept-Encoding + gzip, deflate, br + + + Accept-Language + en-US,en;q=0.9 + + + Cookie + _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; Dummy1=DummyVal1; BCGOVFlags=0101%3A0%2C7; BCGOVCustom=NULL; BCGOVBrand=NULL; BCGOVBehavior=NULL; Dummy2=DummyVal2; preDummy1=DummyVal1; preDummy2=DummyVal2; preDummy3=DummyVal3; BCGOVDoNotShow=1; preDummy4=DummyVal4; FAILREASON=0; clp001=0; SMSESSION=LOGGEDOFF; SMFED_OLD_SESSION=""; SMFED_OLD_IDENTITY=""; GUID=1:26feb557-62af2c8c-4ef3a8d7-2e2277be-6a76895c-697; BCGOVTarget=HTTPS%3A%2F%2Fsfstest7.gov.bc.ca%2Faffwebservices%2Fredirectjsp%2Ftestkeycloak-basicbusinessbceid%2Fredirect.jsp%3FSMPORTALURL%3Dhttps%253A%252F%252Fsfstest7.gov.bc.ca%252Faffwebservices%252Fpublic%252Fsaml2sso%26SAMLTRANSACTIONID%3Dc9f189ad-7324de1b-2e045e1a-e8bcf162-a78af00c-c5; BCGOVclptryno=1 + + + + + + + true + + + + false + SMENC=ISO-8859-1&SMLOCALE=US-EN&target=%2Fclp-cgi%2Fcap07%2Fprivate%2FpostLogon.cgi&smauthreason=0&smagentname=&user=ORBCTST3&password=orbcTST%2B2023 + = + + + + + + + + https://${SITEMINDER_URL}/clp-cgi/cap07/logon.fcc + POST + true + false + true + false + + + + + + + + + Host + ${SITEMINDER_URL} + + + Connection + keep-alive + + + Content-Length + 149 + + + Cache-Control + max-age=0 + + + sec-ch-ua + "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" + + + sec-ch-ua-mobile + ?0 + + + sec-ch-ua-platform + "Windows" + + + Upgrade-Insecure-Requests + 1 + + + Origin + https://${SITEMINDER_URL} + + + Content-Type + application/x-www-form-urlencoded + + + User-Agent + Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 + + + Accept + text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 + + + Sec-Fetch-Site + same-origin + + + Sec-Fetch-Mode + navigate + + + Sec-Fetch-Dest + document + + + Referer + https://${SITEMINDER_URL}/clp-cgi/preLogon.cgi + + + Accept-Encoding + gzip, deflate, br + + + Accept-Language + en-US,en;q=0.9 + + + Cookie + _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; Dummy1=DummyVal1; BCGOVFlags=0101%3A0%2C7; BCGOVCustom=NULL; BCGOVBrand=NULL; BCGOVBehavior=NULL; Dummy2=DummyVal2; preDummy1=DummyVal1; preDummy2=DummyVal2; preDummy3=DummyVal3; BCGOVDoNotShow=1; preDummy4=DummyVal4; FAILREASON=0; SMSESSION=LOGGEDOFF; SMFED_OLD_SESSION=""; SMFED_OLD_IDENTITY=""; GUID=1:26feb557-62af2c8c-4ef3a8d7-2e2277be-6a76895c-697; BCGOVTarget=HTTPS%3A%2F%2Fsfstest7.gov.bc.ca%2Faffwebservices%2Fredirectjsp%2Ftestkeycloak-basicbusinessbceid%2Fredirect.jsp%3FSMPORTALURL%3Dhttps%253A%252F%252Fsfstest7.gov.bc.ca%252Faffwebservices%252Fpublic%252Fsaml2sso%26SAMLTRANSACTIONID%3Dc9f189ad-7324de1b-2e045e1a-e8bcf162-a78af00c-c5; BCGOVclptryno=1; clp001=Salted__%8E%F5%14%93%F3.%C8%8C%C2%B3%84%8B%8EC%E0%88%AAK%01%C77%B6%C4g%C3%D2%3ELS%06%7CdJp%18%E9TJ%8A%D3a%A9%AD%3C%5E%DBZ%D7 + + + + + + + + + + false + + = + + + + + + + + https://${SITEMINDER_URL}/clp-cgi/cap07/private/postLogon.cgi + GET + true + false + true + false + + + + + + + + + Host + ${SITEMINDER_URL} + + + Connection + keep-alive + + + Cache-Control + max-age=0 + + + Upgrade-Insecure-Requests + 1 + + + User-Agent + Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 + + + Accept + text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 + + + Sec-Fetch-Site + same-origin + + + Sec-Fetch-Mode + navigate + + + Sec-Fetch-Dest + document + + + sec-ch-ua + "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" + + + sec-ch-ua-mobile + ?0 + + + sec-ch-ua-platform + "Windows" + + + Referer + https://${SITEMINDER_URL}/clp-cgi/preLogon.cgi + + + Accept-Encoding + gzip, deflate, br + + + Accept-Language + en-US,en;q=0.9 + + + Cookie + _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; Dummy1=DummyVal1; BCGOVFlags=0101%3A0%2C7; BCGOVCustom=NULL; BCGOVBrand=NULL; BCGOVBehavior=NULL; Dummy2=DummyVal2; preDummy1=DummyVal1; preDummy2=DummyVal2; preDummy3=DummyVal3; BCGOVDoNotShow=1; preDummy4=DummyVal4; FAILREASON=0; SMSESSION=LOGGEDOFF; SMFED_OLD_SESSION=""; SMFED_OLD_IDENTITY=""; GUID=1:26feb557-62af2c8c-4ef3a8d7-2e2277be-6a76895c-697; BCGOVTarget=HTTPS%3A%2F%2Fsfstest7.gov.bc.ca%2Faffwebservices%2Fredirectjsp%2Ftestkeycloak-basicbusinessbceid%2Fredirect.jsp%3FSMPORTALURL%3Dhttps%253A%252F%252Fsfstest7.gov.bc.ca%252Faffwebservices%252Fpublic%252Fsaml2sso%26SAMLTRANSACTIONID%3Dc9f189ad-7324de1b-2e045e1a-e8bcf162-a78af00c-c5; BCGOVclptryno=1; clp001=Salted__%8E%F5%14%93%F3.%C8%8C%C2%B3%84%8B%8EC%E0%88%AAK%01%C77%B6%C4g%C3%D2%3ELS%06%7CdJp%18%E9TJ%8A%D3a%A9%AD%3C%5E%DBZ%D7; FORMCRED=2ZS4S2F4tb41FWGyAD293ZV3eiMsCRYZ+ktOitYzjWY/fG/2BFtCWHSnbkvgJfBEm8aTuwAg3nMfeG0h8ahL0C1Q+SZp1d30x/imUNpQkjqP7yK+smpXGQMNWzNb15A+UXcYa0yUQLQ5rFoH720FIoiqZ4Nmikk7a67vktQxd8rpIduHeZJ7tAYb/b+pXPha + + + + + + + true + + + + false + RelayState=pkQKGHDSoVdRPpUZ1XHJWrVAUBtEl2EOcIu2bUhv0V0.k5Vw5BDlfVQ.standard-realm&SAMLResponse=PG5zNTpSZXNwb25zZSB4bWxuczpuczU9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpwcm90b2NvbCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDkveG1sZW5jMTEjIiB4bWxuczpuczI9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphc3NlcnRpb24iIHhtbG5zOm5zMz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyIgeG1sbnM6bnM0PSJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzA0L3htbGVuYyMiIERlc3RpbmF0aW9uPSJodHRwczovL3Rlc3QubG9naW5wcm94eS5nb3YuYmMuY2EvYXV0aC9yZWFsbXMvYmNlaWRib3RoL2Jyb2tlci9iY2VpZGJvdGgvZW5kcG9pbnQiIElEPSJfMzU0NWZlNjJmOGY3OThhNTk1ZWNlM2I2YzYxM2RmNmU5ZWFkIiBJblJlc3BvbnNlVG89IklEX2FhYTM1M2Q0LTdlNmMtNDQxNS05N2FkLWI2NmEzM2FhOTBkYyIgSXNzdWVJbnN0YW50PSIyMDIzLTEwLTMwVDE5OjU2OjM3LjE4MFoiIFZlcnNpb249IjIuMCI%2BDQogICAgPG5zMjpJc3N1ZXIgRm9ybWF0PSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6bmFtZWlkLWZvcm1hdDplbnRpdHkiPmh0dHBzOi8vdGVzdC5sb2dpbnByb3h5Lmdvdi5iYy5jYS9hdXRoL3JlYWxtcy9fYmNlaWRiYXNpY2J1c2luZXNzMS88L25zMjpJc3N1ZXI%2BDQogICAgPG5zNTpTdGF0dXM%2BDQogICAgICAgIDxuczU6U3RhdHVzQ29kZSBWYWx1ZT0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOnN0YXR1czpTdWNjZXNzIi8%2BDQogICAgPC9uczU6U3RhdHVzPg0KICAgIDxuczI6QXNzZXJ0aW9uIElEPSJfZWFmZTRjYWQ5MjU0MTEyZjQ5YTcxMDI1MGM3YjVhNDVjYmI2IiBJc3N1ZUluc3RhbnQ9IjIwMjMtMTAtMzBUMTk6NTY6MzcuMTgwWiIgVmVyc2lvbj0iMi4wIiB4bWxuczpuczI9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphc3NlcnRpb24iPg0KICAgICAgICA8bnMyOklzc3VlciBGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpuYW1laWQtZm9ybWF0OmVudGl0eSI%2BaHR0cHM6Ly90ZXN0LmxvZ2lucHJveHkuZ292LmJjLmNhL2F1dGgvcmVhbG1zL19iY2VpZGJhc2ljYnVzaW5lc3MxLzwvbnMyOklzc3Vlcj48ZHM6U2lnbmF0dXJlIHhtbG5zOmRzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIj48ZHM6U2lnbmVkSW5mbz48ZHM6Q2Fub25pY2FsaXphdGlvbk1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvMTAveG1sLWV4Yy1jMTRuIyIvPjxkczpTaWduYXR1cmVNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzA0L3htbGRzaWctbW9yZSNyc2Etc2hhMjU2Ii8%2BPGRzOlJlZmVyZW5jZSBVUkk9IiNfZWFmZTRjYWQ5MjU0MTEyZjQ5YTcxMDI1MGM3YjVhNDVjYmI2Ij48ZHM6VHJhbnNmb3Jtcz48ZHM6VHJhbnNmb3JtIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI2VudmVsb3BlZC1zaWduYXR1cmUiLz48ZHM6VHJhbnNmb3JtIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS8xMC94bWwtZXhjLWMxNG4jIi8%2BPC9kczpUcmFuc2Zvcm1zPjxkczpEaWdlc3RNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzA0L3htbGVuYyNzaGEyNTYiLz48ZHM6RGlnZXN0VmFsdWU%2BS0c3SWRyMko3ODNGVGFkNkVZM0hHUklyRFpnUXU1TmdOQ1JBRU1vcERkYz08L2RzOkRpZ2VzdFZhbHVlPjwvZHM6UmVmZXJlbmNlPjwvZHM6U2lnbmVkSW5mbz48ZHM6U2lnbmF0dXJlVmFsdWU%2BbHJlNnpwalpyUEpKZmVqYStkUHN3cUhlVDN6a3VkNjA4emppZE4vWlBRMjdmSW56aHFWQ2lreDhHcld4V29jSWM4ekhHb1cxZmJqTXlBSkIwNnRHS2pXdzBXMWExTlIyL2VlVGQ1MFY1RnF4NndIb001NFVmYUkvY0N6dDdsMUNUQ2lHZzB6UkVLZjRDK3RxcWJaQ3QyRlFCQ20vd0xaNHRrdXVsZUh4WTZqdGJxWXBlbmpvSzQ2TGlocE1CejIvczBDRmQ3c1BxVjF4bHJpWXVtd1dtSlV1b0o1d0M1L2ZMZ3djTUlmSVMwd29SZmQzclBTN1pBWk5vWXExVVpWQ2xmemZMZ1hNc3JsM2k2S0F3SS80N01pSVpzeGNaaFd1Q3dMTFdFSXdzRWQzWlNLZFhXUTF1U0RrSGlIUGIrcXFmSTJQRGJwK2l1bHFDdlo2S3BCVzdnPT08L2RzOlNpZ25hdHVyZVZhbHVlPjxkczpLZXlJbmZvIHhtbG5zOmRzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIj48ZHM6WDUwOURhdGE%2BPGRzOlg1MDlDZXJ0aWZpY2F0ZT5NSUlFQ3pDQ0F2TUNDUUNkb1dONFh0VUk2VEFOQmdrcWhraUc5dzBCQVFzRkFEQ0J5akVMTUFrR0ExVUVCaE1DUTBFeEdUQVhCZ05WQkFnVEVFSnlhWFJwYzJnZ1EyOXNkVzFpYVdFeEVUQVBCZ05WQkFjVENGWnBZM1J2Y21saE1UY3dOUVlEVlFRS0V5NUhiM1psY201dFpXNTBJRzltSUhSb1pTQlFjbTkyYVc1alpTQnZaaUJDY21sMGFYTm9JRU52YkhWdFltbGhNUTh3RFFZRFZRUUxFd1pUUmxNdFEwRXhJakFnQmdOVkJBTVRHVk5HVXlCRFpYSjBhV1pwWTJGMFpTQkJkWFJvYjNKcGRIa3hIekFkQmdrcWhraUc5dzBCQ1FFV0VGZFVVMWRCVFVCbmIzWXVZbU11WTJFd0hoY05NVE13TkRBMU1qSTFOalUzV2hjTk16TXdOREExTWpJMU5qVTNXakNCd3pFTE1Ba0dBMVVFQmhNQ1EwRXhHVEFYQmdOVkJBZ1RFRUp5YVhScGMyZ2dRMjlzZFcxaWFXRXhFVEFQQmdOVkJBY1RDRlpwWTNSdmNtbGhNVGN3TlFZRFZRUUtFeTVIYjNabGNtNXRaVzUwSUc5bUlIUm9aU0JRY205MmFXNWpaU0J2WmlCQ2NtbDBhWE5vSUVOdmJIVnRZbWxoTVF3d0NnWURWUVFMRXdOVFJsTXhIakFjQmdOVkJBTVRGWE5tY3kxelpuTjBaWE4wTG1kdmRpNWlZeTVqWVRFZk1CMEdDU3FHU0liM0RRRUpBUllRVjFSVFYwRk5RR2R2ZGk1aVl5NWpZVENDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFKdzVFMDQ1amxKK3NiU2dOZmt2eUpBMysyN0tSQm1BbHErTVVSb1IzT1NpV2MyME1XZHQ1cEt4ZFJVcTJmWXhyUWp0cnRQdUdxa2tFR2FlSTBpTlp3UkluYnk2SHU2dWJDd2YxUTdmVGxXNzhscytDak5rWU5VQzMvd3VDM21uMVFuZzhVMGxkUTd0UVU0Y1BPcXdMSXZTaUpkaUpacm1GOFJEcHBvZFljSGhiaWo3N3Q2dGlIVkN4UVlncXhOY3V0M2d3bnhWcjI0MTZ5V0hYVnFxcGNjS0xUaUkvSm9lQ2I1b0kyVVVDcmRldnlXZDRINXFOWmx5NGhMNVBCQ1lZNFR1cFVheWpoYldmeEpLNFVXY0R2N09PYSt1eHE0a1luR2V4RHBxQ2JXNmJ2Y0hiazQ3UDVSQVpJdmd2bkdvQmdTZm9oMzd6eFEvRnA2VkU0aVdBdWNDQXdFQUFUQU5CZ2txaGtpRzl3MEJBUXNGQUFPQ0FRRUFiZGtqUTl1SHB2ZGtTZUlHT25meHU0Vm5mM2pHTzR5bzgrQnJub0dhTEM4aTJDV21Wb2RpOUdPdTNIM2pyR3ZzU296N242QzJBK3ZJdkR4dkE3dHdqd0xBcXVaVlFKbkJDcE1LbXdsUENBQ0F3WitFbGI0cjJxTW14YTJGbTBJZVl6M3gyQldZT0FUdGljODFmRnpoSjhRa1dCdXdiOStkSiswbC9HR1FmOXBPMnFpSXFVRWQyb0lVVkR4cVdSWXpoUGV6ZWpwZlZqQnNUUFhZNXhRaGRCVUtITXIwWnBTVTlrTW9KemNNMW42bEpIN3BGSFpCVUtONzkyaG9FNTVPbEszTFFMVW9oKzNXNEROL1lWS2tEczZrSHI0b0w2dXo5ajJXODRIVVBYNURMbUZGaUorTHBTMDUyVkJ0WWNoangyQnQwRlBzSEpKNEMwRjByNUc0b3c9PTwvZHM6WDUwOUNlcnRpZmljYXRlPjwvZHM6WDUwOURhdGE%2BPC9kczpLZXlJbmZvPjwvZHM6U2lnbmF0dXJlPg0KICAgICAgICA8bnMyOlN1YmplY3Q%2BDQogICAgICAgICAgICA8bnMyOk5hbWVJRCBGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpuYW1laWQtZm9ybWF0OnBlcnNpc3RlbnQiPkE5RUQyQzU3NDJEQzQ1NTk5ODY3MkNDMkExMTgxNzRCPC9uczI6TmFtZUlEPg0KICAgICAgICAgICAgPG5zMjpTdWJqZWN0Q29uZmlybWF0aW9uIE1ldGhvZD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmNtOmJlYXJlciI%2BDQogICAgICAgICAgICAgICAgPG5zMjpTdWJqZWN0Q29uZmlybWF0aW9uRGF0YSBJblJlc3BvbnNlVG89IklEX2FhYTM1M2Q0LTdlNmMtNDQxNS05N2FkLWI2NmEzM2FhOTBkYyIgTm90T25PckFmdGVyPSIyMDIzLTEwLTMwVDE5OjU4OjA3LjE0OFoiIFJlY2lwaWVudD0iaHR0cHM6Ly90ZXN0LmxvZ2lucHJveHkuZ292LmJjLmNhL2F1dGgvcmVhbG1zL2JjZWlkYm90aC9icm9rZXIvYmNlaWRib3RoL2VuZHBvaW50Ii8%2BDQogICAgICAgICAgICA8L25zMjpTdWJqZWN0Q29uZmlybWF0aW9uPg0KICAgICAgICA8L25zMjpTdWJqZWN0Pg0KICAgICAgICA8bnMyOkNvbmRpdGlvbnMgTm90QmVmb3JlPSIyMDIzLTEwLTMwVDE5OjU2OjA3LjE0OFoiIE5vdE9uT3JBZnRlcj0iMjAyMy0xMC0zMFQxOTo1ODowNy4xNDhaIj4NCiAgICAgICAgICAgIDxuczI6QXVkaWVuY2VSZXN0cmljdGlvbj4NCiAgICAgICAgICAgICAgICA8bnMyOkF1ZGllbmNlPmh0dHBzOi8vdGVzdC5sb2dpbnByb3h5Lmdvdi5iYy5jYS9hdXRoL3JlYWxtcy9fYmNlaWRiYXNpY2J1c2luZXNzMS88L25zMjpBdWRpZW5jZT4NCiAgICAgICAgICAgIDwvbnMyOkF1ZGllbmNlUmVzdHJpY3Rpb24%2BDQogICAgICAgIDwvbnMyOkNvbmRpdGlvbnM%2BDQogICAgICAgIDxuczI6QXV0aG5TdGF0ZW1lbnQgQXV0aG5JbnN0YW50PSIyMDIzLTEwLTMwVDE5OjU2OjM1LjEzMloiIFNlc3Npb25JbmRleD0ibGdlQ1pvN01aRnpJaFFiU1dGcXg1SDJiK1U0PXlMMWRQUT09IiBTZXNzaW9uTm90T25PckFmdGVyPSIyMDIzLTEwLTMwVDE5OjU4OjA3LjEzMloiPg0KICAgICAgICAgICAgPG5zMjpBdXRobkNvbnRleHQ%2BDQogICAgICAgICAgICAgICAgPG5zMjpBdXRobkNvbnRleHRDbGFzc1JlZj51cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6YWM6Y2xhc3NlczpQYXNzd29yZDwvbnMyOkF1dGhuQ29udGV4dENsYXNzUmVmPg0KICAgICAgICAgICAgPC9uczI6QXV0aG5Db250ZXh0Pg0KICAgICAgICA8L25zMjpBdXRoblN0YXRlbWVudD4NCiAgICAgICAgPG5zMjpBdHRyaWJ1dGVTdGF0ZW1lbnQ%2BDQogICAgICAgICAgICA8bnMyOkF0dHJpYnV0ZSBOYW1lPSJiY2VpZF91c2VybmFtZSIgTmFtZUZvcm1hdD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmF0dHJuYW1lLWZvcm1hdDp1bnNwZWNpZmllZCI%2BDQogICAgICAgICAgICAgICAgPG5zMjpBdHRyaWJ1dGVWYWx1ZSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTp0eXBlPSJ4czpzdHJpbmciPk9SQkNUU1QzPC9uczI6QXR0cmlidXRlVmFsdWU%2BDQogICAgICAgICAgICA8L25zMjpBdHRyaWJ1dGU%2BDQogICAgICAgICAgICA8bnMyOkF0dHJpYnV0ZSBOYW1lPSJkaXNwbGF5X25hbWUiIE5hbWVGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphdHRybmFtZS1mb3JtYXQ6dW5zcGVjaWZpZWQiPg0KICAgICAgICAgICAgICAgIDxuczI6QXR0cmlidXRlVmFsdWUgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6dHlwZT0ieHM6c3RyaW5nIj5CcnlhbiBMYW5lPC9uczI6QXR0cmlidXRlVmFsdWU%2BDQogICAgICAgICAgICA8L25zMjpBdHRyaWJ1dGU%2BDQogICAgICAgICAgICA8bnMyOkF0dHJpYnV0ZSBOYW1lPSJiY2VpZF91c2VyX2d1aWQiIE5hbWVGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphdHRybmFtZS1mb3JtYXQ6dW5zcGVjaWZpZWQiPg0KICAgICAgICAgICAgICAgIDxuczI6QXR0cmlidXRlVmFsdWUgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6dHlwZT0ieHM6c3RyaW5nIj5BOUVEMkM1NzQyREM0NTU5OTg2NzJDQzJBMTE4MTc0QjwvbnMyOkF0dHJpYnV0ZVZhbHVlPg0KICAgICAgICAgICAgPC9uczI6QXR0cmlidXRlPg0KICAgICAgICAgICAgPG5zMjpBdHRyaWJ1dGUgTmFtZT0iZW1haWwiIE5hbWVGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphdHRybmFtZS1mb3JtYXQ6dW5zcGVjaWZpZWQiPg0KICAgICAgICAgICAgICAgIDxuczI6QXR0cmlidXRlVmFsdWUgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6dHlwZT0ieHM6c3RyaW5nIj5icnlhbi5sYW5lQGdvdi5iYy5jYTwvbnMyOkF0dHJpYnV0ZVZhbHVlPg0KICAgICAgICAgICAgPC9uczI6QXR0cmlidXRlPg0KICAgICAgICA8bnMyOkF0dHJpYnV0ZSBOYW1lPSJTTUdPVl9CVVNJTkVTU0dVSUQiIE5hbWVGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphdHRybmFtZS1mb3JtYXQ6dW5zcGVjaWZpZWQiPjxuczI6QXR0cmlidXRlVmFsdWU%2BRjQwMjNEQjNDMzBGNDg3QjlBRjVCMTRDOTU4OTg5Rjg8L25zMjpBdHRyaWJ1dGVWYWx1ZT48L25zMjpBdHRyaWJ1dGU%2BPG5zMjpBdHRyaWJ1dGUgTmFtZT0iU01HT1ZfQlVTSU5FU1NMRUdBTE5BTUUiIE5hbWVGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphdHRybmFtZS1mb3JtYXQ6dW5zcGVjaWZpZWQiPjxuczI6QXR0cmlidXRlVmFsdWU%2BU29uaWMgRGVsaXZlcnkgU2VydmljZXM8L25zMjpBdHRyaWJ1dGVWYWx1ZT48L25zMjpBdHRyaWJ1dGU%2BPC9uczI6QXR0cmlidXRlU3RhdGVtZW50Pg0KICAgIDwvbnMyOkFzc2VydGlvbj4NCjwvbnM1OlJlc3BvbnNlPg%3D%3D + = + + + + + + + + https://${KEYCLOAK_LOGIN_URL}/auth/realms/bceidboth/broker/bceidboth/endpoint + POST + true + false + true + false + + + + + + + + + Host + ${KEYCLOAK_LOGIN_URL} + + + Connection + keep-alive + + + Content-Length + 9217 + + + Cache-Control + max-age=0 + + + sec-ch-ua + "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" + + + sec-ch-ua-mobile + ?0 + + + sec-ch-ua-platform + "Windows" + + + Upgrade-Insecure-Requests + 1 + + + Origin + https://sfstest7.gov.bc.ca + + + Content-Type + application/x-www-form-urlencoded + + + User-Agent + Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 + + + Accept + text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 + + + Sec-Fetch-Site + same-site + + + Sec-Fetch-Mode + navigate + + + Sec-Fetch-Dest + document + + + Referer + https://sfstest7.gov.bc.ca/ + + + Accept-Encoding + gzip, deflate, br + + + Accept-Language + en-US,en;q=0.9 + + + Cookie + AUTH_SESSION_ID=f26f78a0-28d2-40b4-9e57-b83fa590e32e.ycloak-78b4c74bcf-vtmwp; AUTH_SESSION_ID_LEGACY=f26f78a0-28d2-40b4-9e57-b83fa590e32e.ycloak-78b4c74bcf-vtmwp; KC_RESTART=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI1ZjExNjBiNS03Y2RjLTQ5NGQtYmFkOS0yZGRkNjU3MDU5Y2UifQ.eyJjaWQiOiJzdGFuZGFyZC1yZWFsbSIsInB0eSI6Im9wZW5pZC1jb25uZWN0IiwicnVyaSI6Imh0dHBzOi8vdGVzdC5sb2dpbnByb3h5Lmdvdi5iYy5jYS9hdXRoL3JlYWxtcy9zdGFuZGFyZC9icm9rZXIvYmNlaWRib3RoL2VuZHBvaW50IiwiYWN0IjoiQVVUSEVOVElDQVRFIiwibm90ZXMiOnsic2NvcGUiOiJvcGVuaWQiLCJpc3MiOiJodHRwczovL3Rlc3QubG9naW5wcm94eS5nb3YuYmMuY2EvYXV0aC9yZWFsbXMvYmNlaWRib3RoIiwicmVzcG9uc2VfdHlwZSI6ImNvZGUiLCJyZWRpcmVjdF91cmkiOiJodHRwczovL3Rlc3QubG9naW5wcm94eS5nb3YuYmMuY2EvYXV0aC9yZWFsbXMvc3RhbmRhcmQvYnJva2VyL2JjZWlkYm90aC9lbmRwb2ludCIsInN0YXRlIjoiSnZJeWZtb2owQXptQlpXdzBaUzhsQm1oTUpYZDdsQV91QVI4SlF2TE5sRS5LQXhZWGpvYXRHYy5vbi1yb3V0ZS1iYy1kaXJlY3QtNDU5OCIsIm5vbmNlIjoiMXNLV21kWjBhVjZRSXNjYjY1THJtZyJ9fQ.08S_Qi57kTkuLj_eH5VElw2zeuH4AVhfOUois5IUzEI; _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; FAILREASON=0; SMSESSION=Awk9KIrMNenX09Vl2cEMuy/VxV9CFVP4fsBzCp8Zo3AX2VsrDVWkOMVOdJyoY1Q1J9F8Vs8XFBtHTU29qS7+jlhEMK3f9j8tgudEVWHJq8LTizGhEj1cf8r7CX2QuxWMbdAHvK90hFnpocsL5xv2cAaFVdqhBKlIYkzwkY+r0YuH3Uh6DJVIhAhwjWeKfO6BAg5/jNFxQ31EPvzn4N7RxJK2bGyfAxzi6Cs6O7ieJ10MzcB8nWSIsO4ksfG8pzeGp9a+arl4maKnd9Je2L2FQohmiOjfGcrsezOgLgiWFl1B3+EL8ytArvtKhsFvr7WJsQuhYsQYzfY8shcfhNSltyqxLD422bDmU3NyZdhWY9313YG5I1U2vbO7zvXhxaCJYnpMrJR+inz8XsyqnGY1xu7AepY3pNd2wJH3twQJ42N6R2WlJVVN3oc3DvEHUbk85xrqHdwngd/FiMdEC2f5Kt51VYp8G/3R+sbFiy6Wt7wlZw2+/wI8EfxXs31HQ5q/RDUTXz6JMbzsR7EUOF+WkOrgi1nDugu13/O9hDnxPJnkzNGEfjt0xPxdhoDdl4vWdwRe1awBEn90SyJwc8+cFk1XACtvWoGwtPdf1xnHUwx5Ge1TqEd46xdjjlu+iTw2Xu5AsESUVVw81STsKA7vC8EBabQ+yXQHZlNFcFCKa1+AutNxfWHNQtnFK03kUCai4ZPJc/TQrhvf9DWjSyX+KknWdV6aQyz65KOpwtQWpd4ZlqAAKvf9vCQIBgk+YdsxFzAq6ySnLPcBLbFvP+Xyo5bcABg8IS9aJr6+05KT3ZOv49G1uYvz1ILaDED83D5NHF57ZswKR2911SevaqIO2i8NkZAJUMBpgroSejoJ1MxzpL/a7I26u6+p/08uMt/dT7vuo5OTTjayEtIlXy1IRXA/jU/uX/pKk1JrsZFhhwj7G5KEQpMAx+YvZUaaidqyfj3+fLb6+rsa8BukV8x0zfgUg20dm+Wu9XjDvyQHFP4Qt65CaUbhAKcVTgCChgTfSSdUJZIPPa5Yhzr7SmTuVGmYV/1cC4jGzNdSqr3Fq28fWukiEnRtqfZRXlOdA6xb + + + + + + + + + + false + + = + + + + + + + + https://${KEYCLOAK_LOGIN_URL}/auth/realms/standard/broker/bceidboth/endpoint?state=JvIyfmoj0AzmBZWw0ZS8lBmhMJXd7lA_uAR8JQvLNlE.KAxYXjoatGc.on-route-bc-direct-4598&session_state=f26f78a0-28d2-40b4-9e57-b83fa590e32e&code=c5719177-78e8-4d75-857a-0ef191c765d1.f26f78a0-28d2-40b4-9e57-b83fa590e32e.1123d85b-badf-4084-a3a6-b1c920ccb0c0 + GET + true + false + true + false + + + + + + + + + Host + ${KEYCLOAK_LOGIN_URL} + + + Connection + keep-alive + + + Cache-Control + max-age=0 + + + Upgrade-Insecure-Requests + 1 + + + User-Agent + Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 + + + Accept + text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 + + + Sec-Fetch-Site + same-site + + + Sec-Fetch-Mode + navigate + + + Sec-Fetch-Dest + document + + + sec-ch-ua + "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" + + + sec-ch-ua-mobile + ?0 + + + sec-ch-ua-platform + "Windows" + + + Accept-Encoding + gzip, deflate, br + + + Accept-Language + en-US,en;q=0.9 + + + Cookie + AUTH_SESSION_ID=0e56ff7b-e277-400f-84f5-25801c43c829.ycloak-78b4c74bcf-kh476; AUTH_SESSION_ID_LEGACY=0e56ff7b-e277-400f-84f5-25801c43c829.ycloak-78b4c74bcf-kh476; KC_RESTART=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICIzMmI0MzNkNC02NjgwLTQxODMtOTc2Yy1kZDdjMTg0YjExMTQifQ.eyJjaWQiOiJvbi1yb3V0ZS1iYy1kaXJlY3QtNDU5OCIsInB0eSI6Im9wZW5pZC1jb25uZWN0IiwicnVyaSI6Imh0dHBzOi8vb25yb3V0ZWJjLXRlc3QtZnJvbnRlbmQuYXBwcy5zaWx2ZXIuZGV2b3BzLmdvdi5iYy5jYS8iLCJhY3QiOiJBVVRIRU5USUNBVEUiLCJub3RlcyI6eyJzY29wZSI6Im9wZW5pZCIsImlzcyI6Imh0dHBzOi8vdGVzdC5sb2dpbnByb3h5Lmdvdi5iYy5jYS9hdXRoL3JlYWxtcy9zdGFuZGFyZCIsInJlc3BvbnNlX3R5cGUiOiJjb2RlIiwiY29kZV9jaGFsbGVuZ2VfbWV0aG9kIjoiUzI1NiIsInJlZGlyZWN0X3VyaSI6Imh0dHBzOi8vb25yb3V0ZWJjLXRlc3QtZnJvbnRlbmQuYXBwcy5zaWx2ZXIuZGV2b3BzLmdvdi5iYy5jYS8iLCJzdGF0ZSI6IjdiZTBmNDk4ZGRmYTQ1ZTI4ZWU4ZjI0MTY0NzViYTQyIiwiY29kZV9jaGFsbGVuZ2UiOiJCNEpzelBjUzBIT1c3RUNUVFVVUkMxbXA2ejhhdDJiNkswbEQxdUtfMTFBIiwia2NfaWRwX2hpbnQiOiJiY2VpZGJvdGgiLCJyZXNwb25zZV9tb2RlIjoicXVlcnkifX0.2dLZTTjk8ZY0EFAaE88sAWQlfo7T17XcYLztnQwI_Yk; _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; FAILREASON=0; SMSESSION=Awk9KIrMNenX09Vl2cEMuy/VxV9CFVP4fsBzCp8Zo3AX2VsrDVWkOMVOdJyoY1Q1J9F8Vs8XFBtHTU29qS7+jlhEMK3f9j8tgudEVWHJq8LTizGhEj1cf8r7CX2QuxWMbdAHvK90hFnpocsL5xv2cAaFVdqhBKlIYkzwkY+r0YuH3Uh6DJVIhAhwjWeKfO6BAg5/jNFxQ31EPvzn4N7RxJK2bGyfAxzi6Cs6O7ieJ10MzcB8nWSIsO4ksfG8pzeGp9a+arl4maKnd9Je2L2FQohmiOjfGcrsezOgLgiWFl1B3+EL8ytArvtKhsFvr7WJsQuhYsQYzfY8shcfhNSltyqxLD422bDmU3NyZdhWY9313YG5I1U2vbO7zvXhxaCJYnpMrJR+inz8XsyqnGY1xu7AepY3pNd2wJH3twQJ42N6R2WlJVVN3oc3DvEHUbk85xrqHdwngd/FiMdEC2f5Kt51VYp8G/3R+sbFiy6Wt7wlZw2+/wI8EfxXs31HQ5q/RDUTXz6JMbzsR7EUOF+WkOrgi1nDugu13/O9hDnxPJnkzNGEfjt0xPxdhoDdl4vWdwRe1awBEn90SyJwc8+cFk1XACtvWoGwtPdf1xnHUwx5Ge1TqEd46xdjjlu+iTw2Xu5AsESUVVw81STsKA7vC8EBabQ+yXQHZlNFcFCKa1+AutNxfWHNQtnFK03kUCai4ZPJc/TQrhvf9DWjSyX+KknWdV6aQyz65KOpwtQWpd4ZlqAAKvf9vCQIBgk+YdsxFzAq6ySnLPcBLbFvP+Xyo5bcABg8IS9aJr6+05KT3ZOv49G1uYvz1ILaDED83D5NHF57ZswKR2911SevaqIO2i8NkZAJUMBpgroSejoJ1MxzpL/a7I26u6+p/08uMt/dT7vuo5OTTjayEtIlXy1IRXA/jU/uX/pKk1JrsZFhhwj7G5KEQpMAx+YvZUaaidqyfj3+fLb6+rsa8BukV8x0zfgUg20dm+Wu9XjDvyQHFP4Qt65CaUbhAKcVTgCChgTfSSdUJZIPPa5Yhzr7SmTuVGmYV/1cC4jGzNdSqr3Fq28fWukiEnRtqfZRXlOdA6xb + + + + + + + + + + false + + = + + + + + + + + https://${KEYCLOAK_LOGIN_URL}/auth/realms/standard/login-actions/post-broker-login?client_id=on-route-bc-direct-4598&tab_id=KAxYXjoatGc + GET + true + false + true + false + + + + + + + + + Host + ${KEYCLOAK_LOGIN_URL} + + + Connection + keep-alive + + + Cache-Control + max-age=0 + + + Upgrade-Insecure-Requests + 1 + + + User-Agent + Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 + + + Accept + text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 + + + Sec-Fetch-Site + same-site + + + Sec-Fetch-Mode + navigate + + + Sec-Fetch-Dest + document + + + sec-ch-ua + "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" + + + sec-ch-ua-mobile + ?0 + + + sec-ch-ua-platform + "Windows" + + + Accept-Encoding + gzip, deflate, br + + + Accept-Language + en-US,en;q=0.9 + + + Cookie + AUTH_SESSION_ID=0e56ff7b-e277-400f-84f5-25801c43c829.ycloak-78b4c74bcf-kh476; AUTH_SESSION_ID_LEGACY=0e56ff7b-e277-400f-84f5-25801c43c829.ycloak-78b4c74bcf-kh476; KC_RESTART=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICIzMmI0MzNkNC02NjgwLTQxODMtOTc2Yy1kZDdjMTg0YjExMTQifQ.eyJjaWQiOiJvbi1yb3V0ZS1iYy1kaXJlY3QtNDU5OCIsInB0eSI6Im9wZW5pZC1jb25uZWN0IiwicnVyaSI6Imh0dHBzOi8vb25yb3V0ZWJjLXRlc3QtZnJvbnRlbmQuYXBwcy5zaWx2ZXIuZGV2b3BzLmdvdi5iYy5jYS8iLCJhY3QiOiJBVVRIRU5USUNBVEUiLCJub3RlcyI6eyJzY29wZSI6Im9wZW5pZCIsImlzcyI6Imh0dHBzOi8vdGVzdC5sb2dpbnByb3h5Lmdvdi5iYy5jYS9hdXRoL3JlYWxtcy9zdGFuZGFyZCIsInJlc3BvbnNlX3R5cGUiOiJjb2RlIiwiY29kZV9jaGFsbGVuZ2VfbWV0aG9kIjoiUzI1NiIsInJlZGlyZWN0X3VyaSI6Imh0dHBzOi8vb25yb3V0ZWJjLXRlc3QtZnJvbnRlbmQuYXBwcy5zaWx2ZXIuZGV2b3BzLmdvdi5iYy5jYS8iLCJzdGF0ZSI6IjdiZTBmNDk4ZGRmYTQ1ZTI4ZWU4ZjI0MTY0NzViYTQyIiwiY29kZV9jaGFsbGVuZ2UiOiJCNEpzelBjUzBIT1c3RUNUVFVVUkMxbXA2ejhhdDJiNkswbEQxdUtfMTFBIiwia2NfaWRwX2hpbnQiOiJiY2VpZGJvdGgiLCJyZXNwb25zZV9tb2RlIjoicXVlcnkifX0.2dLZTTjk8ZY0EFAaE88sAWQlfo7T17XcYLztnQwI_Yk; _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; FAILREASON=0; SMSESSION=Awk9KIrMNenX09Vl2cEMuy/VxV9CFVP4fsBzCp8Zo3AX2VsrDVWkOMVOdJyoY1Q1J9F8Vs8XFBtHTU29qS7+jlhEMK3f9j8tgudEVWHJq8LTizGhEj1cf8r7CX2QuxWMbdAHvK90hFnpocsL5xv2cAaFVdqhBKlIYkzwkY+r0YuH3Uh6DJVIhAhwjWeKfO6BAg5/jNFxQ31EPvzn4N7RxJK2bGyfAxzi6Cs6O7ieJ10MzcB8nWSIsO4ksfG8pzeGp9a+arl4maKnd9Je2L2FQohmiOjfGcrsezOgLgiWFl1B3+EL8ytArvtKhsFvr7WJsQuhYsQYzfY8shcfhNSltyqxLD422bDmU3NyZdhWY9313YG5I1U2vbO7zvXhxaCJYnpMrJR+inz8XsyqnGY1xu7AepY3pNd2wJH3twQJ42N6R2WlJVVN3oc3DvEHUbk85xrqHdwngd/FiMdEC2f5Kt51VYp8G/3R+sbFiy6Wt7wlZw2+/wI8EfxXs31HQ5q/RDUTXz6JMbzsR7EUOF+WkOrgi1nDugu13/O9hDnxPJnkzNGEfjt0xPxdhoDdl4vWdwRe1awBEn90SyJwc8+cFk1XACtvWoGwtPdf1xnHUwx5Ge1TqEd46xdjjlu+iTw2Xu5AsESUVVw81STsKA7vC8EBabQ+yXQHZlNFcFCKa1+AutNxfWHNQtnFK03kUCai4ZPJc/TQrhvf9DWjSyX+KknWdV6aQyz65KOpwtQWpd4ZlqAAKvf9vCQIBgk+YdsxFzAq6ySnLPcBLbFvP+Xyo5bcABg8IS9aJr6+05KT3ZOv49G1uYvz1ILaDED83D5NHF57ZswKR2911SevaqIO2i8NkZAJUMBpgroSejoJ1MxzpL/a7I26u6+p/08uMt/dT7vuo5OTTjayEtIlXy1IRXA/jU/uX/pKk1JrsZFhhwj7G5KEQpMAx+YvZUaaidqyfj3+fLb6+rsa8BukV8x0zfgUg20dm+Wu9XjDvyQHFP4Qt65CaUbhAKcVTgCChgTfSSdUJZIPPa5Yhzr7SmTuVGmYV/1cC4jGzNdSqr3Fq28fWukiEnRtqfZRXlOdA6xb + + + + + + + + + + false + + = + + + + + + + + https://${FRONTEND_API_URL}/?state=7be0f498ddfa45e28ee8f2416475ba42&session_state=0e56ff7b-e277-400f-84f5-25801c43c829&code=e1db6532-ce36-4aa5-845c-26c6d9f6e19f.0e56ff7b-e277-400f-84f5-25801c43c829.f462b30d-0893-4a2d-8169-3461d82c36eb + GET + true + false + true + false + + + + + + + + + Host + ${FRONTEND_API_URL} + + + Connection + keep-alive + + + Cache-Control + max-age=0 + + + Upgrade-Insecure-Requests + 1 + + + User-Agent + Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 + + + Accept + text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 + + + Sec-Fetch-Site + same-site + + + Sec-Fetch-Mode + navigate + + + Sec-Fetch-Dest + document + + + sec-ch-ua + "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" + + + sec-ch-ua-mobile + ?0 + + + sec-ch-ua-platform + "Windows" + + + Accept-Encoding + gzip, deflate, br + + + Accept-Language + en-US,en;q=0.9 + + + Cookie + _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; FAILREASON=0; 9a75866e187615f9e3e688e8297548f9=1f5b60b83338df80ae3a11e1286008b7; SMSESSION=Awk9KIrMNenX09Vl2cEMuy/VxV9CFVP4fsBzCp8Zo3AX2VsrDVWkOMVOdJyoY1Q1J9F8Vs8XFBtHTU29qS7+jlhEMK3f9j8tgudEVWHJq8LTizGhEj1cf8r7CX2QuxWMbdAHvK90hFnpocsL5xv2cAaFVdqhBKlIYkzwkY+r0YuH3Uh6DJVIhAhwjWeKfO6BAg5/jNFxQ31EPvzn4N7RxJK2bGyfAxzi6Cs6O7ieJ10MzcB8nWSIsO4ksfG8pzeGp9a+arl4maKnd9Je2L2FQohmiOjfGcrsezOgLgiWFl1B3+EL8ytArvtKhsFvr7WJsQuhYsQYzfY8shcfhNSltyqxLD422bDmU3NyZdhWY9313YG5I1U2vbO7zvXhxaCJYnpMrJR+inz8XsyqnGY1xu7AepY3pNd2wJH3twQJ42N6R2WlJVVN3oc3DvEHUbk85xrqHdwngd/FiMdEC2f5Kt51VYp8G/3R+sbFiy6Wt7wlZw2+/wI8EfxXs31HQ5q/RDUTXz6JMbzsR7EUOF+WkOrgi1nDugu13/O9hDnxPJnkzNGEfjt0xPxdhoDdl4vWdwRe1awBEn90SyJwc8+cFk1XACtvWoGwtPdf1xnHUwx5Ge1TqEd46xdjjlu+iTw2Xu5AsESUVVw81STsKA7vC8EBabQ+yXQHZlNFcFCKa1+AutNxfWHNQtnFK03kUCai4ZPJc/TQrhvf9DWjSyX+KknWdV6aQyz65KOpwtQWpd4ZlqAAKvf9vCQIBgk+YdsxFzAq6ySnLPcBLbFvP+Xyo5bcABg8IS9aJr6+05KT3ZOv49G1uYvz1ILaDED83D5NHF57ZswKR2911SevaqIO2i8NkZAJUMBpgroSejoJ1MxzpL/a7I26u6+p/08uMt/dT7vuo5OTTjayEtIlXy1IRXA/jU/uX/pKk1JrsZFhhwj7G5KEQpMAx+YvZUaaidqyfj3+fLb6+rsa8BukV8x0zfgUg20dm+Wu9XjDvyQHFP4Qt65CaUbhAKcVTgCChgTfSSdUJZIPPa5Yhzr7SmTuVGmYV/1cC4jGzNdSqr3Fq28fWukiEnRtqfZRXlOdA6xb + + + + + + + + + + false + + = + true + + + + + + + + https://${KEYCLOAK_LOGIN_URL}/auth/realms/standard/.well-known/openid-configuration + GET + true + false + true + false + + + + + + + + + Host + ${KEYCLOAK_LOGIN_URL} + + + Connection + keep-alive + + + sec-ch-ua + "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" + + + Accept + application/jwk-set+json, application/json + + + sec-ch-ua-mobile + ?0 + + + User-Agent + Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 + + + sec-ch-ua-platform + "Windows" + + + Origin + https://${FRONTEND_API_URL} + + + Sec-Fetch-Site + same-site + + + Sec-Fetch-Mode + cors + + + Sec-Fetch-Dest + empty + + + Referer + https://${FRONTEND_API_URL}/ + + + Accept-Encoding + gzip, deflate, br + + + Accept-Language + en-US,en;q=0.9 + + + + + + + + + + false + + = + + + + + + + + https://${VEHICLES_API_URL}/users/user-context + OPTIONS + true + false + true + false + + + + + + + + + Host + ${VEHICLES_API_URL} + + + Connection + keep-alive + + + Accept + */* + + + Access-Control-Request-Method + POST + + + Access-Control-Request-Headers + authorization,content-type + + + Origin + https://${FRONTEND_API_URL} + + + User-Agent + Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 + + + Sec-Fetch-Mode + cors + + + Sec-Fetch-Site + same-site + + + Sec-Fetch-Dest + empty + + + Referer + https://${FRONTEND_API_URL}/ + + + Accept-Encoding + gzip, deflate, br + + + Accept-Language + en-US,en;q=0.9 + + + + + + + true + + + + false + {} + = + + + + + + + + https://${VEHICLES_API_URL}/users/user-context + POST + true + false + true + false + + + + + + + + + Host + ${VEHICLES_API_URL} + + + Connection + keep-alive + + + Content-Length + 2 + + + sec-ch-ua + "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" + + + Accept + application/json, text/plain, */* + + + Content-Type + application/json + + + sec-ch-ua-mobile + ?0 + + + Authorization + Bearer ${BCEID_BEARER_TOKEN} + + + User-Agent + Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 + + + sec-ch-ua-platform + "Windows" + + + Origin + https://${FRONTEND_API_URL} + + + Sec-Fetch-Site + same-site + + + Sec-Fetch-Mode + cors + + + Sec-Fetch-Dest + empty + + + Referer + https://${FRONTEND_API_URL}/ + + + Accept-Encoding + gzip, deflate, br + + + Accept-Language + en-US,en;q=0.9 + + + + + + + + + + false + + = + + + + + + + + https://${VEHICLES_API_URL}/users/roles?companyId=102 + OPTIONS + true + false + true + false + + + + + + + + + Host + ${VEHICLES_API_URL} + + + Connection + keep-alive + + + Accept + */* + + + Access-Control-Request-Method + GET + + + Access-Control-Request-Headers + authorization + + + Origin + https://${FRONTEND_API_URL} + + + User-Agent + Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 + + + Sec-Fetch-Mode + cors + + + Sec-Fetch-Site + same-site + + + Sec-Fetch-Dest + empty + + + Referer + https://${FRONTEND_API_URL}/ + + + Accept-Encoding + gzip, deflate, br + + + Accept-Language + en-US,en;q=0.9 + + + + + + + + + + false + + = + + + + + + + + https://${VEHICLES_API_URL}/users/roles?companyId=102 + GET + true + false + true + false + + + + + + + + + Host + ${VEHICLES_API_URL} + + + Connection + keep-alive + + + sec-ch-ua + "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" + + + Accept + application/json, text/plain, */* + + + sec-ch-ua-mobile + ?0 + + + Authorization + Bearer ${BCEID_BEARER_TOKEN} + + + User-Agent + Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 + + + sec-ch-ua-platform + "Windows" + + + Origin + https://${FRONTEND_API_URL} + + + Sec-Fetch-Site + same-site + + + Sec-Fetch-Mode + cors + + + Sec-Fetch-Dest + empty + + + Referer + https://${FRONTEND_API_URL}/ + + + Accept-Encoding + gzip, deflate, br + + + Accept-Language + en-US,en;q=0.9 + + + If-None-Match + W/"1b4-DdYKGtaFZ5+U7pxjw6uu3owPOfo" + + + + + + + + + + false + + = + + + + + + + + https://${VEHICLES_API_URL}/permits/applications?status=IN_PROGRESS&companyId=102&userGUID=A9ED2C5742DC455998672CC2A118174B + OPTIONS + true + false + true + false + + + + + + + + + Host + ${VEHICLES_API_URL} + + + Connection + keep-alive + + + Accept + */* + + + Access-Control-Request-Method + GET + + + Access-Control-Request-Headers + authorization + + + Origin + https://${FRONTEND_API_URL} + + + User-Agent + Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 + + + Sec-Fetch-Mode + cors + + + Sec-Fetch-Site + same-site + + + Sec-Fetch-Dest + empty + + + Referer + https://${FRONTEND_API_URL}/ + + + Accept-Encoding + gzip, deflate, br + + + Accept-Language + en-US,en;q=0.9 + + + + + + + + + + false + + = + true + + + + + + + + https://${VEHICLES_API_URL}/permits/applications?status=IN_PROGRESS&companyId=102&userGUID=A9ED2C5742DC455998672CC2A118174B + GET + true + false + true + false + + + + + + + + + Host + ${VEHICLES_API_URL} + + + Connection + keep-alive + + + sec-ch-ua + "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" + + + Accept + application/json, text/plain, */* + + + sec-ch-ua-mobile + ?0 + + + Authorization + Bearer ${BCEID_BEARER_TOKEN} + + + User-Agent + Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 + + + sec-ch-ua-platform + "Windows" + + + Origin + https://${FRONTEND_API_URL} + + + Sec-Fetch-Site + same-site + + + Sec-Fetch-Mode + cors + + + Sec-Fetch-Dest + empty + + + Referer + https://${FRONTEND_API_URL}/ + + + Accept-Encoding + gzip, deflate, br + + + Accept-Language + en-US,en;q=0.9 + + + If-None-Match + W/"17b2-OQs45yY+9rxT8oaE549bg+d9IqA" + + + + + + + + + + + + + + https://${VEHICLES_API_URL}/users/roles?companyId=102 + GET + true + false + true + false + + + + + + + + + Host + ${VEHICLES_API_URL} + + + Connection + keep-alive + + + sec-ch-ua + "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" + + + Accept + application/json + + + sec-ch-ua-mobile + ?0 + + + Authorization + Bearer ${BCEID_BEARER_TOKEN} + + + User-Agent + Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 + + + sec-ch-ua-platform + "Windows" + + + Origin + https://${FRONTEND_API_URL} + + + Sec-Fetch-Site + same-site + + + Sec-Fetch-Mode + cors + + + Sec-Fetch-Dest + empty + + + Referer + https://${FRONTEND_API_URL}/ + + + Accept-Encoding + gzip, deflate, br + + + Accept-Language + en-US,en;q=0.9 + + + If-None-Match + W/"17b2-OQs45yY+9rxT8oaE549bg+d9IqA" + + + + + + + + Authorization + Bearer ${BCEID_BEARER_TOKEN} + + + Accept + */* + + + + + + + true + + + + false + { + "companyId": 102, + "permitId": null, + "originalPermitId": "", + "applicationNumber": null, + "previousRevision": "", + "revision": "", + "userGuid": "06267945F2EB4E31B585932F78B76269", + "permitType": "TROS", + "permitStatus": "IN_PROGRESS", + "permitApprovalSource": "PPC", + "permitApplicationOrigin": "ONLINE", + "permitData": { + "startDate": "2023-06-05T19:12:22Z", + "expiryDate": "2023-07-04T19:12:22Z", + "permitDuration": 30, + "feeSummary": "30", + "commodities": [ + { + "description": "General Permit Conditions", + "condition": "CVSE-1000", + "conditionLink": "https://www.th.gov.bc.ca/forms/getForm.aspx?formId=1251", + "checked": true + }, + { + "description": "Permit Scope and Limitation", + "condition": "CVSE-1070", + "conditionLink": "https://www.th.gov.bc.ca/forms/getForm.aspx?formId=1261", + "checked": true + }, + { + "description": "Log Permit Conditions", + "condition": "CVSE-1000L", + "conditionLink": "https://www.th.gov.bc.ca/forms/getForm.aspx?formId=1250", + "checked": true + } + ], + "contactDetails": { + "firstName": "Lewis", + "lastName": "Hamilton", + "phone1": "(778) 952-1234", + "email": "lewis@f1.com", + "phone1Extension": "1", + "phone2": null, + "phone2Extension": null, + "fax": null + }, + "mailingAddress": { + "addressLine1": "123 Short Street", + "addressLine2": null, + "city": "Victoria", + "provinceCode": "BC", + "countryCode": "CA", + "postalCode": "V8X2V5" + }, + "vehicleDetails": { + "vin": "781452", + "plate": "PRJZZP", + "make": "GMC", + "year": 2001, + "countryCode": "CA", + "provinceCode": "BC", + "vehicleType": "powerUnit", + "vehicleSubType": "LOGGING", + "saveVehicle": true + } + }, + "comment": "This application was amended because of so-and-so reason." +} + = + + + + + + + + https://${VEHICLES_API_URL}/permits/applications + POST + true + false + true + false + + + + + + + + + Host + ${VEHICLES_API_URL} + + + Connection + keep-alive + + + sec-ch-ua + "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" + + + Accept + application/json + + + sec-ch-ua-mobile + ?0 + + + Authorization + Bearer ${BCEID_BEARER_TOKEN} + + + User-Agent + Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 + + + sec-ch-ua-platform + "Windows" + + + Origin + https://${FRONTEND_API_URL} + + + Sec-Fetch-Site + same-site + + + Sec-Fetch-Mode + cors + + + Sec-Fetch-Dest + empty + + + Referer + https://${FRONTEND_API_URL}/ + + + Accept-Encoding + gzip, deflate, br + + + Accept-Language + en-US,en;q=0.9 + + + If-None-Match + W/"17b2-OQs45yY+9rxT8oaE549bg+d9IqA" + + + + + + + + Authorization + Bearer ${BCEID_BEARER_TOKEN} + + + Content-Type + application/json + + + Accept + application/json + + + + + + + + false + + saveConfig + + + true + true + true + + true + true + true + true + false + true + true + false + false + false + true + false + false + false + true + 0 + true + true + true + true + true + true + + + + + + + false + + saveConfig + + + true + true + true + + true + true + true + true + false + true + true + false + false + false + true + false + false + false + true + 0 + true + true + true + true + true + true + + + + + + + false + + saveConfig + + + true + true + true + + true + true + true + true + false + true + true + false + false + false + true + false + false + false + true + 0 + true + true + true + true + true + true + + + ${RESULTS_DIR}/frontend.csv + + + + + diff --git a/loadtests/frontend/orbc_load_test_plan_frontend.jmx b/loadtests/frontend/orbc_load_test_plan_frontend_idir.jmx similarity index 50% rename from loadtests/frontend/orbc_load_test_plan_frontend.jmx rename to loadtests/frontend/orbc_load_test_plan_frontend_idir.jmx index fcf19a251..2c5b961b0 100644 --- a/loadtests/frontend/orbc_load_test_plan_frontend.jmx +++ b/loadtests/frontend/orbc_load_test_plan_frontend_idir.jmx @@ -100,9 +100,9 @@ onroutebc-test-dops.apps.silver.devops.gov.bc.ca/ = - - BEARER_TOKEN - eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJXNk5hakRyZ2VUR2tYR0dtb28tRWJFSkJXQTM4OGEyYjdRN0p4eThSRjdzIn0.eyJleHAiOjE3MjQ0MzQ2ODksImlhdCI6MTcyNDQzNDM4OSwiYXV0aF90aW1lIjoxNzI0NDM0Mzg5LCJqdGkiOiIwY2RkZjg2MS0zMWYxLTQxMTYtYmUxOC00YjdiYjY1NjljZDEiLCJpc3MiOiJodHRwczovL3Rlc3QubG9naW5wcm94eS5nb3YuYmMuY2EvYXV0aC9yZWFsbXMvc3RhbmRhcmQiLCJhdWQiOiJvbi1yb3V0ZS1iYy1kaXJlY3QtNDU5OCIsInN1YiI6IjMzMjRiNDFjNGI5OTQzZTg5MjdmYzMzODE2OThiZjYwQGlkaXIiLCJ0eXAiOiJCZWFyZXIiLCJhenAiOiJvbi1yb3V0ZS1iYy1kaXJlY3QtNDU5OCIsInNlc3Npb25fc3RhdGUiOiJjMDcyYWIwMi0wMzBiLTQ2ZTYtYjUyZC0zZjdmYzEwZjZmOTAiLCJzY29wZSI6Im9wZW5pZCBwcm9maWxlIGVtYWlsIGJjZWlkYm90aCBpZGlyIiwic2lkIjoiYzA3MmFiMDItMDMwYi00NmU2LWI1MmQtM2Y3ZmMxMGY2ZjkwIiwiaWRpcl91c2VyX2d1aWQiOiIzMzI0QjQxQzRCOTk0M0U4OTI3RkMzMzgxNjk4QkY2MCIsImlkZW50aXR5X3Byb3ZpZGVyIjoiaWRpciIsImlkaXJfdXNlcm5hbWUiOiJDQkVSRyIsImVtYWlsX3ZlcmlmaWVkIjpmYWxzZSwibmFtZSI6IkJlcmcsIENocmlzIE1PVEk6RVgiLCJwcmVmZXJyZWRfdXNlcm5hbWUiOiIzMzI0YjQxYzRiOTk0M2U4OTI3ZmMzMzgxNjk4YmY2MEBpZGlyIiwiZ2l2ZW5fbmFtZSI6IkNocmlzIiwiZGlzcGxheV9uYW1lIjoiQmVyZywgQ2hyaXMgTU9USTpFWCIsImZhbWlseV9uYW1lIjoiQmVyZyIsImVtYWlsIjoiY2hyaXMuYmVyZ0Bnb3YuYmMuY2EifQ.RGXNVC6qD8DyDHLAEjrAzt5R_KKFqUlwDmOmP-JcbxuJySDgCyu0iaCTpSZ5DfS1ik1rWTZIvxuyGgX_i7kndhKxhv5xAjbldYSWms6IyOGPDhOqVDuL32Ogzc-x6ej-xL0DQoFwQIs3rrfGBF6-4fS4gBKhz2EPwxPdNKNLBKHiYVLtnrmaQkQSLOk4Dj8ioTcKRepJOTy2iWMThO07VCLLCUunmC77UmIb0tTkQUoX2cGPmX-YeL4sTRxs6-RsOuJmxzeFF2V54twA0moeOUiZPIDvTqD0cAQ0OsbzYs7F2IJAnObpL3km-O9ry_MV1IyuFBFfXDpn3pkAcn9FGA + + IDIR_BEARER_TOKEN + = @@ -1500,6223 +1500,7 @@ - - continue - - false - 1 - - ${NUM_THREADS} - ${__P(rampup,300)} - 1365261073000 - 1365261073000 - true - ${__P(duration,3000)} - - true - - - - ${__P(Delay,10000)} - - - - - - - false - - = - true - - - - - - - - https://${FRONTEND_API_URL}/ - GET - true - false - true - false - - - - - - - - - Host - ${FRONTEND_API_URL} - - - Connection - keep-alive - - - Cache-Control - max-age=0 - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - sec-ch-ua-mobile - ?0 - - - sec-ch-ua-platform - "Windows" - - - Upgrade-Insecure-Requests - 1 - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Accept - text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 - - - Sec-Fetch-Site - same-origin - - - Sec-Fetch-Mode - navigate - - - Sec-Fetch-User - ?1 - - - Sec-Fetch-Dest - document - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - Cookie - _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; FAILREASON=0; 9a75866e187615f9e3e688e8297548f9=1f5b60b83338df80ae3a11e1286008b7; SMSESSION=LOGGEDOFF - - - If-None-Match - W/"653ca247-308" - - - If-Modified-Since - Sat, 28 Oct 2023 05:55:19 GMT - - - - - - - - - - false - - = - true - - - - - - - - https://${KEYCLOAK_LOGIN_URL}/auth/realms/standard/.well-known/openid-configuration - GET - true - false - true - false - - - - - - - - - Host - ${KEYCLOAK_LOGIN_URL} - - - Connection - keep-alive - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - Accept - application/jwk-set+json, application/json - - - sec-ch-ua-mobile - ?0 - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - sec-ch-ua-platform - "Windows" - - - Origin - https://${FRONTEND_API_URL} - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - cors - - - Sec-Fetch-Dest - empty - - - Referer - https://${FRONTEND_API_URL}/ - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - - - - - - - - false - - = - true - - - - - - - - https://${KEYCLOAK_LOGIN_URL}/auth/realms/standard/protocol/openid-connect/auth?client_id=on-route-bc-direct-4598&redirect_uri=https%3A%2F%2F${FRONTEND_API_URL}%2F&response_type=code&scope=openid&state=7be0f498ddfa45e28ee8f2416475ba42&code_challenge=B4JszPcS0HOW7ECTTUURC1mp6z8at2b6K0lD1uK_11A&code_challenge_method=S256&response_mode=query&kc_idp_hint=bceidboth - GET - true - false - true - false - - - - - - - - - Host - ${KEYCLOAK_LOGIN_URL} - - - Connection - keep-alive - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - sec-ch-ua-mobile - ?0 - - - sec-ch-ua-platform - "Windows" - - - Upgrade-Insecure-Requests - 1 - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Accept - text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - navigate - - - Sec-Fetch-User - ?1 - - - Sec-Fetch-Dest - document - - - Referer - https://${FRONTEND_API_URL}/ - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - Cookie - AUTH_SESSION_ID=2e364c60-0ead-4ec1-98fb-0e1bba001f08.ycloak-78b4c74bcf-vtmwp; AUTH_SESSION_ID_LEGACY=2e364c60-0ead-4ec1-98fb-0e1bba001f08.ycloak-78b4c74bcf-vtmwp; _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; FAILREASON=0; SMSESSION=LOGGEDOFF - - - - - - - - - - false - - = - true - - - - - - - - https://${KEYCLOAK_LOGIN_URL}/auth/realms/standard/broker/bceidboth/login?session_code=5b_D1WNhNIzE-FZe70dEmhs_J2mpDyFSyQzWPAxnjYc&client_id=on-route-bc-direct-4598&tab_id=KAxYXjoatGc - GET - true - false - true - false - - - - - - - - - Host - ${KEYCLOAK_LOGIN_URL} - - - Connection - keep-alive - - - Upgrade-Insecure-Requests - 1 - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Accept - text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - navigate - - - Sec-Fetch-User - ?1 - - - Sec-Fetch-Dest - document - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - sec-ch-ua-mobile - ?0 - - - sec-ch-ua-platform - "Windows" - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - Cookie - AUTH_SESSION_ID=0e56ff7b-e277-400f-84f5-25801c43c829.ycloak-78b4c74bcf-kh476; AUTH_SESSION_ID_LEGACY=0e56ff7b-e277-400f-84f5-25801c43c829.ycloak-78b4c74bcf-kh476; KC_RESTART=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICIzMmI0MzNkNC02NjgwLTQxODMtOTc2Yy1kZDdjMTg0YjExMTQifQ.eyJjaWQiOiJvbi1yb3V0ZS1iYy1kaXJlY3QtNDU5OCIsInB0eSI6Im9wZW5pZC1jb25uZWN0IiwicnVyaSI6Imh0dHBzOi8vb25yb3V0ZWJjLXRlc3QtZnJvbnRlbmQuYXBwcy5zaWx2ZXIuZGV2b3BzLmdvdi5iYy5jYS8iLCJhY3QiOiJBVVRIRU5USUNBVEUiLCJub3RlcyI6eyJzY29wZSI6Im9wZW5pZCIsImlzcyI6Imh0dHBzOi8vdGVzdC5sb2dpbnByb3h5Lmdvdi5iYy5jYS9hdXRoL3JlYWxtcy9zdGFuZGFyZCIsInJlc3BvbnNlX3R5cGUiOiJjb2RlIiwiY29kZV9jaGFsbGVuZ2VfbWV0aG9kIjoiUzI1NiIsInJlZGlyZWN0X3VyaSI6Imh0dHBzOi8vb25yb3V0ZWJjLXRlc3QtZnJvbnRlbmQuYXBwcy5zaWx2ZXIuZGV2b3BzLmdvdi5iYy5jYS8iLCJzdGF0ZSI6IjdiZTBmNDk4ZGRmYTQ1ZTI4ZWU4ZjI0MTY0NzViYTQyIiwiY29kZV9jaGFsbGVuZ2UiOiJCNEpzelBjUzBIT1c3RUNUVFVVUkMxbXA2ejhhdDJiNkswbEQxdUtfMTFBIiwia2NfaWRwX2hpbnQiOiJiY2VpZGJvdGgiLCJyZXNwb25zZV9tb2RlIjoicXVlcnkifX0.2dLZTTjk8ZY0EFAaE88sAWQlfo7T17XcYLztnQwI_Yk; _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; FAILREASON=0; SMSESSION=LOGGEDOFF - - - - - - - - - - false - - = - true - - - - - - - - https://${KEYCLOAK_LOGIN_URL}/auth/realms/bceidboth/protocol/openid-connect/auth?scope=openid&state=JvIyfmoj0AzmBZWw0ZS8lBmhMJXd7lA_uAR8JQvLNlE.KAxYXjoatGc.on-route-bc-direct-4598&response_type=code&client_id=standard-realm&redirect_uri=https%3A%2F%2F${KEYCLOAK_LOGIN_URL}%2Fauth%2Frealms%2Fstandard%2Fbroker%2Fbceidboth%2Fendpoint&nonce=1sKWmdZ0aV6QIscb65Lrmg - GET - true - false - true - false - - - - - - - - - Host - ${KEYCLOAK_LOGIN_URL} - - - Connection - keep-alive - - - Upgrade-Insecure-Requests - 1 - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Accept - text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - navigate - - - Sec-Fetch-User - ?1 - - - Sec-Fetch-Dest - document - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - sec-ch-ua-mobile - ?0 - - - sec-ch-ua-platform - "Windows" - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - Cookie - AUTH_SESSION_ID=33769057-e4e2-49e9-821b-bab26d4e7507.ycloak-78b4c74bcf-gj9d6; AUTH_SESSION_ID_LEGACY=33769057-e4e2-49e9-821b-bab26d4e7507.ycloak-78b4c74bcf-gj9d6; KEYCLOAK_IDENTITY=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI1ZjExNjBiNS03Y2RjLTQ5NGQtYmFkOS0yZGRkNjU3MDU5Y2UifQ.eyJleHAiOjE2OTg3MzE3MzQsImlhdCI6MTY5ODY5NTczNCwianRpIjoiNzY3ZDEzMGEtMzczMC00NDdhLWEzNTUtNjhhNDhiMjgzZTI3IiwiaXNzIjoiaHR0cHM6Ly90ZXN0LmxvZ2lucHJveHkuZ292LmJjLmNhL2F1dGgvcmVhbG1zL2JjZWlkYm90aCIsInN1YiI6ImQ3M2FiN2IwLWUyMmEtNDg0NC04Yzc3LWU3YTQ2ODQyOTNmZCIsInR5cCI6IlNlcmlhbGl6ZWQtSUQiLCJzZXNzaW9uX3N0YXRlIjoiMzM3NjkwNTctZTRlMi00OWU5LTgyMWItYmFiMjZkNGU3NTA3Iiwic2lkIjoiMzM3NjkwNTctZTRlMi00OWU5LTgyMWItYmFiMjZkNGU3NTA3Iiwic3RhdGVfY2hlY2tlciI6Ik9SWEI4amY3Q3hPUWhzTUNhWU5nMHF2WHNzZG52cnlxUHFjMnFpUkthZncifQ.1kpL3Qpg4pyqSLBE0iDz7WZ0fdGzCCf6RCiN6HvFWqE; KEYCLOAK_IDENTITY_LEGACY=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI1ZjExNjBiNS03Y2RjLTQ5NGQtYmFkOS0yZGRkNjU3MDU5Y2UifQ.eyJleHAiOjE2OTg3MzE3MzQsImlhdCI6MTY5ODY5NTczNCwianRpIjoiNzY3ZDEzMGEtMzczMC00NDdhLWEzNTUtNjhhNDhiMjgzZTI3IiwiaXNzIjoiaHR0cHM6Ly90ZXN0LmxvZ2lucHJveHkuZ292LmJjLmNhL2F1dGgvcmVhbG1zL2JjZWlkYm90aCIsInN1YiI6ImQ3M2FiN2IwLWUyMmEtNDg0NC04Yzc3LWU3YTQ2ODQyOTNmZCIsInR5cCI6IlNlcmlhbGl6ZWQtSUQiLCJzZXNzaW9uX3N0YXRlIjoiMzM3NjkwNTctZTRlMi00OWU5LTgyMWItYmFiMjZkNGU3NTA3Iiwic2lkIjoiMzM3NjkwNTctZTRlMi00OWU5LTgyMWItYmFiMjZkNGU3NTA3Iiwic3RhdGVfY2hlY2tlciI6Ik9SWEI4amY3Q3hPUWhzTUNhWU5nMHF2WHNzZG52cnlxUHFjMnFpUkthZncifQ.1kpL3Qpg4pyqSLBE0iDz7WZ0fdGzCCf6RCiN6HvFWqE; KEYCLOAK_SESSION=bceidboth/d73ab7b0-e22a-4844-8c77-e7a4684293fd/33769057-e4e2-49e9-821b-bab26d4e7507; KEYCLOAK_SESSION_LEGACY=bceidboth/d73ab7b0-e22a-4844-8c77-e7a4684293fd/33769057-e4e2-49e9-821b-bab26d4e7507; _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; FAILREASON=0; SMSESSION=LOGGEDOFF - - - - - - - - - - false - - = - true - - - - - - - - https://${KEYCLOAK_LOGIN_URL}/auth/realms/bceidboth/broker/bceidboth/login?session_code=oRr0p7JZ9oL7vptnFPfNKhf_nrB8DND1rBojsNPjot0&client_id=standard-realm&tab_id=k5Vw5BDlfVQ - GET - true - false - true - false - - - - - - - - - Host - ${KEYCLOAK_LOGIN_URL} - - - Connection - keep-alive - - - Upgrade-Insecure-Requests - 1 - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Accept - text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - navigate - - - Sec-Fetch-User - ?1 - - - Sec-Fetch-Dest - document - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - sec-ch-ua-mobile - ?0 - - - sec-ch-ua-platform - "Windows" - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - Cookie - AUTH_SESSION_ID=f26f78a0-28d2-40b4-9e57-b83fa590e32e.ycloak-78b4c74bcf-vtmwp; AUTH_SESSION_ID_LEGACY=f26f78a0-28d2-40b4-9e57-b83fa590e32e.ycloak-78b4c74bcf-vtmwp; KC_RESTART=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI1ZjExNjBiNS03Y2RjLTQ5NGQtYmFkOS0yZGRkNjU3MDU5Y2UifQ.eyJjaWQiOiJzdGFuZGFyZC1yZWFsbSIsInB0eSI6Im9wZW5pZC1jb25uZWN0IiwicnVyaSI6Imh0dHBzOi8vdGVzdC5sb2dpbnByb3h5Lmdvdi5iYy5jYS9hdXRoL3JlYWxtcy9zdGFuZGFyZC9icm9rZXIvYmNlaWRib3RoL2VuZHBvaW50IiwiYWN0IjoiQVVUSEVOVElDQVRFIiwibm90ZXMiOnsic2NvcGUiOiJvcGVuaWQiLCJpc3MiOiJodHRwczovL3Rlc3QubG9naW5wcm94eS5nb3YuYmMuY2EvYXV0aC9yZWFsbXMvYmNlaWRib3RoIiwicmVzcG9uc2VfdHlwZSI6ImNvZGUiLCJyZWRpcmVjdF91cmkiOiJodHRwczovL3Rlc3QubG9naW5wcm94eS5nb3YuYmMuY2EvYXV0aC9yZWFsbXMvc3RhbmRhcmQvYnJva2VyL2JjZWlkYm90aC9lbmRwb2ludCIsInN0YXRlIjoiSnZJeWZtb2owQXptQlpXdzBaUzhsQm1oTUpYZDdsQV91QVI4SlF2TE5sRS5LQXhZWGpvYXRHYy5vbi1yb3V0ZS1iYy1kaXJlY3QtNDU5OCIsIm5vbmNlIjoiMXNLV21kWjBhVjZRSXNjYjY1THJtZyJ9fQ.08S_Qi57kTkuLj_eH5VElw2zeuH4AVhfOUois5IUzEI; _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; FAILREASON=0; SMSESSION=LOGGEDOFF - - - - - - - - - - false - - = - true - - - - - - - - https://${SITEMINDER_URL}/clp-cgi/capBceid/logon.cgi?flags=0101:0,7&TYPE=33554433&REALMOID=06-b02c7ed2-895e-4953-bd03-8008c64ec906&GUID=&SMAUTHREASON=0&METHOD=GET&SMAGENTNAME=$SM$Lk6VtkyHw8x3zQIIsMiOiEXYFJF%2fJzjVT7eioCjxBjJck5VMlbxxrR%2bLZSo%2flIBX&TARGET=$SM$HTTPS%3a%2f%2fsfstest7%2egov%2ebc%2eca%2faffwebservices%2fredirectjsp%2ftestkeycloak-basicbusinessbceid%2fredirect%2ejsp%3fSMPORTALURL%3dhttps$%3A$%2F$%2Fsfstest7%2egov%2ebc%2eca$%2Faffwebservices$%2Fpublic$%2Fsaml2sso%26SAMLTRANSACTIONID%3dc9f189ad-7324de1b-2e045e1a-e8bcf162-a78af00c-c5 - GET - true - false - true - false - - - - - - - - - Host - ${SITEMINDER_URL} - - - Connection - keep-alive - - - Cache-Control - max-age=0 - - - Upgrade-Insecure-Requests - 1 - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Accept - text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - navigate - - - Sec-Fetch-Dest - document - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - sec-ch-ua-mobile - ?0 - - - sec-ch-ua-platform - "Windows" - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - Cookie - _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; Dummy1=DummyVal1; BCGOVFlags=0101%3A0%2C7; BCGOVCustom=NULL; BCGOVBrand=NULL; BCGOVBehavior=NULL; Dummy2=DummyVal2; preDummy1=DummyVal1; preDummy2=DummyVal2; preDummy3=DummyVal3; BCGOVDoNotShow=1; preDummy4=DummyVal4; FAILREASON=0; BCGOVTarget=HTTPS%3A%2F%2Fsfstest7.gov.bc.ca%2Faffwebservices%2Fredirectjsp%2Ftestkeycloak-basicbusinessbceid%2Fredirect.jsp%3FSMPORTALURL%3Dhttps%253A%252F%252Fsfstest7.gov.bc.ca%252Faffwebservices%252Fpublic%252Fsaml2sso%26SAMLTRANSACTIONID%3Df7917115-57286b4a-df9cf6ff-b50e2f11-c566ac5a-f6; BCGOVclptryno=0; clp001=0; SMSESSION=LOGGEDOFF; SMFED_OLD_SESSION=""; SMFED_OLD_IDENTITY=""; GUID=1:26feb557-62af2c8c-4ef3a8d7-2e2277be-6a76895c-697 - - - - - - - true - - - - false - instance=instance_capBceid&user=ORBCTST3&password=orbcTST%2B2023 - = - - - - - - - - https://${SITEMINDER_URL}/clp-cgi/preLogon.cgi - POST - true - false - true - false - - - - - - - - - Host - ${SITEMINDER_URL} - - - Connection - keep-alive - - - Content-Length - 64 - - - Cache-Control - max-age=0 - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - sec-ch-ua-mobile - ?0 - - - sec-ch-ua-platform - "Windows" - - - Upgrade-Insecure-Requests - 1 - - - Origin - https://${SITEMINDER_URL} - - - Content-Type - application/x-www-form-urlencoded - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Accept - text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 - - - Sec-Fetch-Site - same-origin - - - Sec-Fetch-Mode - navigate - - - Sec-Fetch-User - ?1 - - - Sec-Fetch-Dest - document - - - Referer - https://${SITEMINDER_URL}/clp-cgi/capBceid/logon.cgi?flags=0101:0,7&TYPE=33554433&REALMOID=06-b02c7ed2-895e-4953-bd03-8008c64ec906&GUID=&SMAUTHREASON=0&METHOD=GET&SMAGENTNAME=$SM$Lk6VtkyHw8x3zQIIsMiOiEXYFJF%2fJzjVT7eioCjxBjJck5VMlbxxrR%2bLZSo%2flIBX&TARGET=$SM$HTTPS%3a%2f%2fsfstest7%2egov%2ebc%2eca%2faffwebservices%2fredirectjsp%2ftestkeycloak-basicbusinessbceid%2fredirect%2ejsp%3fSMPORTALURL%3dhttps$%3A$%2F$%2Fsfstest7%2egov%2ebc%2eca$%2Faffwebservices$%2Fpublic$%2Fsaml2sso%26SAMLTRANSACTIONID%3dc9f189ad-7324de1b-2e045e1a-e8bcf162-a78af00c-c5 - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - Cookie - _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; Dummy1=DummyVal1; BCGOVFlags=0101%3A0%2C7; BCGOVCustom=NULL; BCGOVBrand=NULL; BCGOVBehavior=NULL; Dummy2=DummyVal2; preDummy1=DummyVal1; preDummy2=DummyVal2; preDummy3=DummyVal3; BCGOVDoNotShow=1; preDummy4=DummyVal4; FAILREASON=0; clp001=0; SMSESSION=LOGGEDOFF; SMFED_OLD_SESSION=""; SMFED_OLD_IDENTITY=""; GUID=1:26feb557-62af2c8c-4ef3a8d7-2e2277be-6a76895c-697; BCGOVTarget=HTTPS%3A%2F%2Fsfstest7.gov.bc.ca%2Faffwebservices%2Fredirectjsp%2Ftestkeycloak-basicbusinessbceid%2Fredirect.jsp%3FSMPORTALURL%3Dhttps%253A%252F%252Fsfstest7.gov.bc.ca%252Faffwebservices%252Fpublic%252Fsaml2sso%26SAMLTRANSACTIONID%3Dc9f189ad-7324de1b-2e045e1a-e8bcf162-a78af00c-c5; BCGOVclptryno=1 - - - - - - - true - - - - false - SMENC=ISO-8859-1&SMLOCALE=US-EN&target=%2Fclp-cgi%2Fcap07%2Fprivate%2FpostLogon.cgi&smauthreason=0&smagentname=&user=ORBCTST3&password=orbcTST%2B2023 - = - - - - - - - - https://${SITEMINDER_URL}/clp-cgi/cap07/logon.fcc - POST - true - false - true - false - - - - - - - - - Host - ${SITEMINDER_URL} - - - Connection - keep-alive - - - Content-Length - 149 - - - Cache-Control - max-age=0 - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - sec-ch-ua-mobile - ?0 - - - sec-ch-ua-platform - "Windows" - - - Upgrade-Insecure-Requests - 1 - - - Origin - https://${SITEMINDER_URL} - - - Content-Type - application/x-www-form-urlencoded - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Accept - text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 - - - Sec-Fetch-Site - same-origin - - - Sec-Fetch-Mode - navigate - - - Sec-Fetch-Dest - document - - - Referer - https://${SITEMINDER_URL}/clp-cgi/preLogon.cgi - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - Cookie - _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; Dummy1=DummyVal1; BCGOVFlags=0101%3A0%2C7; BCGOVCustom=NULL; BCGOVBrand=NULL; BCGOVBehavior=NULL; Dummy2=DummyVal2; preDummy1=DummyVal1; preDummy2=DummyVal2; preDummy3=DummyVal3; BCGOVDoNotShow=1; preDummy4=DummyVal4; FAILREASON=0; SMSESSION=LOGGEDOFF; SMFED_OLD_SESSION=""; SMFED_OLD_IDENTITY=""; GUID=1:26feb557-62af2c8c-4ef3a8d7-2e2277be-6a76895c-697; BCGOVTarget=HTTPS%3A%2F%2Fsfstest7.gov.bc.ca%2Faffwebservices%2Fredirectjsp%2Ftestkeycloak-basicbusinessbceid%2Fredirect.jsp%3FSMPORTALURL%3Dhttps%253A%252F%252Fsfstest7.gov.bc.ca%252Faffwebservices%252Fpublic%252Fsaml2sso%26SAMLTRANSACTIONID%3Dc9f189ad-7324de1b-2e045e1a-e8bcf162-a78af00c-c5; BCGOVclptryno=1; clp001=Salted__%8E%F5%14%93%F3.%C8%8C%C2%B3%84%8B%8EC%E0%88%AAK%01%C77%B6%C4g%C3%D2%3ELS%06%7CdJp%18%E9TJ%8A%D3a%A9%AD%3C%5E%DBZ%D7 - - - - - - - - - - false - - = - - - - - - - - https://${SITEMINDER_URL}/clp-cgi/cap07/private/postLogon.cgi - GET - true - false - true - false - - - - - - - - - Host - ${SITEMINDER_URL} - - - Connection - keep-alive - - - Cache-Control - max-age=0 - - - Upgrade-Insecure-Requests - 1 - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Accept - text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 - - - Sec-Fetch-Site - same-origin - - - Sec-Fetch-Mode - navigate - - - Sec-Fetch-Dest - document - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - sec-ch-ua-mobile - ?0 - - - sec-ch-ua-platform - "Windows" - - - Referer - https://${SITEMINDER_URL}/clp-cgi/preLogon.cgi - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - Cookie - _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; Dummy1=DummyVal1; BCGOVFlags=0101%3A0%2C7; BCGOVCustom=NULL; BCGOVBrand=NULL; BCGOVBehavior=NULL; Dummy2=DummyVal2; preDummy1=DummyVal1; preDummy2=DummyVal2; preDummy3=DummyVal3; BCGOVDoNotShow=1; preDummy4=DummyVal4; FAILREASON=0; SMSESSION=LOGGEDOFF; SMFED_OLD_SESSION=""; SMFED_OLD_IDENTITY=""; GUID=1:26feb557-62af2c8c-4ef3a8d7-2e2277be-6a76895c-697; BCGOVTarget=HTTPS%3A%2F%2Fsfstest7.gov.bc.ca%2Faffwebservices%2Fredirectjsp%2Ftestkeycloak-basicbusinessbceid%2Fredirect.jsp%3FSMPORTALURL%3Dhttps%253A%252F%252Fsfstest7.gov.bc.ca%252Faffwebservices%252Fpublic%252Fsaml2sso%26SAMLTRANSACTIONID%3Dc9f189ad-7324de1b-2e045e1a-e8bcf162-a78af00c-c5; BCGOVclptryno=1; clp001=Salted__%8E%F5%14%93%F3.%C8%8C%C2%B3%84%8B%8EC%E0%88%AAK%01%C77%B6%C4g%C3%D2%3ELS%06%7CdJp%18%E9TJ%8A%D3a%A9%AD%3C%5E%DBZ%D7; FORMCRED=2ZS4S2F4tb41FWGyAD293ZV3eiMsCRYZ+ktOitYzjWY/fG/2BFtCWHSnbkvgJfBEm8aTuwAg3nMfeG0h8ahL0C1Q+SZp1d30x/imUNpQkjqP7yK+smpXGQMNWzNb15A+UXcYa0yUQLQ5rFoH720FIoiqZ4Nmikk7a67vktQxd8rpIduHeZJ7tAYb/b+pXPha - - - - - - - - - - false - - = - - - - - - - - https://${KEYCLOAK_LOGIN_URL}/auth/realms/standard/broker/bceidboth/endpoint?state=JvIyfmoj0AzmBZWw0ZS8lBmhMJXd7lA_uAR8JQvLNlE.KAxYXjoatGc.on-route-bc-direct-4598&session_state=f26f78a0-28d2-40b4-9e57-b83fa590e32e&code=c5719177-78e8-4d75-857a-0ef191c765d1.f26f78a0-28d2-40b4-9e57-b83fa590e32e.1123d85b-badf-4084-a3a6-b1c920ccb0c0 - GET - true - false - true - false - - - - - - - - - Host - ${KEYCLOAK_LOGIN_URL} - - - Connection - keep-alive - - - Cache-Control - max-age=0 - - - Upgrade-Insecure-Requests - 1 - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Accept - text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - navigate - - - Sec-Fetch-Dest - document - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - sec-ch-ua-mobile - ?0 - - - sec-ch-ua-platform - "Windows" - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - Cookie - AUTH_SESSION_ID=0e56ff7b-e277-400f-84f5-25801c43c829.ycloak-78b4c74bcf-kh476; AUTH_SESSION_ID_LEGACY=0e56ff7b-e277-400f-84f5-25801c43c829.ycloak-78b4c74bcf-kh476; KC_RESTART=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICIzMmI0MzNkNC02NjgwLTQxODMtOTc2Yy1kZDdjMTg0YjExMTQifQ.eyJjaWQiOiJvbi1yb3V0ZS1iYy1kaXJlY3QtNDU5OCIsInB0eSI6Im9wZW5pZC1jb25uZWN0IiwicnVyaSI6Imh0dHBzOi8vb25yb3V0ZWJjLXRlc3QtZnJvbnRlbmQuYXBwcy5zaWx2ZXIuZGV2b3BzLmdvdi5iYy5jYS8iLCJhY3QiOiJBVVRIRU5USUNBVEUiLCJub3RlcyI6eyJzY29wZSI6Im9wZW5pZCIsImlzcyI6Imh0dHBzOi8vdGVzdC5sb2dpbnByb3h5Lmdvdi5iYy5jYS9hdXRoL3JlYWxtcy9zdGFuZGFyZCIsInJlc3BvbnNlX3R5cGUiOiJjb2RlIiwiY29kZV9jaGFsbGVuZ2VfbWV0aG9kIjoiUzI1NiIsInJlZGlyZWN0X3VyaSI6Imh0dHBzOi8vb25yb3V0ZWJjLXRlc3QtZnJvbnRlbmQuYXBwcy5zaWx2ZXIuZGV2b3BzLmdvdi5iYy5jYS8iLCJzdGF0ZSI6IjdiZTBmNDk4ZGRmYTQ1ZTI4ZWU4ZjI0MTY0NzViYTQyIiwiY29kZV9jaGFsbGVuZ2UiOiJCNEpzelBjUzBIT1c3RUNUVFVVUkMxbXA2ejhhdDJiNkswbEQxdUtfMTFBIiwia2NfaWRwX2hpbnQiOiJiY2VpZGJvdGgiLCJyZXNwb25zZV9tb2RlIjoicXVlcnkifX0.2dLZTTjk8ZY0EFAaE88sAWQlfo7T17XcYLztnQwI_Yk; _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; FAILREASON=0; SMSESSION=Awk9KIrMNenX09Vl2cEMuy/VxV9CFVP4fsBzCp8Zo3AX2VsrDVWkOMVOdJyoY1Q1J9F8Vs8XFBtHTU29qS7+jlhEMK3f9j8tgudEVWHJq8LTizGhEj1cf8r7CX2QuxWMbdAHvK90hFnpocsL5xv2cAaFVdqhBKlIYkzwkY+r0YuH3Uh6DJVIhAhwjWeKfO6BAg5/jNFxQ31EPvzn4N7RxJK2bGyfAxzi6Cs6O7ieJ10MzcB8nWSIsO4ksfG8pzeGp9a+arl4maKnd9Je2L2FQohmiOjfGcrsezOgLgiWFl1B3+EL8ytArvtKhsFvr7WJsQuhYsQYzfY8shcfhNSltyqxLD422bDmU3NyZdhWY9313YG5I1U2vbO7zvXhxaCJYnpMrJR+inz8XsyqnGY1xu7AepY3pNd2wJH3twQJ42N6R2WlJVVN3oc3DvEHUbk85xrqHdwngd/FiMdEC2f5Kt51VYp8G/3R+sbFiy6Wt7wlZw2+/wI8EfxXs31HQ5q/RDUTXz6JMbzsR7EUOF+WkOrgi1nDugu13/O9hDnxPJnkzNGEfjt0xPxdhoDdl4vWdwRe1awBEn90SyJwc8+cFk1XACtvWoGwtPdf1xnHUwx5Ge1TqEd46xdjjlu+iTw2Xu5AsESUVVw81STsKA7vC8EBabQ+yXQHZlNFcFCKa1+AutNxfWHNQtnFK03kUCai4ZPJc/TQrhvf9DWjSyX+KknWdV6aQyz65KOpwtQWpd4ZlqAAKvf9vCQIBgk+YdsxFzAq6ySnLPcBLbFvP+Xyo5bcABg8IS9aJr6+05KT3ZOv49G1uYvz1ILaDED83D5NHF57ZswKR2911SevaqIO2i8NkZAJUMBpgroSejoJ1MxzpL/a7I26u6+p/08uMt/dT7vuo5OTTjayEtIlXy1IRXA/jU/uX/pKk1JrsZFhhwj7G5KEQpMAx+YvZUaaidqyfj3+fLb6+rsa8BukV8x0zfgUg20dm+Wu9XjDvyQHFP4Qt65CaUbhAKcVTgCChgTfSSdUJZIPPa5Yhzr7SmTuVGmYV/1cC4jGzNdSqr3Fq28fWukiEnRtqfZRXlOdA6xb - - - - - - - - - - false - - = - true - - - - - - - - https://${KEYCLOAK_LOGIN_URL}/auth/realms/standard/login-actions/post-broker-login?client_id=on-route-bc-direct-4598&tab_id=KAxYXjoatGc - GET - true - false - true - false - - - - - - - - - Host - ${KEYCLOAK_LOGIN_URL} - - - Connection - keep-alive - - - Cache-Control - max-age=0 - - - Upgrade-Insecure-Requests - 1 - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Accept - text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - navigate - - - Sec-Fetch-Dest - document - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - sec-ch-ua-mobile - ?0 - - - sec-ch-ua-platform - "Windows" - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - Cookie - AUTH_SESSION_ID=0e56ff7b-e277-400f-84f5-25801c43c829.ycloak-78b4c74bcf-kh476; AUTH_SESSION_ID_LEGACY=0e56ff7b-e277-400f-84f5-25801c43c829.ycloak-78b4c74bcf-kh476; KC_RESTART=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICIzMmI0MzNkNC02NjgwLTQxODMtOTc2Yy1kZDdjMTg0YjExMTQifQ.eyJjaWQiOiJvbi1yb3V0ZS1iYy1kaXJlY3QtNDU5OCIsInB0eSI6Im9wZW5pZC1jb25uZWN0IiwicnVyaSI6Imh0dHBzOi8vb25yb3V0ZWJjLXRlc3QtZnJvbnRlbmQuYXBwcy5zaWx2ZXIuZGV2b3BzLmdvdi5iYy5jYS8iLCJhY3QiOiJBVVRIRU5USUNBVEUiLCJub3RlcyI6eyJzY29wZSI6Im9wZW5pZCIsImlzcyI6Imh0dHBzOi8vdGVzdC5sb2dpbnByb3h5Lmdvdi5iYy5jYS9hdXRoL3JlYWxtcy9zdGFuZGFyZCIsInJlc3BvbnNlX3R5cGUiOiJjb2RlIiwiY29kZV9jaGFsbGVuZ2VfbWV0aG9kIjoiUzI1NiIsInJlZGlyZWN0X3VyaSI6Imh0dHBzOi8vb25yb3V0ZWJjLXRlc3QtZnJvbnRlbmQuYXBwcy5zaWx2ZXIuZGV2b3BzLmdvdi5iYy5jYS8iLCJzdGF0ZSI6IjdiZTBmNDk4ZGRmYTQ1ZTI4ZWU4ZjI0MTY0NzViYTQyIiwiY29kZV9jaGFsbGVuZ2UiOiJCNEpzelBjUzBIT1c3RUNUVFVVUkMxbXA2ejhhdDJiNkswbEQxdUtfMTFBIiwia2NfaWRwX2hpbnQiOiJiY2VpZGJvdGgiLCJyZXNwb25zZV9tb2RlIjoicXVlcnkifX0.2dLZTTjk8ZY0EFAaE88sAWQlfo7T17XcYLztnQwI_Yk; _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; FAILREASON=0; SMSESSION=Awk9KIrMNenX09Vl2cEMuy/VxV9CFVP4fsBzCp8Zo3AX2VsrDVWkOMVOdJyoY1Q1J9F8Vs8XFBtHTU29qS7+jlhEMK3f9j8tgudEVWHJq8LTizGhEj1cf8r7CX2QuxWMbdAHvK90hFnpocsL5xv2cAaFVdqhBKlIYkzwkY+r0YuH3Uh6DJVIhAhwjWeKfO6BAg5/jNFxQ31EPvzn4N7RxJK2bGyfAxzi6Cs6O7ieJ10MzcB8nWSIsO4ksfG8pzeGp9a+arl4maKnd9Je2L2FQohmiOjfGcrsezOgLgiWFl1B3+EL8ytArvtKhsFvr7WJsQuhYsQYzfY8shcfhNSltyqxLD422bDmU3NyZdhWY9313YG5I1U2vbO7zvXhxaCJYnpMrJR+inz8XsyqnGY1xu7AepY3pNd2wJH3twQJ42N6R2WlJVVN3oc3DvEHUbk85xrqHdwngd/FiMdEC2f5Kt51VYp8G/3R+sbFiy6Wt7wlZw2+/wI8EfxXs31HQ5q/RDUTXz6JMbzsR7EUOF+WkOrgi1nDugu13/O9hDnxPJnkzNGEfjt0xPxdhoDdl4vWdwRe1awBEn90SyJwc8+cFk1XACtvWoGwtPdf1xnHUwx5Ge1TqEd46xdjjlu+iTw2Xu5AsESUVVw81STsKA7vC8EBabQ+yXQHZlNFcFCKa1+AutNxfWHNQtnFK03kUCai4ZPJc/TQrhvf9DWjSyX+KknWdV6aQyz65KOpwtQWpd4ZlqAAKvf9vCQIBgk+YdsxFzAq6ySnLPcBLbFvP+Xyo5bcABg8IS9aJr6+05KT3ZOv49G1uYvz1ILaDED83D5NHF57ZswKR2911SevaqIO2i8NkZAJUMBpgroSejoJ1MxzpL/a7I26u6+p/08uMt/dT7vuo5OTTjayEtIlXy1IRXA/jU/uX/pKk1JrsZFhhwj7G5KEQpMAx+YvZUaaidqyfj3+fLb6+rsa8BukV8x0zfgUg20dm+Wu9XjDvyQHFP4Qt65CaUbhAKcVTgCChgTfSSdUJZIPPa5Yhzr7SmTuVGmYV/1cC4jGzNdSqr3Fq28fWukiEnRtqfZRXlOdA6xb - - - - - - - - - - false - - = - true - - - - - - - - https://${KEYCLOAK_LOGIN_URL}/auth/realms/standard/.well-known/openid-configuration - GET - true - false - true - false - - - - - - - - - Host - ${KEYCLOAK_LOGIN_URL} - - - Connection - keep-alive - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - Accept - application/jwk-set+json, application/json - - - sec-ch-ua-mobile - ?0 - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - sec-ch-ua-platform - "Windows" - - - Origin - https://${FRONTEND_API_URL} - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - cors - - - Sec-Fetch-Dest - empty - - - Referer - https://${FRONTEND_API_URL}/ - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - - - - - - continue - - false - 1 - - 1 - ${__P(rampup,300)} - 1365261073000 - 1365261073000 - true - ${__P(duration,3000)} - - true - - - - ${__P(Delay,10000)} - - - - - - - false - - = - true - - - - - - - - https://${FRONTEND_API_URL}/ - GET - true - false - true - false - - - - - - - - - Host - ${FRONTEND_API_URL} - - - Connection - keep-alive - - - Cache-Control - max-age=0 - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - sec-ch-ua-mobile - ?0 - - - sec-ch-ua-platform - "Windows" - - - Upgrade-Insecure-Requests - 1 - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Accept - text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 - - - Sec-Fetch-Site - same-origin - - - Sec-Fetch-Mode - navigate - - - Sec-Fetch-User - ?1 - - - Sec-Fetch-Dest - document - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - Cookie - _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; FAILREASON=0; 9a75866e187615f9e3e688e8297548f9=1f5b60b83338df80ae3a11e1286008b7; SMSESSION=LOGGEDOFF - - - If-None-Match - W/"653ca247-308" - - - If-Modified-Since - Sat, 28 Oct 2023 05:55:19 GMT - - - - - - - - - - false - - = - true - - - - - - - - https://${KEYCLOAK_LOGIN_URL}/auth/realms/standard/.well-known/openid-configuration - GET - true - false - true - false - - - - - - - - - Host - ${KEYCLOAK_LOGIN_URL} - - - Connection - keep-alive - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - Accept - application/jwk-set+json, application/json - - - sec-ch-ua-mobile - ?0 - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - sec-ch-ua-platform - "Windows" - - - Origin - https://${FRONTEND_API_URL} - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - cors - - - Sec-Fetch-Dest - empty - - - Referer - https://${FRONTEND_API_URL}/ - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - - - - - - - - false - - = - true - - - - - - - - https://${KEYCLOAK_LOGIN_URL}/auth/realms/standard/protocol/openid-connect/auth?client_id=on-route-bc-direct-4598&redirect_uri=https%3A%2F%2F${FRONTEND_API_URL}%2F&response_type=code&scope=openid&state=7be0f498ddfa45e28ee8f2416475ba42&code_challenge=B4JszPcS0HOW7ECTTUURC1mp6z8at2b6K0lD1uK_11A&code_challenge_method=S256&response_mode=query&kc_idp_hint=bceidboth - GET - true - false - true - false - - - - - - - - - Host - ${KEYCLOAK_LOGIN_URL} - - - Connection - keep-alive - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - sec-ch-ua-mobile - ?0 - - - sec-ch-ua-platform - "Windows" - - - Upgrade-Insecure-Requests - 1 - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Accept - text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - navigate - - - Sec-Fetch-User - ?1 - - - Sec-Fetch-Dest - document - - - Referer - https://${FRONTEND_API_URL}/ - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - Cookie - AUTH_SESSION_ID=2e364c60-0ead-4ec1-98fb-0e1bba001f08.ycloak-78b4c74bcf-vtmwp; AUTH_SESSION_ID_LEGACY=2e364c60-0ead-4ec1-98fb-0e1bba001f08.ycloak-78b4c74bcf-vtmwp; _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; FAILREASON=0; SMSESSION=LOGGEDOFF - - - - - - - - - - false - - = - true - - - - - - - - https://${KEYCLOAK_LOGIN_URL}/auth/realms/standard/broker/bceidboth/login?session_code=5b_D1WNhNIzE-FZe70dEmhs_J2mpDyFSyQzWPAxnjYc&client_id=on-route-bc-direct-4598&tab_id=KAxYXjoatGc - GET - true - false - true - false - - - - - - - - - Host - ${KEYCLOAK_LOGIN_URL} - - - Connection - keep-alive - - - Upgrade-Insecure-Requests - 1 - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Accept - text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - navigate - - - Sec-Fetch-User - ?1 - - - Sec-Fetch-Dest - document - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - sec-ch-ua-mobile - ?0 - - - sec-ch-ua-platform - "Windows" - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - Cookie - AUTH_SESSION_ID=0e56ff7b-e277-400f-84f5-25801c43c829.ycloak-78b4c74bcf-kh476; AUTH_SESSION_ID_LEGACY=0e56ff7b-e277-400f-84f5-25801c43c829.ycloak-78b4c74bcf-kh476; KC_RESTART=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICIzMmI0MzNkNC02NjgwLTQxODMtOTc2Yy1kZDdjMTg0YjExMTQifQ.eyJjaWQiOiJvbi1yb3V0ZS1iYy1kaXJlY3QtNDU5OCIsInB0eSI6Im9wZW5pZC1jb25uZWN0IiwicnVyaSI6Imh0dHBzOi8vb25yb3V0ZWJjLXRlc3QtZnJvbnRlbmQuYXBwcy5zaWx2ZXIuZGV2b3BzLmdvdi5iYy5jYS8iLCJhY3QiOiJBVVRIRU5USUNBVEUiLCJub3RlcyI6eyJzY29wZSI6Im9wZW5pZCIsImlzcyI6Imh0dHBzOi8vdGVzdC5sb2dpbnByb3h5Lmdvdi5iYy5jYS9hdXRoL3JlYWxtcy9zdGFuZGFyZCIsInJlc3BvbnNlX3R5cGUiOiJjb2RlIiwiY29kZV9jaGFsbGVuZ2VfbWV0aG9kIjoiUzI1NiIsInJlZGlyZWN0X3VyaSI6Imh0dHBzOi8vb25yb3V0ZWJjLXRlc3QtZnJvbnRlbmQuYXBwcy5zaWx2ZXIuZGV2b3BzLmdvdi5iYy5jYS8iLCJzdGF0ZSI6IjdiZTBmNDk4ZGRmYTQ1ZTI4ZWU4ZjI0MTY0NzViYTQyIiwiY29kZV9jaGFsbGVuZ2UiOiJCNEpzelBjUzBIT1c3RUNUVFVVUkMxbXA2ejhhdDJiNkswbEQxdUtfMTFBIiwia2NfaWRwX2hpbnQiOiJiY2VpZGJvdGgiLCJyZXNwb25zZV9tb2RlIjoicXVlcnkifX0.2dLZTTjk8ZY0EFAaE88sAWQlfo7T17XcYLztnQwI_Yk; _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; FAILREASON=0; SMSESSION=LOGGEDOFF - - - - - - - - - - false - - = - true - - - - - - - - https://${KEYCLOAK_LOGIN_URL}/auth/realms/bceidboth/protocol/openid-connect/auth?scope=openid&state=JvIyfmoj0AzmBZWw0ZS8lBmhMJXd7lA_uAR8JQvLNlE.KAxYXjoatGc.on-route-bc-direct-4598&response_type=code&client_id=standard-realm&redirect_uri=https%3A%2F%2F${KEYCLOAK_LOGIN_URL}%2Fauth%2Frealms%2Fstandard%2Fbroker%2Fbceidboth%2Fendpoint&nonce=1sKWmdZ0aV6QIscb65Lrmg - GET - true - false - true - false - - - - - - - - - Host - ${KEYCLOAK_LOGIN_URL} - - - Connection - keep-alive - - - Upgrade-Insecure-Requests - 1 - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Accept - text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - navigate - - - Sec-Fetch-User - ?1 - - - Sec-Fetch-Dest - document - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - sec-ch-ua-mobile - ?0 - - - sec-ch-ua-platform - "Windows" - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - Cookie - AUTH_SESSION_ID=33769057-e4e2-49e9-821b-bab26d4e7507.ycloak-78b4c74bcf-gj9d6; AUTH_SESSION_ID_LEGACY=33769057-e4e2-49e9-821b-bab26d4e7507.ycloak-78b4c74bcf-gj9d6; KEYCLOAK_IDENTITY=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI1ZjExNjBiNS03Y2RjLTQ5NGQtYmFkOS0yZGRkNjU3MDU5Y2UifQ.eyJleHAiOjE2OTg3MzE3MzQsImlhdCI6MTY5ODY5NTczNCwianRpIjoiNzY3ZDEzMGEtMzczMC00NDdhLWEzNTUtNjhhNDhiMjgzZTI3IiwiaXNzIjoiaHR0cHM6Ly90ZXN0LmxvZ2lucHJveHkuZ292LmJjLmNhL2F1dGgvcmVhbG1zL2JjZWlkYm90aCIsInN1YiI6ImQ3M2FiN2IwLWUyMmEtNDg0NC04Yzc3LWU3YTQ2ODQyOTNmZCIsInR5cCI6IlNlcmlhbGl6ZWQtSUQiLCJzZXNzaW9uX3N0YXRlIjoiMzM3NjkwNTctZTRlMi00OWU5LTgyMWItYmFiMjZkNGU3NTA3Iiwic2lkIjoiMzM3NjkwNTctZTRlMi00OWU5LTgyMWItYmFiMjZkNGU3NTA3Iiwic3RhdGVfY2hlY2tlciI6Ik9SWEI4amY3Q3hPUWhzTUNhWU5nMHF2WHNzZG52cnlxUHFjMnFpUkthZncifQ.1kpL3Qpg4pyqSLBE0iDz7WZ0fdGzCCf6RCiN6HvFWqE; KEYCLOAK_IDENTITY_LEGACY=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI1ZjExNjBiNS03Y2RjLTQ5NGQtYmFkOS0yZGRkNjU3MDU5Y2UifQ.eyJleHAiOjE2OTg3MzE3MzQsImlhdCI6MTY5ODY5NTczNCwianRpIjoiNzY3ZDEzMGEtMzczMC00NDdhLWEzNTUtNjhhNDhiMjgzZTI3IiwiaXNzIjoiaHR0cHM6Ly90ZXN0LmxvZ2lucHJveHkuZ292LmJjLmNhL2F1dGgvcmVhbG1zL2JjZWlkYm90aCIsInN1YiI6ImQ3M2FiN2IwLWUyMmEtNDg0NC04Yzc3LWU3YTQ2ODQyOTNmZCIsInR5cCI6IlNlcmlhbGl6ZWQtSUQiLCJzZXNzaW9uX3N0YXRlIjoiMzM3NjkwNTctZTRlMi00OWU5LTgyMWItYmFiMjZkNGU3NTA3Iiwic2lkIjoiMzM3NjkwNTctZTRlMi00OWU5LTgyMWItYmFiMjZkNGU3NTA3Iiwic3RhdGVfY2hlY2tlciI6Ik9SWEI4amY3Q3hPUWhzTUNhWU5nMHF2WHNzZG52cnlxUHFjMnFpUkthZncifQ.1kpL3Qpg4pyqSLBE0iDz7WZ0fdGzCCf6RCiN6HvFWqE; KEYCLOAK_SESSION=bceidboth/d73ab7b0-e22a-4844-8c77-e7a4684293fd/33769057-e4e2-49e9-821b-bab26d4e7507; KEYCLOAK_SESSION_LEGACY=bceidboth/d73ab7b0-e22a-4844-8c77-e7a4684293fd/33769057-e4e2-49e9-821b-bab26d4e7507; _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; FAILREASON=0; SMSESSION=LOGGEDOFF - - - - - - - - - - false - - = - true - - - - - - - - https://${KEYCLOAK_LOGIN_URL}/auth/realms/bceidboth/broker/bceidboth/login?session_code=oRr0p7JZ9oL7vptnFPfNKhf_nrB8DND1rBojsNPjot0&client_id=standard-realm&tab_id=k5Vw5BDlfVQ - GET - true - false - true - false - - - - - - - - - Host - ${KEYCLOAK_LOGIN_URL} - - - Connection - keep-alive - - - Upgrade-Insecure-Requests - 1 - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Accept - text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - navigate - - - Sec-Fetch-User - ?1 - - - Sec-Fetch-Dest - document - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - sec-ch-ua-mobile - ?0 - - - sec-ch-ua-platform - "Windows" - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - Cookie - AUTH_SESSION_ID=f26f78a0-28d2-40b4-9e57-b83fa590e32e.ycloak-78b4c74bcf-vtmwp; AUTH_SESSION_ID_LEGACY=f26f78a0-28d2-40b4-9e57-b83fa590e32e.ycloak-78b4c74bcf-vtmwp; KC_RESTART=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI1ZjExNjBiNS03Y2RjLTQ5NGQtYmFkOS0yZGRkNjU3MDU5Y2UifQ.eyJjaWQiOiJzdGFuZGFyZC1yZWFsbSIsInB0eSI6Im9wZW5pZC1jb25uZWN0IiwicnVyaSI6Imh0dHBzOi8vdGVzdC5sb2dpbnByb3h5Lmdvdi5iYy5jYS9hdXRoL3JlYWxtcy9zdGFuZGFyZC9icm9rZXIvYmNlaWRib3RoL2VuZHBvaW50IiwiYWN0IjoiQVVUSEVOVElDQVRFIiwibm90ZXMiOnsic2NvcGUiOiJvcGVuaWQiLCJpc3MiOiJodHRwczovL3Rlc3QubG9naW5wcm94eS5nb3YuYmMuY2EvYXV0aC9yZWFsbXMvYmNlaWRib3RoIiwicmVzcG9uc2VfdHlwZSI6ImNvZGUiLCJyZWRpcmVjdF91cmkiOiJodHRwczovL3Rlc3QubG9naW5wcm94eS5nb3YuYmMuY2EvYXV0aC9yZWFsbXMvc3RhbmRhcmQvYnJva2VyL2JjZWlkYm90aC9lbmRwb2ludCIsInN0YXRlIjoiSnZJeWZtb2owQXptQlpXdzBaUzhsQm1oTUpYZDdsQV91QVI4SlF2TE5sRS5LQXhZWGpvYXRHYy5vbi1yb3V0ZS1iYy1kaXJlY3QtNDU5OCIsIm5vbmNlIjoiMXNLV21kWjBhVjZRSXNjYjY1THJtZyJ9fQ.08S_Qi57kTkuLj_eH5VElw2zeuH4AVhfOUois5IUzEI; _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; FAILREASON=0; SMSESSION=LOGGEDOFF - - - - - - - - - - false - - = - true - - - - - - - - https://${SITEMINDER_URL}/clp-cgi/capBceid/logon.cgi?flags=0101:0,7&TYPE=33554433&REALMOID=06-b02c7ed2-895e-4953-bd03-8008c64ec906&GUID=&SMAUTHREASON=0&METHOD=GET&SMAGENTNAME=$SM$Lk6VtkyHw8x3zQIIsMiOiEXYFJF%2fJzjVT7eioCjxBjJck5VMlbxxrR%2bLZSo%2flIBX&TARGET=$SM$HTTPS%3a%2f%2fsfstest7%2egov%2ebc%2eca%2faffwebservices%2fredirectjsp%2ftestkeycloak-basicbusinessbceid%2fredirect%2ejsp%3fSMPORTALURL%3dhttps$%3A$%2F$%2Fsfstest7%2egov%2ebc%2eca$%2Faffwebservices$%2Fpublic$%2Fsaml2sso%26SAMLTRANSACTIONID%3dc9f189ad-7324de1b-2e045e1a-e8bcf162-a78af00c-c5 - GET - true - false - true - false - - - - - - - - - Host - ${SITEMINDER_URL} - - - Connection - keep-alive - - - Cache-Control - max-age=0 - - - Upgrade-Insecure-Requests - 1 - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Accept - text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - navigate - - - Sec-Fetch-Dest - document - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - sec-ch-ua-mobile - ?0 - - - sec-ch-ua-platform - "Windows" - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - Cookie - _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; Dummy1=DummyVal1; BCGOVFlags=0101%3A0%2C7; BCGOVCustom=NULL; BCGOVBrand=NULL; BCGOVBehavior=NULL; Dummy2=DummyVal2; preDummy1=DummyVal1; preDummy2=DummyVal2; preDummy3=DummyVal3; BCGOVDoNotShow=1; preDummy4=DummyVal4; FAILREASON=0; BCGOVTarget=HTTPS%3A%2F%2Fsfstest7.gov.bc.ca%2Faffwebservices%2Fredirectjsp%2Ftestkeycloak-basicbusinessbceid%2Fredirect.jsp%3FSMPORTALURL%3Dhttps%253A%252F%252Fsfstest7.gov.bc.ca%252Faffwebservices%252Fpublic%252Fsaml2sso%26SAMLTRANSACTIONID%3Df7917115-57286b4a-df9cf6ff-b50e2f11-c566ac5a-f6; BCGOVclptryno=0; clp001=0; SMSESSION=LOGGEDOFF; SMFED_OLD_SESSION=""; SMFED_OLD_IDENTITY=""; GUID=1:26feb557-62af2c8c-4ef3a8d7-2e2277be-6a76895c-697 - - - - - - - true - - - - false - instance=instance_capBceid&user=ORBCTST3&password=orbcTST%2B2023 - = - - - - - - - - https://${SITEMINDER_URL}/clp-cgi/preLogon.cgi - POST - true - false - true - false - - - - - - - - - Host - ${SITEMINDER_URL} - - - Connection - keep-alive - - - Content-Length - 64 - - - Cache-Control - max-age=0 - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - sec-ch-ua-mobile - ?0 - - - sec-ch-ua-platform - "Windows" - - - Upgrade-Insecure-Requests - 1 - - - Origin - https://${SITEMINDER_URL} - - - Content-Type - application/x-www-form-urlencoded - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Accept - text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 - - - Sec-Fetch-Site - same-origin - - - Sec-Fetch-Mode - navigate - - - Sec-Fetch-User - ?1 - - - Sec-Fetch-Dest - document - - - Referer - https://${SITEMINDER_URL}/clp-cgi/capBceid/logon.cgi?flags=0101:0,7&TYPE=33554433&REALMOID=06-b02c7ed2-895e-4953-bd03-8008c64ec906&GUID=&SMAUTHREASON=0&METHOD=GET&SMAGENTNAME=$SM$Lk6VtkyHw8x3zQIIsMiOiEXYFJF%2fJzjVT7eioCjxBjJck5VMlbxxrR%2bLZSo%2flIBX&TARGET=$SM$HTTPS%3a%2f%2fsfstest7%2egov%2ebc%2eca%2faffwebservices%2fredirectjsp%2ftestkeycloak-basicbusinessbceid%2fredirect%2ejsp%3fSMPORTALURL%3dhttps$%3A$%2F$%2Fsfstest7%2egov%2ebc%2eca$%2Faffwebservices$%2Fpublic$%2Fsaml2sso%26SAMLTRANSACTIONID%3dc9f189ad-7324de1b-2e045e1a-e8bcf162-a78af00c-c5 - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - Cookie - _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; Dummy1=DummyVal1; BCGOVFlags=0101%3A0%2C7; BCGOVCustom=NULL; BCGOVBrand=NULL; BCGOVBehavior=NULL; Dummy2=DummyVal2; preDummy1=DummyVal1; preDummy2=DummyVal2; preDummy3=DummyVal3; BCGOVDoNotShow=1; preDummy4=DummyVal4; FAILREASON=0; clp001=0; SMSESSION=LOGGEDOFF; SMFED_OLD_SESSION=""; SMFED_OLD_IDENTITY=""; GUID=1:26feb557-62af2c8c-4ef3a8d7-2e2277be-6a76895c-697; BCGOVTarget=HTTPS%3A%2F%2Fsfstest7.gov.bc.ca%2Faffwebservices%2Fredirectjsp%2Ftestkeycloak-basicbusinessbceid%2Fredirect.jsp%3FSMPORTALURL%3Dhttps%253A%252F%252Fsfstest7.gov.bc.ca%252Faffwebservices%252Fpublic%252Fsaml2sso%26SAMLTRANSACTIONID%3Dc9f189ad-7324de1b-2e045e1a-e8bcf162-a78af00c-c5; BCGOVclptryno=1 - - - - - - - true - - - - false - SMENC=ISO-8859-1&SMLOCALE=US-EN&target=%2Fclp-cgi%2Fcap07%2Fprivate%2FpostLogon.cgi&smauthreason=0&smagentname=&user=ORBCTST3&password=orbcTST%2B2023 - = - - - - - - - - https://${SITEMINDER_URL}/clp-cgi/cap07/logon.fcc - POST - true - false - true - false - - - - - - - - - Host - ${SITEMINDER_URL} - - - Connection - keep-alive - - - Content-Length - 149 - - - Cache-Control - max-age=0 - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - sec-ch-ua-mobile - ?0 - - - sec-ch-ua-platform - "Windows" - - - Upgrade-Insecure-Requests - 1 - - - Origin - https://${SITEMINDER_URL} - - - Content-Type - application/x-www-form-urlencoded - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Accept - text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 - - - Sec-Fetch-Site - same-origin - - - Sec-Fetch-Mode - navigate - - - Sec-Fetch-Dest - document - - - Referer - https://${SITEMINDER_URL}/clp-cgi/preLogon.cgi - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - Cookie - _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; Dummy1=DummyVal1; BCGOVFlags=0101%3A0%2C7; BCGOVCustom=NULL; BCGOVBrand=NULL; BCGOVBehavior=NULL; Dummy2=DummyVal2; preDummy1=DummyVal1; preDummy2=DummyVal2; preDummy3=DummyVal3; BCGOVDoNotShow=1; preDummy4=DummyVal4; FAILREASON=0; SMSESSION=LOGGEDOFF; SMFED_OLD_SESSION=""; SMFED_OLD_IDENTITY=""; GUID=1:26feb557-62af2c8c-4ef3a8d7-2e2277be-6a76895c-697; BCGOVTarget=HTTPS%3A%2F%2Fsfstest7.gov.bc.ca%2Faffwebservices%2Fredirectjsp%2Ftestkeycloak-basicbusinessbceid%2Fredirect.jsp%3FSMPORTALURL%3Dhttps%253A%252F%252Fsfstest7.gov.bc.ca%252Faffwebservices%252Fpublic%252Fsaml2sso%26SAMLTRANSACTIONID%3Dc9f189ad-7324de1b-2e045e1a-e8bcf162-a78af00c-c5; BCGOVclptryno=1; clp001=Salted__%8E%F5%14%93%F3.%C8%8C%C2%B3%84%8B%8EC%E0%88%AAK%01%C77%B6%C4g%C3%D2%3ELS%06%7CdJp%18%E9TJ%8A%D3a%A9%AD%3C%5E%DBZ%D7 - - - - - - - - - - false - - = - - - - - - - - https://${SITEMINDER_URL}/clp-cgi/cap07/private/postLogon.cgi - GET - true - false - true - false - - - - - - - - - Host - ${SITEMINDER_URL} - - - Connection - keep-alive - - - Cache-Control - max-age=0 - - - Upgrade-Insecure-Requests - 1 - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Accept - text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 - - - Sec-Fetch-Site - same-origin - - - Sec-Fetch-Mode - navigate - - - Sec-Fetch-Dest - document - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - sec-ch-ua-mobile - ?0 - - - sec-ch-ua-platform - "Windows" - - - Referer - https://${SITEMINDER_URL}/clp-cgi/preLogon.cgi - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - Cookie - _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; Dummy1=DummyVal1; BCGOVFlags=0101%3A0%2C7; BCGOVCustom=NULL; BCGOVBrand=NULL; BCGOVBehavior=NULL; Dummy2=DummyVal2; preDummy1=DummyVal1; preDummy2=DummyVal2; preDummy3=DummyVal3; BCGOVDoNotShow=1; preDummy4=DummyVal4; FAILREASON=0; SMSESSION=LOGGEDOFF; SMFED_OLD_SESSION=""; SMFED_OLD_IDENTITY=""; GUID=1:26feb557-62af2c8c-4ef3a8d7-2e2277be-6a76895c-697; BCGOVTarget=HTTPS%3A%2F%2Fsfstest7.gov.bc.ca%2Faffwebservices%2Fredirectjsp%2Ftestkeycloak-basicbusinessbceid%2Fredirect.jsp%3FSMPORTALURL%3Dhttps%253A%252F%252Fsfstest7.gov.bc.ca%252Faffwebservices%252Fpublic%252Fsaml2sso%26SAMLTRANSACTIONID%3Dc9f189ad-7324de1b-2e045e1a-e8bcf162-a78af00c-c5; BCGOVclptryno=1; clp001=Salted__%8E%F5%14%93%F3.%C8%8C%C2%B3%84%8B%8EC%E0%88%AAK%01%C77%B6%C4g%C3%D2%3ELS%06%7CdJp%18%E9TJ%8A%D3a%A9%AD%3C%5E%DBZ%D7; FORMCRED=2ZS4S2F4tb41FWGyAD293ZV3eiMsCRYZ+ktOitYzjWY/fG/2BFtCWHSnbkvgJfBEm8aTuwAg3nMfeG0h8ahL0C1Q+SZp1d30x/imUNpQkjqP7yK+smpXGQMNWzNb15A+UXcYa0yUQLQ5rFoH720FIoiqZ4Nmikk7a67vktQxd8rpIduHeZJ7tAYb/b+pXPha - - - - - - - true - - - - false - RelayState=pkQKGHDSoVdRPpUZ1XHJWrVAUBtEl2EOcIu2bUhv0V0.k5Vw5BDlfVQ.standard-realm&SAMLResponse=PG5zNTpSZXNwb25zZSB4bWxuczpuczU9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpwcm90b2NvbCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDkveG1sZW5jMTEjIiB4bWxuczpuczI9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphc3NlcnRpb24iIHhtbG5zOm5zMz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyIgeG1sbnM6bnM0PSJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzA0L3htbGVuYyMiIERlc3RpbmF0aW9uPSJodHRwczovL3Rlc3QubG9naW5wcm94eS5nb3YuYmMuY2EvYXV0aC9yZWFsbXMvYmNlaWRib3RoL2Jyb2tlci9iY2VpZGJvdGgvZW5kcG9pbnQiIElEPSJfMzU0NWZlNjJmOGY3OThhNTk1ZWNlM2I2YzYxM2RmNmU5ZWFkIiBJblJlc3BvbnNlVG89IklEX2FhYTM1M2Q0LTdlNmMtNDQxNS05N2FkLWI2NmEzM2FhOTBkYyIgSXNzdWVJbnN0YW50PSIyMDIzLTEwLTMwVDE5OjU2OjM3LjE4MFoiIFZlcnNpb249IjIuMCI%2BDQogICAgPG5zMjpJc3N1ZXIgRm9ybWF0PSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6bmFtZWlkLWZvcm1hdDplbnRpdHkiPmh0dHBzOi8vdGVzdC5sb2dpbnByb3h5Lmdvdi5iYy5jYS9hdXRoL3JlYWxtcy9fYmNlaWRiYXNpY2J1c2luZXNzMS88L25zMjpJc3N1ZXI%2BDQogICAgPG5zNTpTdGF0dXM%2BDQogICAgICAgIDxuczU6U3RhdHVzQ29kZSBWYWx1ZT0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOnN0YXR1czpTdWNjZXNzIi8%2BDQogICAgPC9uczU6U3RhdHVzPg0KICAgIDxuczI6QXNzZXJ0aW9uIElEPSJfZWFmZTRjYWQ5MjU0MTEyZjQ5YTcxMDI1MGM3YjVhNDVjYmI2IiBJc3N1ZUluc3RhbnQ9IjIwMjMtMTAtMzBUMTk6NTY6MzcuMTgwWiIgVmVyc2lvbj0iMi4wIiB4bWxuczpuczI9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphc3NlcnRpb24iPg0KICAgICAgICA8bnMyOklzc3VlciBGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpuYW1laWQtZm9ybWF0OmVudGl0eSI%2BaHR0cHM6Ly90ZXN0LmxvZ2lucHJveHkuZ292LmJjLmNhL2F1dGgvcmVhbG1zL19iY2VpZGJhc2ljYnVzaW5lc3MxLzwvbnMyOklzc3Vlcj48ZHM6U2lnbmF0dXJlIHhtbG5zOmRzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIj48ZHM6U2lnbmVkSW5mbz48ZHM6Q2Fub25pY2FsaXphdGlvbk1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvMTAveG1sLWV4Yy1jMTRuIyIvPjxkczpTaWduYXR1cmVNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzA0L3htbGRzaWctbW9yZSNyc2Etc2hhMjU2Ii8%2BPGRzOlJlZmVyZW5jZSBVUkk9IiNfZWFmZTRjYWQ5MjU0MTEyZjQ5YTcxMDI1MGM3YjVhNDVjYmI2Ij48ZHM6VHJhbnNmb3Jtcz48ZHM6VHJhbnNmb3JtIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI2VudmVsb3BlZC1zaWduYXR1cmUiLz48ZHM6VHJhbnNmb3JtIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS8xMC94bWwtZXhjLWMxNG4jIi8%2BPC9kczpUcmFuc2Zvcm1zPjxkczpEaWdlc3RNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzA0L3htbGVuYyNzaGEyNTYiLz48ZHM6RGlnZXN0VmFsdWU%2BS0c3SWRyMko3ODNGVGFkNkVZM0hHUklyRFpnUXU1TmdOQ1JBRU1vcERkYz08L2RzOkRpZ2VzdFZhbHVlPjwvZHM6UmVmZXJlbmNlPjwvZHM6U2lnbmVkSW5mbz48ZHM6U2lnbmF0dXJlVmFsdWU%2BbHJlNnpwalpyUEpKZmVqYStkUHN3cUhlVDN6a3VkNjA4emppZE4vWlBRMjdmSW56aHFWQ2lreDhHcld4V29jSWM4ekhHb1cxZmJqTXlBSkIwNnRHS2pXdzBXMWExTlIyL2VlVGQ1MFY1RnF4NndIb001NFVmYUkvY0N6dDdsMUNUQ2lHZzB6UkVLZjRDK3RxcWJaQ3QyRlFCQ20vd0xaNHRrdXVsZUh4WTZqdGJxWXBlbmpvSzQ2TGlocE1CejIvczBDRmQ3c1BxVjF4bHJpWXVtd1dtSlV1b0o1d0M1L2ZMZ3djTUlmSVMwd29SZmQzclBTN1pBWk5vWXExVVpWQ2xmemZMZ1hNc3JsM2k2S0F3SS80N01pSVpzeGNaaFd1Q3dMTFdFSXdzRWQzWlNLZFhXUTF1U0RrSGlIUGIrcXFmSTJQRGJwK2l1bHFDdlo2S3BCVzdnPT08L2RzOlNpZ25hdHVyZVZhbHVlPjxkczpLZXlJbmZvIHhtbG5zOmRzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIj48ZHM6WDUwOURhdGE%2BPGRzOlg1MDlDZXJ0aWZpY2F0ZT5NSUlFQ3pDQ0F2TUNDUUNkb1dONFh0VUk2VEFOQmdrcWhraUc5dzBCQVFzRkFEQ0J5akVMTUFrR0ExVUVCaE1DUTBFeEdUQVhCZ05WQkFnVEVFSnlhWFJwYzJnZ1EyOXNkVzFpYVdFeEVUQVBCZ05WQkFjVENGWnBZM1J2Y21saE1UY3dOUVlEVlFRS0V5NUhiM1psY201dFpXNTBJRzltSUhSb1pTQlFjbTkyYVc1alpTQnZaaUJDY21sMGFYTm9JRU52YkhWdFltbGhNUTh3RFFZRFZRUUxFd1pUUmxNdFEwRXhJakFnQmdOVkJBTVRHVk5HVXlCRFpYSjBhV1pwWTJGMFpTQkJkWFJvYjNKcGRIa3hIekFkQmdrcWhraUc5dzBCQ1FFV0VGZFVVMWRCVFVCbmIzWXVZbU11WTJFd0hoY05NVE13TkRBMU1qSTFOalUzV2hjTk16TXdOREExTWpJMU5qVTNXakNCd3pFTE1Ba0dBMVVFQmhNQ1EwRXhHVEFYQmdOVkJBZ1RFRUp5YVhScGMyZ2dRMjlzZFcxaWFXRXhFVEFQQmdOVkJBY1RDRlpwWTNSdmNtbGhNVGN3TlFZRFZRUUtFeTVIYjNabGNtNXRaVzUwSUc5bUlIUm9aU0JRY205MmFXNWpaU0J2WmlCQ2NtbDBhWE5vSUVOdmJIVnRZbWxoTVF3d0NnWURWUVFMRXdOVFJsTXhIakFjQmdOVkJBTVRGWE5tY3kxelpuTjBaWE4wTG1kdmRpNWlZeTVqWVRFZk1CMEdDU3FHU0liM0RRRUpBUllRVjFSVFYwRk5RR2R2ZGk1aVl5NWpZVENDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFKdzVFMDQ1amxKK3NiU2dOZmt2eUpBMysyN0tSQm1BbHErTVVSb1IzT1NpV2MyME1XZHQ1cEt4ZFJVcTJmWXhyUWp0cnRQdUdxa2tFR2FlSTBpTlp3UkluYnk2SHU2dWJDd2YxUTdmVGxXNzhscytDak5rWU5VQzMvd3VDM21uMVFuZzhVMGxkUTd0UVU0Y1BPcXdMSXZTaUpkaUpacm1GOFJEcHBvZFljSGhiaWo3N3Q2dGlIVkN4UVlncXhOY3V0M2d3bnhWcjI0MTZ5V0hYVnFxcGNjS0xUaUkvSm9lQ2I1b0kyVVVDcmRldnlXZDRINXFOWmx5NGhMNVBCQ1lZNFR1cFVheWpoYldmeEpLNFVXY0R2N09PYSt1eHE0a1luR2V4RHBxQ2JXNmJ2Y0hiazQ3UDVSQVpJdmd2bkdvQmdTZm9oMzd6eFEvRnA2VkU0aVdBdWNDQXdFQUFUQU5CZ2txaGtpRzl3MEJBUXNGQUFPQ0FRRUFiZGtqUTl1SHB2ZGtTZUlHT25meHU0Vm5mM2pHTzR5bzgrQnJub0dhTEM4aTJDV21Wb2RpOUdPdTNIM2pyR3ZzU296N242QzJBK3ZJdkR4dkE3dHdqd0xBcXVaVlFKbkJDcE1LbXdsUENBQ0F3WitFbGI0cjJxTW14YTJGbTBJZVl6M3gyQldZT0FUdGljODFmRnpoSjhRa1dCdXdiOStkSiswbC9HR1FmOXBPMnFpSXFVRWQyb0lVVkR4cVdSWXpoUGV6ZWpwZlZqQnNUUFhZNXhRaGRCVUtITXIwWnBTVTlrTW9KemNNMW42bEpIN3BGSFpCVUtONzkyaG9FNTVPbEszTFFMVW9oKzNXNEROL1lWS2tEczZrSHI0b0w2dXo5ajJXODRIVVBYNURMbUZGaUorTHBTMDUyVkJ0WWNoangyQnQwRlBzSEpKNEMwRjByNUc0b3c9PTwvZHM6WDUwOUNlcnRpZmljYXRlPjwvZHM6WDUwOURhdGE%2BPC9kczpLZXlJbmZvPjwvZHM6U2lnbmF0dXJlPg0KICAgICAgICA8bnMyOlN1YmplY3Q%2BDQogICAgICAgICAgICA8bnMyOk5hbWVJRCBGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpuYW1laWQtZm9ybWF0OnBlcnNpc3RlbnQiPkE5RUQyQzU3NDJEQzQ1NTk5ODY3MkNDMkExMTgxNzRCPC9uczI6TmFtZUlEPg0KICAgICAgICAgICAgPG5zMjpTdWJqZWN0Q29uZmlybWF0aW9uIE1ldGhvZD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmNtOmJlYXJlciI%2BDQogICAgICAgICAgICAgICAgPG5zMjpTdWJqZWN0Q29uZmlybWF0aW9uRGF0YSBJblJlc3BvbnNlVG89IklEX2FhYTM1M2Q0LTdlNmMtNDQxNS05N2FkLWI2NmEzM2FhOTBkYyIgTm90T25PckFmdGVyPSIyMDIzLTEwLTMwVDE5OjU4OjA3LjE0OFoiIFJlY2lwaWVudD0iaHR0cHM6Ly90ZXN0LmxvZ2lucHJveHkuZ292LmJjLmNhL2F1dGgvcmVhbG1zL2JjZWlkYm90aC9icm9rZXIvYmNlaWRib3RoL2VuZHBvaW50Ii8%2BDQogICAgICAgICAgICA8L25zMjpTdWJqZWN0Q29uZmlybWF0aW9uPg0KICAgICAgICA8L25zMjpTdWJqZWN0Pg0KICAgICAgICA8bnMyOkNvbmRpdGlvbnMgTm90QmVmb3JlPSIyMDIzLTEwLTMwVDE5OjU2OjA3LjE0OFoiIE5vdE9uT3JBZnRlcj0iMjAyMy0xMC0zMFQxOTo1ODowNy4xNDhaIj4NCiAgICAgICAgICAgIDxuczI6QXVkaWVuY2VSZXN0cmljdGlvbj4NCiAgICAgICAgICAgICAgICA8bnMyOkF1ZGllbmNlPmh0dHBzOi8vdGVzdC5sb2dpbnByb3h5Lmdvdi5iYy5jYS9hdXRoL3JlYWxtcy9fYmNlaWRiYXNpY2J1c2luZXNzMS88L25zMjpBdWRpZW5jZT4NCiAgICAgICAgICAgIDwvbnMyOkF1ZGllbmNlUmVzdHJpY3Rpb24%2BDQogICAgICAgIDwvbnMyOkNvbmRpdGlvbnM%2BDQogICAgICAgIDxuczI6QXV0aG5TdGF0ZW1lbnQgQXV0aG5JbnN0YW50PSIyMDIzLTEwLTMwVDE5OjU2OjM1LjEzMloiIFNlc3Npb25JbmRleD0ibGdlQ1pvN01aRnpJaFFiU1dGcXg1SDJiK1U0PXlMMWRQUT09IiBTZXNzaW9uTm90T25PckFmdGVyPSIyMDIzLTEwLTMwVDE5OjU4OjA3LjEzMloiPg0KICAgICAgICAgICAgPG5zMjpBdXRobkNvbnRleHQ%2BDQogICAgICAgICAgICAgICAgPG5zMjpBdXRobkNvbnRleHRDbGFzc1JlZj51cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6YWM6Y2xhc3NlczpQYXNzd29yZDwvbnMyOkF1dGhuQ29udGV4dENsYXNzUmVmPg0KICAgICAgICAgICAgPC9uczI6QXV0aG5Db250ZXh0Pg0KICAgICAgICA8L25zMjpBdXRoblN0YXRlbWVudD4NCiAgICAgICAgPG5zMjpBdHRyaWJ1dGVTdGF0ZW1lbnQ%2BDQogICAgICAgICAgICA8bnMyOkF0dHJpYnV0ZSBOYW1lPSJiY2VpZF91c2VybmFtZSIgTmFtZUZvcm1hdD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmF0dHJuYW1lLWZvcm1hdDp1bnNwZWNpZmllZCI%2BDQogICAgICAgICAgICAgICAgPG5zMjpBdHRyaWJ1dGVWYWx1ZSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTp0eXBlPSJ4czpzdHJpbmciPk9SQkNUU1QzPC9uczI6QXR0cmlidXRlVmFsdWU%2BDQogICAgICAgICAgICA8L25zMjpBdHRyaWJ1dGU%2BDQogICAgICAgICAgICA8bnMyOkF0dHJpYnV0ZSBOYW1lPSJkaXNwbGF5X25hbWUiIE5hbWVGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphdHRybmFtZS1mb3JtYXQ6dW5zcGVjaWZpZWQiPg0KICAgICAgICAgICAgICAgIDxuczI6QXR0cmlidXRlVmFsdWUgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6dHlwZT0ieHM6c3RyaW5nIj5CcnlhbiBMYW5lPC9uczI6QXR0cmlidXRlVmFsdWU%2BDQogICAgICAgICAgICA8L25zMjpBdHRyaWJ1dGU%2BDQogICAgICAgICAgICA8bnMyOkF0dHJpYnV0ZSBOYW1lPSJiY2VpZF91c2VyX2d1aWQiIE5hbWVGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphdHRybmFtZS1mb3JtYXQ6dW5zcGVjaWZpZWQiPg0KICAgICAgICAgICAgICAgIDxuczI6QXR0cmlidXRlVmFsdWUgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6dHlwZT0ieHM6c3RyaW5nIj5BOUVEMkM1NzQyREM0NTU5OTg2NzJDQzJBMTE4MTc0QjwvbnMyOkF0dHJpYnV0ZVZhbHVlPg0KICAgICAgICAgICAgPC9uczI6QXR0cmlidXRlPg0KICAgICAgICAgICAgPG5zMjpBdHRyaWJ1dGUgTmFtZT0iZW1haWwiIE5hbWVGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphdHRybmFtZS1mb3JtYXQ6dW5zcGVjaWZpZWQiPg0KICAgICAgICAgICAgICAgIDxuczI6QXR0cmlidXRlVmFsdWUgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6dHlwZT0ieHM6c3RyaW5nIj5icnlhbi5sYW5lQGdvdi5iYy5jYTwvbnMyOkF0dHJpYnV0ZVZhbHVlPg0KICAgICAgICAgICAgPC9uczI6QXR0cmlidXRlPg0KICAgICAgICA8bnMyOkF0dHJpYnV0ZSBOYW1lPSJTTUdPVl9CVVNJTkVTU0dVSUQiIE5hbWVGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphdHRybmFtZS1mb3JtYXQ6dW5zcGVjaWZpZWQiPjxuczI6QXR0cmlidXRlVmFsdWU%2BRjQwMjNEQjNDMzBGNDg3QjlBRjVCMTRDOTU4OTg5Rjg8L25zMjpBdHRyaWJ1dGVWYWx1ZT48L25zMjpBdHRyaWJ1dGU%2BPG5zMjpBdHRyaWJ1dGUgTmFtZT0iU01HT1ZfQlVTSU5FU1NMRUdBTE5BTUUiIE5hbWVGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphdHRybmFtZS1mb3JtYXQ6dW5zcGVjaWZpZWQiPjxuczI6QXR0cmlidXRlVmFsdWU%2BU29uaWMgRGVsaXZlcnkgU2VydmljZXM8L25zMjpBdHRyaWJ1dGVWYWx1ZT48L25zMjpBdHRyaWJ1dGU%2BPC9uczI6QXR0cmlidXRlU3RhdGVtZW50Pg0KICAgIDwvbnMyOkFzc2VydGlvbj4NCjwvbnM1OlJlc3BvbnNlPg%3D%3D - = - - - - - - - - https://${KEYCLOAK_LOGIN_URL}/auth/realms/bceidboth/broker/bceidboth/endpoint - POST - true - false - true - false - - - - - - - - - Host - ${KEYCLOAK_LOGIN_URL} - - - Connection - keep-alive - - - Content-Length - 9217 - - - Cache-Control - max-age=0 - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - sec-ch-ua-mobile - ?0 - - - sec-ch-ua-platform - "Windows" - - - Upgrade-Insecure-Requests - 1 - - - Origin - https://sfstest7.gov.bc.ca - - - Content-Type - application/x-www-form-urlencoded - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Accept - text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - navigate - - - Sec-Fetch-Dest - document - - - Referer - https://sfstest7.gov.bc.ca/ - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - Cookie - AUTH_SESSION_ID=f26f78a0-28d2-40b4-9e57-b83fa590e32e.ycloak-78b4c74bcf-vtmwp; AUTH_SESSION_ID_LEGACY=f26f78a0-28d2-40b4-9e57-b83fa590e32e.ycloak-78b4c74bcf-vtmwp; KC_RESTART=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI1ZjExNjBiNS03Y2RjLTQ5NGQtYmFkOS0yZGRkNjU3MDU5Y2UifQ.eyJjaWQiOiJzdGFuZGFyZC1yZWFsbSIsInB0eSI6Im9wZW5pZC1jb25uZWN0IiwicnVyaSI6Imh0dHBzOi8vdGVzdC5sb2dpbnByb3h5Lmdvdi5iYy5jYS9hdXRoL3JlYWxtcy9zdGFuZGFyZC9icm9rZXIvYmNlaWRib3RoL2VuZHBvaW50IiwiYWN0IjoiQVVUSEVOVElDQVRFIiwibm90ZXMiOnsic2NvcGUiOiJvcGVuaWQiLCJpc3MiOiJodHRwczovL3Rlc3QubG9naW5wcm94eS5nb3YuYmMuY2EvYXV0aC9yZWFsbXMvYmNlaWRib3RoIiwicmVzcG9uc2VfdHlwZSI6ImNvZGUiLCJyZWRpcmVjdF91cmkiOiJodHRwczovL3Rlc3QubG9naW5wcm94eS5nb3YuYmMuY2EvYXV0aC9yZWFsbXMvc3RhbmRhcmQvYnJva2VyL2JjZWlkYm90aC9lbmRwb2ludCIsInN0YXRlIjoiSnZJeWZtb2owQXptQlpXdzBaUzhsQm1oTUpYZDdsQV91QVI4SlF2TE5sRS5LQXhZWGpvYXRHYy5vbi1yb3V0ZS1iYy1kaXJlY3QtNDU5OCIsIm5vbmNlIjoiMXNLV21kWjBhVjZRSXNjYjY1THJtZyJ9fQ.08S_Qi57kTkuLj_eH5VElw2zeuH4AVhfOUois5IUzEI; _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; FAILREASON=0; SMSESSION=Awk9KIrMNenX09Vl2cEMuy/VxV9CFVP4fsBzCp8Zo3AX2VsrDVWkOMVOdJyoY1Q1J9F8Vs8XFBtHTU29qS7+jlhEMK3f9j8tgudEVWHJq8LTizGhEj1cf8r7CX2QuxWMbdAHvK90hFnpocsL5xv2cAaFVdqhBKlIYkzwkY+r0YuH3Uh6DJVIhAhwjWeKfO6BAg5/jNFxQ31EPvzn4N7RxJK2bGyfAxzi6Cs6O7ieJ10MzcB8nWSIsO4ksfG8pzeGp9a+arl4maKnd9Je2L2FQohmiOjfGcrsezOgLgiWFl1B3+EL8ytArvtKhsFvr7WJsQuhYsQYzfY8shcfhNSltyqxLD422bDmU3NyZdhWY9313YG5I1U2vbO7zvXhxaCJYnpMrJR+inz8XsyqnGY1xu7AepY3pNd2wJH3twQJ42N6R2WlJVVN3oc3DvEHUbk85xrqHdwngd/FiMdEC2f5Kt51VYp8G/3R+sbFiy6Wt7wlZw2+/wI8EfxXs31HQ5q/RDUTXz6JMbzsR7EUOF+WkOrgi1nDugu13/O9hDnxPJnkzNGEfjt0xPxdhoDdl4vWdwRe1awBEn90SyJwc8+cFk1XACtvWoGwtPdf1xnHUwx5Ge1TqEd46xdjjlu+iTw2Xu5AsESUVVw81STsKA7vC8EBabQ+yXQHZlNFcFCKa1+AutNxfWHNQtnFK03kUCai4ZPJc/TQrhvf9DWjSyX+KknWdV6aQyz65KOpwtQWpd4ZlqAAKvf9vCQIBgk+YdsxFzAq6ySnLPcBLbFvP+Xyo5bcABg8IS9aJr6+05KT3ZOv49G1uYvz1ILaDED83D5NHF57ZswKR2911SevaqIO2i8NkZAJUMBpgroSejoJ1MxzpL/a7I26u6+p/08uMt/dT7vuo5OTTjayEtIlXy1IRXA/jU/uX/pKk1JrsZFhhwj7G5KEQpMAx+YvZUaaidqyfj3+fLb6+rsa8BukV8x0zfgUg20dm+Wu9XjDvyQHFP4Qt65CaUbhAKcVTgCChgTfSSdUJZIPPa5Yhzr7SmTuVGmYV/1cC4jGzNdSqr3Fq28fWukiEnRtqfZRXlOdA6xb - - - - - - - - - - false - - = - - - - - - - - https://${KEYCLOAK_LOGIN_URL}/auth/realms/standard/broker/bceidboth/endpoint?state=JvIyfmoj0AzmBZWw0ZS8lBmhMJXd7lA_uAR8JQvLNlE.KAxYXjoatGc.on-route-bc-direct-4598&session_state=f26f78a0-28d2-40b4-9e57-b83fa590e32e&code=c5719177-78e8-4d75-857a-0ef191c765d1.f26f78a0-28d2-40b4-9e57-b83fa590e32e.1123d85b-badf-4084-a3a6-b1c920ccb0c0 - GET - true - false - true - false - - - - - - - - - Host - ${KEYCLOAK_LOGIN_URL} - - - Connection - keep-alive - - - Cache-Control - max-age=0 - - - Upgrade-Insecure-Requests - 1 - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Accept - text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - navigate - - - Sec-Fetch-Dest - document - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - sec-ch-ua-mobile - ?0 - - - sec-ch-ua-platform - "Windows" - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - Cookie - AUTH_SESSION_ID=0e56ff7b-e277-400f-84f5-25801c43c829.ycloak-78b4c74bcf-kh476; AUTH_SESSION_ID_LEGACY=0e56ff7b-e277-400f-84f5-25801c43c829.ycloak-78b4c74bcf-kh476; KC_RESTART=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICIzMmI0MzNkNC02NjgwLTQxODMtOTc2Yy1kZDdjMTg0YjExMTQifQ.eyJjaWQiOiJvbi1yb3V0ZS1iYy1kaXJlY3QtNDU5OCIsInB0eSI6Im9wZW5pZC1jb25uZWN0IiwicnVyaSI6Imh0dHBzOi8vb25yb3V0ZWJjLXRlc3QtZnJvbnRlbmQuYXBwcy5zaWx2ZXIuZGV2b3BzLmdvdi5iYy5jYS8iLCJhY3QiOiJBVVRIRU5USUNBVEUiLCJub3RlcyI6eyJzY29wZSI6Im9wZW5pZCIsImlzcyI6Imh0dHBzOi8vdGVzdC5sb2dpbnByb3h5Lmdvdi5iYy5jYS9hdXRoL3JlYWxtcy9zdGFuZGFyZCIsInJlc3BvbnNlX3R5cGUiOiJjb2RlIiwiY29kZV9jaGFsbGVuZ2VfbWV0aG9kIjoiUzI1NiIsInJlZGlyZWN0X3VyaSI6Imh0dHBzOi8vb25yb3V0ZWJjLXRlc3QtZnJvbnRlbmQuYXBwcy5zaWx2ZXIuZGV2b3BzLmdvdi5iYy5jYS8iLCJzdGF0ZSI6IjdiZTBmNDk4ZGRmYTQ1ZTI4ZWU4ZjI0MTY0NzViYTQyIiwiY29kZV9jaGFsbGVuZ2UiOiJCNEpzelBjUzBIT1c3RUNUVFVVUkMxbXA2ejhhdDJiNkswbEQxdUtfMTFBIiwia2NfaWRwX2hpbnQiOiJiY2VpZGJvdGgiLCJyZXNwb25zZV9tb2RlIjoicXVlcnkifX0.2dLZTTjk8ZY0EFAaE88sAWQlfo7T17XcYLztnQwI_Yk; _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; FAILREASON=0; SMSESSION=Awk9KIrMNenX09Vl2cEMuy/VxV9CFVP4fsBzCp8Zo3AX2VsrDVWkOMVOdJyoY1Q1J9F8Vs8XFBtHTU29qS7+jlhEMK3f9j8tgudEVWHJq8LTizGhEj1cf8r7CX2QuxWMbdAHvK90hFnpocsL5xv2cAaFVdqhBKlIYkzwkY+r0YuH3Uh6DJVIhAhwjWeKfO6BAg5/jNFxQ31EPvzn4N7RxJK2bGyfAxzi6Cs6O7ieJ10MzcB8nWSIsO4ksfG8pzeGp9a+arl4maKnd9Je2L2FQohmiOjfGcrsezOgLgiWFl1B3+EL8ytArvtKhsFvr7WJsQuhYsQYzfY8shcfhNSltyqxLD422bDmU3NyZdhWY9313YG5I1U2vbO7zvXhxaCJYnpMrJR+inz8XsyqnGY1xu7AepY3pNd2wJH3twQJ42N6R2WlJVVN3oc3DvEHUbk85xrqHdwngd/FiMdEC2f5Kt51VYp8G/3R+sbFiy6Wt7wlZw2+/wI8EfxXs31HQ5q/RDUTXz6JMbzsR7EUOF+WkOrgi1nDugu13/O9hDnxPJnkzNGEfjt0xPxdhoDdl4vWdwRe1awBEn90SyJwc8+cFk1XACtvWoGwtPdf1xnHUwx5Ge1TqEd46xdjjlu+iTw2Xu5AsESUVVw81STsKA7vC8EBabQ+yXQHZlNFcFCKa1+AutNxfWHNQtnFK03kUCai4ZPJc/TQrhvf9DWjSyX+KknWdV6aQyz65KOpwtQWpd4ZlqAAKvf9vCQIBgk+YdsxFzAq6ySnLPcBLbFvP+Xyo5bcABg8IS9aJr6+05KT3ZOv49G1uYvz1ILaDED83D5NHF57ZswKR2911SevaqIO2i8NkZAJUMBpgroSejoJ1MxzpL/a7I26u6+p/08uMt/dT7vuo5OTTjayEtIlXy1IRXA/jU/uX/pKk1JrsZFhhwj7G5KEQpMAx+YvZUaaidqyfj3+fLb6+rsa8BukV8x0zfgUg20dm+Wu9XjDvyQHFP4Qt65CaUbhAKcVTgCChgTfSSdUJZIPPa5Yhzr7SmTuVGmYV/1cC4jGzNdSqr3Fq28fWukiEnRtqfZRXlOdA6xb - - - - - - - - - - false - - = - - - - - - - - https://${KEYCLOAK_LOGIN_URL}/auth/realms/standard/login-actions/post-broker-login?client_id=on-route-bc-direct-4598&tab_id=KAxYXjoatGc - GET - true - false - true - false - - - - - - - - - Host - ${KEYCLOAK_LOGIN_URL} - - - Connection - keep-alive - - - Cache-Control - max-age=0 - - - Upgrade-Insecure-Requests - 1 - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Accept - text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - navigate - - - Sec-Fetch-Dest - document - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - sec-ch-ua-mobile - ?0 - - - sec-ch-ua-platform - "Windows" - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - Cookie - AUTH_SESSION_ID=0e56ff7b-e277-400f-84f5-25801c43c829.ycloak-78b4c74bcf-kh476; AUTH_SESSION_ID_LEGACY=0e56ff7b-e277-400f-84f5-25801c43c829.ycloak-78b4c74bcf-kh476; KC_RESTART=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICIzMmI0MzNkNC02NjgwLTQxODMtOTc2Yy1kZDdjMTg0YjExMTQifQ.eyJjaWQiOiJvbi1yb3V0ZS1iYy1kaXJlY3QtNDU5OCIsInB0eSI6Im9wZW5pZC1jb25uZWN0IiwicnVyaSI6Imh0dHBzOi8vb25yb3V0ZWJjLXRlc3QtZnJvbnRlbmQuYXBwcy5zaWx2ZXIuZGV2b3BzLmdvdi5iYy5jYS8iLCJhY3QiOiJBVVRIRU5USUNBVEUiLCJub3RlcyI6eyJzY29wZSI6Im9wZW5pZCIsImlzcyI6Imh0dHBzOi8vdGVzdC5sb2dpbnByb3h5Lmdvdi5iYy5jYS9hdXRoL3JlYWxtcy9zdGFuZGFyZCIsInJlc3BvbnNlX3R5cGUiOiJjb2RlIiwiY29kZV9jaGFsbGVuZ2VfbWV0aG9kIjoiUzI1NiIsInJlZGlyZWN0X3VyaSI6Imh0dHBzOi8vb25yb3V0ZWJjLXRlc3QtZnJvbnRlbmQuYXBwcy5zaWx2ZXIuZGV2b3BzLmdvdi5iYy5jYS8iLCJzdGF0ZSI6IjdiZTBmNDk4ZGRmYTQ1ZTI4ZWU4ZjI0MTY0NzViYTQyIiwiY29kZV9jaGFsbGVuZ2UiOiJCNEpzelBjUzBIT1c3RUNUVFVVUkMxbXA2ejhhdDJiNkswbEQxdUtfMTFBIiwia2NfaWRwX2hpbnQiOiJiY2VpZGJvdGgiLCJyZXNwb25zZV9tb2RlIjoicXVlcnkifX0.2dLZTTjk8ZY0EFAaE88sAWQlfo7T17XcYLztnQwI_Yk; _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; FAILREASON=0; SMSESSION=Awk9KIrMNenX09Vl2cEMuy/VxV9CFVP4fsBzCp8Zo3AX2VsrDVWkOMVOdJyoY1Q1J9F8Vs8XFBtHTU29qS7+jlhEMK3f9j8tgudEVWHJq8LTizGhEj1cf8r7CX2QuxWMbdAHvK90hFnpocsL5xv2cAaFVdqhBKlIYkzwkY+r0YuH3Uh6DJVIhAhwjWeKfO6BAg5/jNFxQ31EPvzn4N7RxJK2bGyfAxzi6Cs6O7ieJ10MzcB8nWSIsO4ksfG8pzeGp9a+arl4maKnd9Je2L2FQohmiOjfGcrsezOgLgiWFl1B3+EL8ytArvtKhsFvr7WJsQuhYsQYzfY8shcfhNSltyqxLD422bDmU3NyZdhWY9313YG5I1U2vbO7zvXhxaCJYnpMrJR+inz8XsyqnGY1xu7AepY3pNd2wJH3twQJ42N6R2WlJVVN3oc3DvEHUbk85xrqHdwngd/FiMdEC2f5Kt51VYp8G/3R+sbFiy6Wt7wlZw2+/wI8EfxXs31HQ5q/RDUTXz6JMbzsR7EUOF+WkOrgi1nDugu13/O9hDnxPJnkzNGEfjt0xPxdhoDdl4vWdwRe1awBEn90SyJwc8+cFk1XACtvWoGwtPdf1xnHUwx5Ge1TqEd46xdjjlu+iTw2Xu5AsESUVVw81STsKA7vC8EBabQ+yXQHZlNFcFCKa1+AutNxfWHNQtnFK03kUCai4ZPJc/TQrhvf9DWjSyX+KknWdV6aQyz65KOpwtQWpd4ZlqAAKvf9vCQIBgk+YdsxFzAq6ySnLPcBLbFvP+Xyo5bcABg8IS9aJr6+05KT3ZOv49G1uYvz1ILaDED83D5NHF57ZswKR2911SevaqIO2i8NkZAJUMBpgroSejoJ1MxzpL/a7I26u6+p/08uMt/dT7vuo5OTTjayEtIlXy1IRXA/jU/uX/pKk1JrsZFhhwj7G5KEQpMAx+YvZUaaidqyfj3+fLb6+rsa8BukV8x0zfgUg20dm+Wu9XjDvyQHFP4Qt65CaUbhAKcVTgCChgTfSSdUJZIPPa5Yhzr7SmTuVGmYV/1cC4jGzNdSqr3Fq28fWukiEnRtqfZRXlOdA6xb - - - - - - - - - - false - - = - - - - - - - - https://${FRONTEND_API_URL}/?state=7be0f498ddfa45e28ee8f2416475ba42&session_state=0e56ff7b-e277-400f-84f5-25801c43c829&code=e1db6532-ce36-4aa5-845c-26c6d9f6e19f.0e56ff7b-e277-400f-84f5-25801c43c829.f462b30d-0893-4a2d-8169-3461d82c36eb - GET - true - false - true - false - - - - - - - - - Host - ${FRONTEND_API_URL} - - - Connection - keep-alive - - - Cache-Control - max-age=0 - - - Upgrade-Insecure-Requests - 1 - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Accept - text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - navigate - - - Sec-Fetch-Dest - document - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - sec-ch-ua-mobile - ?0 - - - sec-ch-ua-platform - "Windows" - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - Cookie - _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; FAILREASON=0; 9a75866e187615f9e3e688e8297548f9=1f5b60b83338df80ae3a11e1286008b7; SMSESSION=Awk9KIrMNenX09Vl2cEMuy/VxV9CFVP4fsBzCp8Zo3AX2VsrDVWkOMVOdJyoY1Q1J9F8Vs8XFBtHTU29qS7+jlhEMK3f9j8tgudEVWHJq8LTizGhEj1cf8r7CX2QuxWMbdAHvK90hFnpocsL5xv2cAaFVdqhBKlIYkzwkY+r0YuH3Uh6DJVIhAhwjWeKfO6BAg5/jNFxQ31EPvzn4N7RxJK2bGyfAxzi6Cs6O7ieJ10MzcB8nWSIsO4ksfG8pzeGp9a+arl4maKnd9Je2L2FQohmiOjfGcrsezOgLgiWFl1B3+EL8ytArvtKhsFvr7WJsQuhYsQYzfY8shcfhNSltyqxLD422bDmU3NyZdhWY9313YG5I1U2vbO7zvXhxaCJYnpMrJR+inz8XsyqnGY1xu7AepY3pNd2wJH3twQJ42N6R2WlJVVN3oc3DvEHUbk85xrqHdwngd/FiMdEC2f5Kt51VYp8G/3R+sbFiy6Wt7wlZw2+/wI8EfxXs31HQ5q/RDUTXz6JMbzsR7EUOF+WkOrgi1nDugu13/O9hDnxPJnkzNGEfjt0xPxdhoDdl4vWdwRe1awBEn90SyJwc8+cFk1XACtvWoGwtPdf1xnHUwx5Ge1TqEd46xdjjlu+iTw2Xu5AsESUVVw81STsKA7vC8EBabQ+yXQHZlNFcFCKa1+AutNxfWHNQtnFK03kUCai4ZPJc/TQrhvf9DWjSyX+KknWdV6aQyz65KOpwtQWpd4ZlqAAKvf9vCQIBgk+YdsxFzAq6ySnLPcBLbFvP+Xyo5bcABg8IS9aJr6+05KT3ZOv49G1uYvz1ILaDED83D5NHF57ZswKR2911SevaqIO2i8NkZAJUMBpgroSejoJ1MxzpL/a7I26u6+p/08uMt/dT7vuo5OTTjayEtIlXy1IRXA/jU/uX/pKk1JrsZFhhwj7G5KEQpMAx+YvZUaaidqyfj3+fLb6+rsa8BukV8x0zfgUg20dm+Wu9XjDvyQHFP4Qt65CaUbhAKcVTgCChgTfSSdUJZIPPa5Yhzr7SmTuVGmYV/1cC4jGzNdSqr3Fq28fWukiEnRtqfZRXlOdA6xb - - - - - - - - - - false - - = - - - - - - - - https://${KEYCLOAK_LOGIN_URL}/auth/realms/standard/.well-known/openid-configuration - GET - true - false - true - false - - - - - - - - - Host - ${KEYCLOAK_LOGIN_URL} - - - Connection - keep-alive - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - Accept - application/jwk-set+json, application/json - - - sec-ch-ua-mobile - ?0 - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - sec-ch-ua-platform - "Windows" - - - Origin - https://${FRONTEND_API_URL} - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - cors - - - Sec-Fetch-Dest - empty - - - Referer - https://${FRONTEND_API_URL}/ - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - - - - - - - - false - - = - - - - - - - - https://${VEHICLES_API_URL}/users/user-context - OPTIONS - true - false - true - false - - - - - - - - - Host - ${VEHICLES_API_URL} - - - Connection - keep-alive - - - Accept - */* - - - Access-Control-Request-Method - POST - - - Access-Control-Request-Headers - authorization,content-type - - - Origin - https://${FRONTEND_API_URL} - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Sec-Fetch-Mode - cors - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Dest - empty - - - Referer - https://${FRONTEND_API_URL}/ - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - - - - - true - - - - false - {} - = - - - - - - - - https://${VEHICLES_API_URL}/users/user-context - POST - true - false - true - false - - - - - - - - - Host - ${VEHICLES_API_URL} - - - Connection - keep-alive - - - Content-Length - 2 - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - Accept - application/json, text/plain, */* - - - Content-Type - application/json - - - sec-ch-ua-mobile - ?0 - - - Authorization - Bearer ${BEARER_TOKEN} - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - sec-ch-ua-platform - "Windows" - - - Origin - https://${FRONTEND_API_URL} - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - cors - - - Sec-Fetch-Dest - empty - - - Referer - https://${FRONTEND_API_URL}/ - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - - - - - - - - false - - = - - - - - - - - https://${VEHICLES_API_URL}/users/roles?companyId=102 - OPTIONS - true - false - true - false - - - - - - - - - Host - ${VEHICLES_API_URL} - - - Connection - keep-alive - - - Accept - */* - - - Access-Control-Request-Method - GET - - - Access-Control-Request-Headers - authorization - - - Origin - https://${FRONTEND_API_URL} - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Sec-Fetch-Mode - cors - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Dest - empty - - - Referer - https://${FRONTEND_API_URL}/ - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - - - - - - - - false - - = - - - - - - - - https://${VEHICLES_API_URL}/users/roles?companyId=102 - GET - true - false - true - false - - - - - - - - - Host - ${VEHICLES_API_URL} - - - Connection - keep-alive - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - Accept - application/json, text/plain, */* - - - sec-ch-ua-mobile - ?0 - - - Authorization - Bearer ${BEARER_TOKEN} - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - sec-ch-ua-platform - "Windows" - - - Origin - https://${FRONTEND_API_URL} - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - cors - - - Sec-Fetch-Dest - empty - - - Referer - https://${FRONTEND_API_URL}/ - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - If-None-Match - W/"1b4-DdYKGtaFZ5+U7pxjw6uu3owPOfo" - - - - - - - - - - false - - = - - - - - - - - https://${VEHICLES_API_URL}/permits/applications?status=IN_PROGRESS&companyId=102&userGUID=A9ED2C5742DC455998672CC2A118174B - OPTIONS - true - false - true - false - - - - - - - - - Host - ${VEHICLES_API_URL} - - - Connection - keep-alive - - - Accept - */* - - - Access-Control-Request-Method - GET - - - Access-Control-Request-Headers - authorization - - - Origin - https://${FRONTEND_API_URL} - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Sec-Fetch-Mode - cors - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Dest - empty - - - Referer - https://${FRONTEND_API_URL}/ - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - - - - - - - - false - - = - true - - - - - - - - https://${VEHICLES_API_URL}/permits/applications?status=IN_PROGRESS&companyId=102&userGUID=A9ED2C5742DC455998672CC2A118174B - GET - true - false - true - false - - - - - - - - - Host - ${VEHICLES_API_URL} - - - Connection - keep-alive - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - Accept - application/json, text/plain, */* - - - sec-ch-ua-mobile - ?0 - - - Authorization - Bearer ${BEARER_TOKEN} - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - sec-ch-ua-platform - "Windows" - - - Origin - https://${FRONTEND_API_URL} - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - cors - - - Sec-Fetch-Dest - empty - - - Referer - https://${FRONTEND_API_URL}/ - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - If-None-Match - W/"17b2-OQs45yY+9rxT8oaE549bg+d9IqA" - - - - - - - - - - - - - - https://${VEHICLES_API_URL}/users/roles?companyId=102 - GET - true - false - true - false - - - - - - - - - Host - ${VEHICLES_API_URL} - - - Connection - keep-alive - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - Accept - application/json - - - sec-ch-ua-mobile - ?0 - - - Authorization - Bearer ${BEARER_TOKEN} - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - sec-ch-ua-platform - "Windows" - - - Origin - https://${FRONTEND_API_URL} - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - cors - - - Sec-Fetch-Dest - empty - - - Referer - https://${FRONTEND_API_URL}/ - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - If-None-Match - W/"17b2-OQs45yY+9rxT8oaE549bg+d9IqA" - - - - - - - - Authorization - Bearer ${BEARER_TOKEN} - - - Accept - */* - - - - - - - - - - false - - = - true - - - - - - - - https://${VEHICLES_API_URL}/permits/applications?companyId=102&status=IN_PROGRESS - GET - true - false - true - false - - - - - - - - - Host - ${VEHICLES_API_URL} - - - Connection - keep-alive - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - Accept - application/json - - - sec-ch-ua-mobile - ?0 - - - Authorization - Bearer ${BEARER_TOKEN} - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - sec-ch-ua-platform - "Windows" - - - Origin - https://${FRONTEND_API_URL} - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - cors - - - Sec-Fetch-Dest - empty - - - Referer - https://${FRONTEND_API_URL}/ - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - If-None-Match - W/"17b2-OQs45yY+9rxT8oaE549bg+d9IqA" - - - - - - - - Authorization - Bearer ${BEARER_TOKEN} - - - Accept - */* - - - - - - - - - - false - - = - true - - - - - - - - https://${VEHICLES_API_URL}/permits/applications/20?companyId=102 - GET - true - false - true - false - - - - - - - - - Host - ${VEHICLES_API_URL} - - - Connection - keep-alive - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - Accept - application/json - - - sec-ch-ua-mobile - ?0 - - - Authorization - Bearer ${BEARER_TOKEN} - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - sec-ch-ua-platform - "Windows" - - - Origin - https://${FRONTEND_API_URL} - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - cors - - - Sec-Fetch-Dest - empty - - - Referer - https://${FRONTEND_API_URL}/ - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - If-None-Match - W/"17b2-OQs45yY+9rxT8oaE549bg+d9IqA" - - - - - - - - Authorization - Bearer ${BEARER_TOKEN} - - - Accept - */* - - - - - - - true - - - - false - { - "companyId": 102, - "userGuid": "06267945F2EB4E31B585932F78B76269", - "permitType": "TROS", - "permitStatus": "IN_PROGRESS", - "permitApplicationOrigin": "ONLINE", - "permitData": {} -} - = - - - - - - - - https://${VEHICLES_API_URL}/permits/applications/A2-00010002-520-R00 - PUT - true - false - true - false - - - - - - - - - Authorization - Bearer ${BEARER_TOKEN} - - - Accept - application/json - - - Content-Type - application/json - - - - - - - - Host - ${VEHICLES_API_URL} - - - Connection - keep-alive - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - Accept - application/json - - - sec-ch-ua-mobile - ?0 - - - Authorization - Bearer ${BEARER_TOKEN} - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - sec-ch-ua-platform - "Windows" - - - Origin - https://${FRONTEND_API_URL} - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - cors - - - Sec-Fetch-Dest - empty - - - Referer - https://${FRONTEND_API_URL}/ - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - If-None-Match - W/"17b2-OQs45yY+9rxT8oaE549bg+d9IqA" - - - - - - - - - - false - - = - true - - - - - - - - https://${VEHICLES_API_URL}/permits/applications/20?companyId=102 - GET - true - false - true - false - - - - - - - - - Host - ${VEHICLES_API_URL} - - - Connection - keep-alive - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - Accept - application/json - - - sec-ch-ua-mobile - ?0 - - - Authorization - Bearer ${BEARER_TOKEN} - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - sec-ch-ua-platform - "Windows" - - - Origin - https://${FRONTEND_API_URL} - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - cors - - - Sec-Fetch-Dest - empty - - - Referer - https://${FRONTEND_API_URL}/ - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - If-None-Match - W/"17b2-OQs45yY+9rxT8oaE549bg+d9IqA" - - - - - - - - Authorization - Bearer ${BEARER_TOKEN} - - - Accept - */* - - - - - - - true - - - - false - { - "companyId": 102, - "userGuid": "06267945F2EB4E31B585932F78B76269", - "permitType": "TROS", - "permitStatus": "IN_PROGRESS", - "permitApplicationOrigin": "ONLINE", - "permitData": {} -} - = - - - - - - - - https://${VEHICLES_API_URL}/permits/applications/A2-00010002-520-R00 - PUT - true - false - true - false - - - - - - - - - Authorization - Bearer ${BEARER_TOKEN} - - - Accept - application/json - - - Content-Type - application/json - - - - - - - - Host - ${VEHICLES_API_URL} - - - Connection - keep-alive - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - Accept - application/json - - - sec-ch-ua-mobile - ?0 - - - Authorization - Bearer ${BEARER_TOKEN} - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - sec-ch-ua-platform - "Windows" - - - Origin - https://${FRONTEND_API_URL} - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - cors - - - Sec-Fetch-Dest - empty - - - Referer - https://${FRONTEND_API_URL}/ - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - If-None-Match - W/"17b2-OQs45yY+9rxT8oaE549bg+d9IqA" - - - - - - - - continue - - false - 1 - - 1 - ${__P(rampup,300)} - 1365261073000 - 1365261073000 - true - ${__P(duration,3000)} - - true - - - - ${__P(Delay,10000)} - - - - - - - false - - = - true - - - - - - - - https://${FRONTEND_API_URL}/ - GET - true - false - true - false - - - - - - - - - Host - ${FRONTEND_API_URL} - - - Connection - keep-alive - - - Cache-Control - max-age=0 - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - sec-ch-ua-mobile - ?0 - - - sec-ch-ua-platform - "Windows" - - - Upgrade-Insecure-Requests - 1 - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Accept - text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 - - - Sec-Fetch-Site - same-origin - - - Sec-Fetch-Mode - navigate - - - Sec-Fetch-User - ?1 - - - Sec-Fetch-Dest - document - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - Cookie - _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; FAILREASON=0; 9a75866e187615f9e3e688e8297548f9=1f5b60b83338df80ae3a11e1286008b7; SMSESSION=LOGGEDOFF - - - If-None-Match - W/"653ca247-308" - - - If-Modified-Since - Sat, 28 Oct 2023 05:55:19 GMT - - - - - - - - - - false - - = - true - - - - - - - - https://${KEYCLOAK_LOGIN_URL}/auth/realms/standard/.well-known/openid-configuration - GET - true - false - true - false - - - - - - - - - Host - ${KEYCLOAK_LOGIN_URL} - - - Connection - keep-alive - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - Accept - application/jwk-set+json, application/json - - - sec-ch-ua-mobile - ?0 - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - sec-ch-ua-platform - "Windows" - - - Origin - https://${FRONTEND_API_URL} - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - cors - - - Sec-Fetch-Dest - empty - - - Referer - https://${FRONTEND_API_URL}/ - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - - - - - - - - false - - = - true - - - - - - - - https://${KEYCLOAK_LOGIN_URL}/auth/realms/standard/protocol/openid-connect/auth?client_id=on-route-bc-direct-4598&redirect_uri=https%3A%2F%2F${FRONTEND_API_URL}%2F&response_type=code&scope=openid&state=7be0f498ddfa45e28ee8f2416475ba42&code_challenge=B4JszPcS0HOW7ECTTUURC1mp6z8at2b6K0lD1uK_11A&code_challenge_method=S256&response_mode=query&kc_idp_hint=bceidboth - GET - true - false - true - false - - - - - - - - - Host - ${KEYCLOAK_LOGIN_URL} - - - Connection - keep-alive - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - sec-ch-ua-mobile - ?0 - - - sec-ch-ua-platform - "Windows" - - - Upgrade-Insecure-Requests - 1 - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Accept - text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - navigate - - - Sec-Fetch-User - ?1 - - - Sec-Fetch-Dest - document - - - Referer - https://${FRONTEND_API_URL}/ - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - Cookie - AUTH_SESSION_ID=2e364c60-0ead-4ec1-98fb-0e1bba001f08.ycloak-78b4c74bcf-vtmwp; AUTH_SESSION_ID_LEGACY=2e364c60-0ead-4ec1-98fb-0e1bba001f08.ycloak-78b4c74bcf-vtmwp; _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; FAILREASON=0; SMSESSION=LOGGEDOFF - - - - - - - - - - false - - = - true - - - - - - - - https://${KEYCLOAK_LOGIN_URL}/auth/realms/standard/broker/bceidboth/login?session_code=5b_D1WNhNIzE-FZe70dEmhs_J2mpDyFSyQzWPAxnjYc&client_id=on-route-bc-direct-4598&tab_id=KAxYXjoatGc - GET - true - false - true - false - - - - - - - - - Host - ${KEYCLOAK_LOGIN_URL} - - - Connection - keep-alive - - - Upgrade-Insecure-Requests - 1 - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Accept - text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - navigate - - - Sec-Fetch-User - ?1 - - - Sec-Fetch-Dest - document - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - sec-ch-ua-mobile - ?0 - - - sec-ch-ua-platform - "Windows" - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - Cookie - AUTH_SESSION_ID=0e56ff7b-e277-400f-84f5-25801c43c829.ycloak-78b4c74bcf-kh476; AUTH_SESSION_ID_LEGACY=0e56ff7b-e277-400f-84f5-25801c43c829.ycloak-78b4c74bcf-kh476; KC_RESTART=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICIzMmI0MzNkNC02NjgwLTQxODMtOTc2Yy1kZDdjMTg0YjExMTQifQ.eyJjaWQiOiJvbi1yb3V0ZS1iYy1kaXJlY3QtNDU5OCIsInB0eSI6Im9wZW5pZC1jb25uZWN0IiwicnVyaSI6Imh0dHBzOi8vb25yb3V0ZWJjLXRlc3QtZnJvbnRlbmQuYXBwcy5zaWx2ZXIuZGV2b3BzLmdvdi5iYy5jYS8iLCJhY3QiOiJBVVRIRU5USUNBVEUiLCJub3RlcyI6eyJzY29wZSI6Im9wZW5pZCIsImlzcyI6Imh0dHBzOi8vdGVzdC5sb2dpbnByb3h5Lmdvdi5iYy5jYS9hdXRoL3JlYWxtcy9zdGFuZGFyZCIsInJlc3BvbnNlX3R5cGUiOiJjb2RlIiwiY29kZV9jaGFsbGVuZ2VfbWV0aG9kIjoiUzI1NiIsInJlZGlyZWN0X3VyaSI6Imh0dHBzOi8vb25yb3V0ZWJjLXRlc3QtZnJvbnRlbmQuYXBwcy5zaWx2ZXIuZGV2b3BzLmdvdi5iYy5jYS8iLCJzdGF0ZSI6IjdiZTBmNDk4ZGRmYTQ1ZTI4ZWU4ZjI0MTY0NzViYTQyIiwiY29kZV9jaGFsbGVuZ2UiOiJCNEpzelBjUzBIT1c3RUNUVFVVUkMxbXA2ejhhdDJiNkswbEQxdUtfMTFBIiwia2NfaWRwX2hpbnQiOiJiY2VpZGJvdGgiLCJyZXNwb25zZV9tb2RlIjoicXVlcnkifX0.2dLZTTjk8ZY0EFAaE88sAWQlfo7T17XcYLztnQwI_Yk; _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; FAILREASON=0; SMSESSION=LOGGEDOFF - - - - - - - - - - false - - = - true - - - - - - - - https://${KEYCLOAK_LOGIN_URL}/auth/realms/bceidboth/protocol/openid-connect/auth?scope=openid&state=JvIyfmoj0AzmBZWw0ZS8lBmhMJXd7lA_uAR8JQvLNlE.KAxYXjoatGc.on-route-bc-direct-4598&response_type=code&client_id=standard-realm&redirect_uri=https%3A%2F%2F${KEYCLOAK_LOGIN_URL}%2Fauth%2Frealms%2Fstandard%2Fbroker%2Fbceidboth%2Fendpoint&nonce=1sKWmdZ0aV6QIscb65Lrmg - GET - true - false - true - false - - - - - - - - - Host - ${KEYCLOAK_LOGIN_URL} - - - Connection - keep-alive - - - Upgrade-Insecure-Requests - 1 - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Accept - text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - navigate - - - Sec-Fetch-User - ?1 - - - Sec-Fetch-Dest - document - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - sec-ch-ua-mobile - ?0 - - - sec-ch-ua-platform - "Windows" - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - Cookie - AUTH_SESSION_ID=33769057-e4e2-49e9-821b-bab26d4e7507.ycloak-78b4c74bcf-gj9d6; AUTH_SESSION_ID_LEGACY=33769057-e4e2-49e9-821b-bab26d4e7507.ycloak-78b4c74bcf-gj9d6; KEYCLOAK_IDENTITY=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI1ZjExNjBiNS03Y2RjLTQ5NGQtYmFkOS0yZGRkNjU3MDU5Y2UifQ.eyJleHAiOjE2OTg3MzE3MzQsImlhdCI6MTY5ODY5NTczNCwianRpIjoiNzY3ZDEzMGEtMzczMC00NDdhLWEzNTUtNjhhNDhiMjgzZTI3IiwiaXNzIjoiaHR0cHM6Ly90ZXN0LmxvZ2lucHJveHkuZ292LmJjLmNhL2F1dGgvcmVhbG1zL2JjZWlkYm90aCIsInN1YiI6ImQ3M2FiN2IwLWUyMmEtNDg0NC04Yzc3LWU3YTQ2ODQyOTNmZCIsInR5cCI6IlNlcmlhbGl6ZWQtSUQiLCJzZXNzaW9uX3N0YXRlIjoiMzM3NjkwNTctZTRlMi00OWU5LTgyMWItYmFiMjZkNGU3NTA3Iiwic2lkIjoiMzM3NjkwNTctZTRlMi00OWU5LTgyMWItYmFiMjZkNGU3NTA3Iiwic3RhdGVfY2hlY2tlciI6Ik9SWEI4amY3Q3hPUWhzTUNhWU5nMHF2WHNzZG52cnlxUHFjMnFpUkthZncifQ.1kpL3Qpg4pyqSLBE0iDz7WZ0fdGzCCf6RCiN6HvFWqE; KEYCLOAK_IDENTITY_LEGACY=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI1ZjExNjBiNS03Y2RjLTQ5NGQtYmFkOS0yZGRkNjU3MDU5Y2UifQ.eyJleHAiOjE2OTg3MzE3MzQsImlhdCI6MTY5ODY5NTczNCwianRpIjoiNzY3ZDEzMGEtMzczMC00NDdhLWEzNTUtNjhhNDhiMjgzZTI3IiwiaXNzIjoiaHR0cHM6Ly90ZXN0LmxvZ2lucHJveHkuZ292LmJjLmNhL2F1dGgvcmVhbG1zL2JjZWlkYm90aCIsInN1YiI6ImQ3M2FiN2IwLWUyMmEtNDg0NC04Yzc3LWU3YTQ2ODQyOTNmZCIsInR5cCI6IlNlcmlhbGl6ZWQtSUQiLCJzZXNzaW9uX3N0YXRlIjoiMzM3NjkwNTctZTRlMi00OWU5LTgyMWItYmFiMjZkNGU3NTA3Iiwic2lkIjoiMzM3NjkwNTctZTRlMi00OWU5LTgyMWItYmFiMjZkNGU3NTA3Iiwic3RhdGVfY2hlY2tlciI6Ik9SWEI4amY3Q3hPUWhzTUNhWU5nMHF2WHNzZG52cnlxUHFjMnFpUkthZncifQ.1kpL3Qpg4pyqSLBE0iDz7WZ0fdGzCCf6RCiN6HvFWqE; KEYCLOAK_SESSION=bceidboth/d73ab7b0-e22a-4844-8c77-e7a4684293fd/33769057-e4e2-49e9-821b-bab26d4e7507; KEYCLOAK_SESSION_LEGACY=bceidboth/d73ab7b0-e22a-4844-8c77-e7a4684293fd/33769057-e4e2-49e9-821b-bab26d4e7507; _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; FAILREASON=0; SMSESSION=LOGGEDOFF - - - - - - - - - - false - - = - true - - - - - - - - https://${KEYCLOAK_LOGIN_URL}/auth/realms/bceidboth/broker/bceidboth/login?session_code=oRr0p7JZ9oL7vptnFPfNKhf_nrB8DND1rBojsNPjot0&client_id=standard-realm&tab_id=k5Vw5BDlfVQ - GET - true - false - true - false - - - - - - - - - Host - ${KEYCLOAK_LOGIN_URL} - - - Connection - keep-alive - - - Upgrade-Insecure-Requests - 1 - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Accept - text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - navigate - - - Sec-Fetch-User - ?1 - - - Sec-Fetch-Dest - document - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - sec-ch-ua-mobile - ?0 - - - sec-ch-ua-platform - "Windows" - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - Cookie - AUTH_SESSION_ID=f26f78a0-28d2-40b4-9e57-b83fa590e32e.ycloak-78b4c74bcf-vtmwp; AUTH_SESSION_ID_LEGACY=f26f78a0-28d2-40b4-9e57-b83fa590e32e.ycloak-78b4c74bcf-vtmwp; KC_RESTART=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI1ZjExNjBiNS03Y2RjLTQ5NGQtYmFkOS0yZGRkNjU3MDU5Y2UifQ.eyJjaWQiOiJzdGFuZGFyZC1yZWFsbSIsInB0eSI6Im9wZW5pZC1jb25uZWN0IiwicnVyaSI6Imh0dHBzOi8vdGVzdC5sb2dpbnByb3h5Lmdvdi5iYy5jYS9hdXRoL3JlYWxtcy9zdGFuZGFyZC9icm9rZXIvYmNlaWRib3RoL2VuZHBvaW50IiwiYWN0IjoiQVVUSEVOVElDQVRFIiwibm90ZXMiOnsic2NvcGUiOiJvcGVuaWQiLCJpc3MiOiJodHRwczovL3Rlc3QubG9naW5wcm94eS5nb3YuYmMuY2EvYXV0aC9yZWFsbXMvYmNlaWRib3RoIiwicmVzcG9uc2VfdHlwZSI6ImNvZGUiLCJyZWRpcmVjdF91cmkiOiJodHRwczovL3Rlc3QubG9naW5wcm94eS5nb3YuYmMuY2EvYXV0aC9yZWFsbXMvc3RhbmRhcmQvYnJva2VyL2JjZWlkYm90aC9lbmRwb2ludCIsInN0YXRlIjoiSnZJeWZtb2owQXptQlpXdzBaUzhsQm1oTUpYZDdsQV91QVI4SlF2TE5sRS5LQXhZWGpvYXRHYy5vbi1yb3V0ZS1iYy1kaXJlY3QtNDU5OCIsIm5vbmNlIjoiMXNLV21kWjBhVjZRSXNjYjY1THJtZyJ9fQ.08S_Qi57kTkuLj_eH5VElw2zeuH4AVhfOUois5IUzEI; _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; FAILREASON=0; SMSESSION=LOGGEDOFF - - - - - - - - - - false - - = - true - - - - - - - - https://${SITEMINDER_URL}/clp-cgi/capBceid/logon.cgi?flags=0101:0,7&TYPE=33554433&REALMOID=06-b02c7ed2-895e-4953-bd03-8008c64ec906&GUID=&SMAUTHREASON=0&METHOD=GET&SMAGENTNAME=$SM$Lk6VtkyHw8x3zQIIsMiOiEXYFJF%2fJzjVT7eioCjxBjJck5VMlbxxrR%2bLZSo%2flIBX&TARGET=$SM$HTTPS%3a%2f%2fsfstest7%2egov%2ebc%2eca%2faffwebservices%2fredirectjsp%2ftestkeycloak-basicbusinessbceid%2fredirect%2ejsp%3fSMPORTALURL%3dhttps$%3A$%2F$%2Fsfstest7%2egov%2ebc%2eca$%2Faffwebservices$%2Fpublic$%2Fsaml2sso%26SAMLTRANSACTIONID%3dc9f189ad-7324de1b-2e045e1a-e8bcf162-a78af00c-c5 - GET - true - false - true - false - - - - - - - - - Host - ${SITEMINDER_URL} - - - Connection - keep-alive - - - Cache-Control - max-age=0 - - - Upgrade-Insecure-Requests - 1 - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Accept - text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - navigate - - - Sec-Fetch-Dest - document - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - sec-ch-ua-mobile - ?0 - - - sec-ch-ua-platform - "Windows" - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - Cookie - _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; Dummy1=DummyVal1; BCGOVFlags=0101%3A0%2C7; BCGOVCustom=NULL; BCGOVBrand=NULL; BCGOVBehavior=NULL; Dummy2=DummyVal2; preDummy1=DummyVal1; preDummy2=DummyVal2; preDummy3=DummyVal3; BCGOVDoNotShow=1; preDummy4=DummyVal4; FAILREASON=0; BCGOVTarget=HTTPS%3A%2F%2Fsfstest7.gov.bc.ca%2Faffwebservices%2Fredirectjsp%2Ftestkeycloak-basicbusinessbceid%2Fredirect.jsp%3FSMPORTALURL%3Dhttps%253A%252F%252Fsfstest7.gov.bc.ca%252Faffwebservices%252Fpublic%252Fsaml2sso%26SAMLTRANSACTIONID%3Df7917115-57286b4a-df9cf6ff-b50e2f11-c566ac5a-f6; BCGOVclptryno=0; clp001=0; SMSESSION=LOGGEDOFF; SMFED_OLD_SESSION=""; SMFED_OLD_IDENTITY=""; GUID=1:26feb557-62af2c8c-4ef3a8d7-2e2277be-6a76895c-697 - - - - - - - true - - - - false - instance=instance_capBceid&user=ORBCTST3&password=orbcTST%2B2023 - = - - - - - - - - https://${SITEMINDER_URL}/clp-cgi/preLogon.cgi - POST - true - false - true - false - - - - - - - - - Host - ${SITEMINDER_URL} - - - Connection - keep-alive - - - Content-Length - 64 - - - Cache-Control - max-age=0 - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - sec-ch-ua-mobile - ?0 - - - sec-ch-ua-platform - "Windows" - - - Upgrade-Insecure-Requests - 1 - - - Origin - https://${SITEMINDER_URL} - - - Content-Type - application/x-www-form-urlencoded - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Accept - text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 - - - Sec-Fetch-Site - same-origin - - - Sec-Fetch-Mode - navigate - - - Sec-Fetch-User - ?1 - - - Sec-Fetch-Dest - document - - - Referer - https://${SITEMINDER_URL}/clp-cgi/capBceid/logon.cgi?flags=0101:0,7&TYPE=33554433&REALMOID=06-b02c7ed2-895e-4953-bd03-8008c64ec906&GUID=&SMAUTHREASON=0&METHOD=GET&SMAGENTNAME=$SM$Lk6VtkyHw8x3zQIIsMiOiEXYFJF%2fJzjVT7eioCjxBjJck5VMlbxxrR%2bLZSo%2flIBX&TARGET=$SM$HTTPS%3a%2f%2fsfstest7%2egov%2ebc%2eca%2faffwebservices%2fredirectjsp%2ftestkeycloak-basicbusinessbceid%2fredirect%2ejsp%3fSMPORTALURL%3dhttps$%3A$%2F$%2Fsfstest7%2egov%2ebc%2eca$%2Faffwebservices$%2Fpublic$%2Fsaml2sso%26SAMLTRANSACTIONID%3dc9f189ad-7324de1b-2e045e1a-e8bcf162-a78af00c-c5 - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - Cookie - _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; Dummy1=DummyVal1; BCGOVFlags=0101%3A0%2C7; BCGOVCustom=NULL; BCGOVBrand=NULL; BCGOVBehavior=NULL; Dummy2=DummyVal2; preDummy1=DummyVal1; preDummy2=DummyVal2; preDummy3=DummyVal3; BCGOVDoNotShow=1; preDummy4=DummyVal4; FAILREASON=0; clp001=0; SMSESSION=LOGGEDOFF; SMFED_OLD_SESSION=""; SMFED_OLD_IDENTITY=""; GUID=1:26feb557-62af2c8c-4ef3a8d7-2e2277be-6a76895c-697; BCGOVTarget=HTTPS%3A%2F%2Fsfstest7.gov.bc.ca%2Faffwebservices%2Fredirectjsp%2Ftestkeycloak-basicbusinessbceid%2Fredirect.jsp%3FSMPORTALURL%3Dhttps%253A%252F%252Fsfstest7.gov.bc.ca%252Faffwebservices%252Fpublic%252Fsaml2sso%26SAMLTRANSACTIONID%3Dc9f189ad-7324de1b-2e045e1a-e8bcf162-a78af00c-c5; BCGOVclptryno=1 - - - - - - - true - - - - false - SMENC=ISO-8859-1&SMLOCALE=US-EN&target=%2Fclp-cgi%2Fcap07%2Fprivate%2FpostLogon.cgi&smauthreason=0&smagentname=&user=ORBCTST3&password=orbcTST%2B2023 - = - - - - - - - - https://${SITEMINDER_URL}/clp-cgi/cap07/logon.fcc - POST - true - false - true - false - - - - - - - - - Host - ${SITEMINDER_URL} - - - Connection - keep-alive - - - Content-Length - 149 - - - Cache-Control - max-age=0 - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - sec-ch-ua-mobile - ?0 - - - sec-ch-ua-platform - "Windows" - - - Upgrade-Insecure-Requests - 1 - - - Origin - https://${SITEMINDER_URL} - - - Content-Type - application/x-www-form-urlencoded - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Accept - text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 - - - Sec-Fetch-Site - same-origin - - - Sec-Fetch-Mode - navigate - - - Sec-Fetch-Dest - document - - - Referer - https://${SITEMINDER_URL}/clp-cgi/preLogon.cgi - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - Cookie - _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; Dummy1=DummyVal1; BCGOVFlags=0101%3A0%2C7; BCGOVCustom=NULL; BCGOVBrand=NULL; BCGOVBehavior=NULL; Dummy2=DummyVal2; preDummy1=DummyVal1; preDummy2=DummyVal2; preDummy3=DummyVal3; BCGOVDoNotShow=1; preDummy4=DummyVal4; FAILREASON=0; SMSESSION=LOGGEDOFF; SMFED_OLD_SESSION=""; SMFED_OLD_IDENTITY=""; GUID=1:26feb557-62af2c8c-4ef3a8d7-2e2277be-6a76895c-697; BCGOVTarget=HTTPS%3A%2F%2Fsfstest7.gov.bc.ca%2Faffwebservices%2Fredirectjsp%2Ftestkeycloak-basicbusinessbceid%2Fredirect.jsp%3FSMPORTALURL%3Dhttps%253A%252F%252Fsfstest7.gov.bc.ca%252Faffwebservices%252Fpublic%252Fsaml2sso%26SAMLTRANSACTIONID%3Dc9f189ad-7324de1b-2e045e1a-e8bcf162-a78af00c-c5; BCGOVclptryno=1; clp001=Salted__%8E%F5%14%93%F3.%C8%8C%C2%B3%84%8B%8EC%E0%88%AAK%01%C77%B6%C4g%C3%D2%3ELS%06%7CdJp%18%E9TJ%8A%D3a%A9%AD%3C%5E%DBZ%D7 - - - - - - - - - - false - - = - - - - - - - - https://${SITEMINDER_URL}/clp-cgi/cap07/private/postLogon.cgi - GET - true - false - true - false - - - - - - - - - Host - ${SITEMINDER_URL} - - - Connection - keep-alive - - - Cache-Control - max-age=0 - - - Upgrade-Insecure-Requests - 1 - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Accept - text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 - - - Sec-Fetch-Site - same-origin - - - Sec-Fetch-Mode - navigate - - - Sec-Fetch-Dest - document - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - sec-ch-ua-mobile - ?0 - - - sec-ch-ua-platform - "Windows" - - - Referer - https://${SITEMINDER_URL}/clp-cgi/preLogon.cgi - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - Cookie - _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; Dummy1=DummyVal1; BCGOVFlags=0101%3A0%2C7; BCGOVCustom=NULL; BCGOVBrand=NULL; BCGOVBehavior=NULL; Dummy2=DummyVal2; preDummy1=DummyVal1; preDummy2=DummyVal2; preDummy3=DummyVal3; BCGOVDoNotShow=1; preDummy4=DummyVal4; FAILREASON=0; SMSESSION=LOGGEDOFF; SMFED_OLD_SESSION=""; SMFED_OLD_IDENTITY=""; GUID=1:26feb557-62af2c8c-4ef3a8d7-2e2277be-6a76895c-697; BCGOVTarget=HTTPS%3A%2F%2Fsfstest7.gov.bc.ca%2Faffwebservices%2Fredirectjsp%2Ftestkeycloak-basicbusinessbceid%2Fredirect.jsp%3FSMPORTALURL%3Dhttps%253A%252F%252Fsfstest7.gov.bc.ca%252Faffwebservices%252Fpublic%252Fsaml2sso%26SAMLTRANSACTIONID%3Dc9f189ad-7324de1b-2e045e1a-e8bcf162-a78af00c-c5; BCGOVclptryno=1; clp001=Salted__%8E%F5%14%93%F3.%C8%8C%C2%B3%84%8B%8EC%E0%88%AAK%01%C77%B6%C4g%C3%D2%3ELS%06%7CdJp%18%E9TJ%8A%D3a%A9%AD%3C%5E%DBZ%D7; FORMCRED=2ZS4S2F4tb41FWGyAD293ZV3eiMsCRYZ+ktOitYzjWY/fG/2BFtCWHSnbkvgJfBEm8aTuwAg3nMfeG0h8ahL0C1Q+SZp1d30x/imUNpQkjqP7yK+smpXGQMNWzNb15A+UXcYa0yUQLQ5rFoH720FIoiqZ4Nmikk7a67vktQxd8rpIduHeZJ7tAYb/b+pXPha - - - - - - - true - - - - false - RelayState=pkQKGHDSoVdRPpUZ1XHJWrVAUBtEl2EOcIu2bUhv0V0.k5Vw5BDlfVQ.standard-realm&SAMLResponse=PG5zNTpSZXNwb25zZSB4bWxuczpuczU9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpwcm90b2NvbCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDkveG1sZW5jMTEjIiB4bWxuczpuczI9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphc3NlcnRpb24iIHhtbG5zOm5zMz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyIgeG1sbnM6bnM0PSJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzA0L3htbGVuYyMiIERlc3RpbmF0aW9uPSJodHRwczovL3Rlc3QubG9naW5wcm94eS5nb3YuYmMuY2EvYXV0aC9yZWFsbXMvYmNlaWRib3RoL2Jyb2tlci9iY2VpZGJvdGgvZW5kcG9pbnQiIElEPSJfMzU0NWZlNjJmOGY3OThhNTk1ZWNlM2I2YzYxM2RmNmU5ZWFkIiBJblJlc3BvbnNlVG89IklEX2FhYTM1M2Q0LTdlNmMtNDQxNS05N2FkLWI2NmEzM2FhOTBkYyIgSXNzdWVJbnN0YW50PSIyMDIzLTEwLTMwVDE5OjU2OjM3LjE4MFoiIFZlcnNpb249IjIuMCI%2BDQogICAgPG5zMjpJc3N1ZXIgRm9ybWF0PSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6bmFtZWlkLWZvcm1hdDplbnRpdHkiPmh0dHBzOi8vdGVzdC5sb2dpbnByb3h5Lmdvdi5iYy5jYS9hdXRoL3JlYWxtcy9fYmNlaWRiYXNpY2J1c2luZXNzMS88L25zMjpJc3N1ZXI%2BDQogICAgPG5zNTpTdGF0dXM%2BDQogICAgICAgIDxuczU6U3RhdHVzQ29kZSBWYWx1ZT0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOnN0YXR1czpTdWNjZXNzIi8%2BDQogICAgPC9uczU6U3RhdHVzPg0KICAgIDxuczI6QXNzZXJ0aW9uIElEPSJfZWFmZTRjYWQ5MjU0MTEyZjQ5YTcxMDI1MGM3YjVhNDVjYmI2IiBJc3N1ZUluc3RhbnQ9IjIwMjMtMTAtMzBUMTk6NTY6MzcuMTgwWiIgVmVyc2lvbj0iMi4wIiB4bWxuczpuczI9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphc3NlcnRpb24iPg0KICAgICAgICA8bnMyOklzc3VlciBGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpuYW1laWQtZm9ybWF0OmVudGl0eSI%2BaHR0cHM6Ly90ZXN0LmxvZ2lucHJveHkuZ292LmJjLmNhL2F1dGgvcmVhbG1zL19iY2VpZGJhc2ljYnVzaW5lc3MxLzwvbnMyOklzc3Vlcj48ZHM6U2lnbmF0dXJlIHhtbG5zOmRzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIj48ZHM6U2lnbmVkSW5mbz48ZHM6Q2Fub25pY2FsaXphdGlvbk1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvMTAveG1sLWV4Yy1jMTRuIyIvPjxkczpTaWduYXR1cmVNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzA0L3htbGRzaWctbW9yZSNyc2Etc2hhMjU2Ii8%2BPGRzOlJlZmVyZW5jZSBVUkk9IiNfZWFmZTRjYWQ5MjU0MTEyZjQ5YTcxMDI1MGM3YjVhNDVjYmI2Ij48ZHM6VHJhbnNmb3Jtcz48ZHM6VHJhbnNmb3JtIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI2VudmVsb3BlZC1zaWduYXR1cmUiLz48ZHM6VHJhbnNmb3JtIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS8xMC94bWwtZXhjLWMxNG4jIi8%2BPC9kczpUcmFuc2Zvcm1zPjxkczpEaWdlc3RNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzA0L3htbGVuYyNzaGEyNTYiLz48ZHM6RGlnZXN0VmFsdWU%2BS0c3SWRyMko3ODNGVGFkNkVZM0hHUklyRFpnUXU1TmdOQ1JBRU1vcERkYz08L2RzOkRpZ2VzdFZhbHVlPjwvZHM6UmVmZXJlbmNlPjwvZHM6U2lnbmVkSW5mbz48ZHM6U2lnbmF0dXJlVmFsdWU%2BbHJlNnpwalpyUEpKZmVqYStkUHN3cUhlVDN6a3VkNjA4emppZE4vWlBRMjdmSW56aHFWQ2lreDhHcld4V29jSWM4ekhHb1cxZmJqTXlBSkIwNnRHS2pXdzBXMWExTlIyL2VlVGQ1MFY1RnF4NndIb001NFVmYUkvY0N6dDdsMUNUQ2lHZzB6UkVLZjRDK3RxcWJaQ3QyRlFCQ20vd0xaNHRrdXVsZUh4WTZqdGJxWXBlbmpvSzQ2TGlocE1CejIvczBDRmQ3c1BxVjF4bHJpWXVtd1dtSlV1b0o1d0M1L2ZMZ3djTUlmSVMwd29SZmQzclBTN1pBWk5vWXExVVpWQ2xmemZMZ1hNc3JsM2k2S0F3SS80N01pSVpzeGNaaFd1Q3dMTFdFSXdzRWQzWlNLZFhXUTF1U0RrSGlIUGIrcXFmSTJQRGJwK2l1bHFDdlo2S3BCVzdnPT08L2RzOlNpZ25hdHVyZVZhbHVlPjxkczpLZXlJbmZvIHhtbG5zOmRzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIj48ZHM6WDUwOURhdGE%2BPGRzOlg1MDlDZXJ0aWZpY2F0ZT5NSUlFQ3pDQ0F2TUNDUUNkb1dONFh0VUk2VEFOQmdrcWhraUc5dzBCQVFzRkFEQ0J5akVMTUFrR0ExVUVCaE1DUTBFeEdUQVhCZ05WQkFnVEVFSnlhWFJwYzJnZ1EyOXNkVzFpYVdFeEVUQVBCZ05WQkFjVENGWnBZM1J2Y21saE1UY3dOUVlEVlFRS0V5NUhiM1psY201dFpXNTBJRzltSUhSb1pTQlFjbTkyYVc1alpTQnZaaUJDY21sMGFYTm9JRU52YkhWdFltbGhNUTh3RFFZRFZRUUxFd1pUUmxNdFEwRXhJakFnQmdOVkJBTVRHVk5HVXlCRFpYSjBhV1pwWTJGMFpTQkJkWFJvYjNKcGRIa3hIekFkQmdrcWhraUc5dzBCQ1FFV0VGZFVVMWRCVFVCbmIzWXVZbU11WTJFd0hoY05NVE13TkRBMU1qSTFOalUzV2hjTk16TXdOREExTWpJMU5qVTNXakNCd3pFTE1Ba0dBMVVFQmhNQ1EwRXhHVEFYQmdOVkJBZ1RFRUp5YVhScGMyZ2dRMjlzZFcxaWFXRXhFVEFQQmdOVkJBY1RDRlpwWTNSdmNtbGhNVGN3TlFZRFZRUUtFeTVIYjNabGNtNXRaVzUwSUc5bUlIUm9aU0JRY205MmFXNWpaU0J2WmlCQ2NtbDBhWE5vSUVOdmJIVnRZbWxoTVF3d0NnWURWUVFMRXdOVFJsTXhIakFjQmdOVkJBTVRGWE5tY3kxelpuTjBaWE4wTG1kdmRpNWlZeTVqWVRFZk1CMEdDU3FHU0liM0RRRUpBUllRVjFSVFYwRk5RR2R2ZGk1aVl5NWpZVENDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFKdzVFMDQ1amxKK3NiU2dOZmt2eUpBMysyN0tSQm1BbHErTVVSb1IzT1NpV2MyME1XZHQ1cEt4ZFJVcTJmWXhyUWp0cnRQdUdxa2tFR2FlSTBpTlp3UkluYnk2SHU2dWJDd2YxUTdmVGxXNzhscytDak5rWU5VQzMvd3VDM21uMVFuZzhVMGxkUTd0UVU0Y1BPcXdMSXZTaUpkaUpacm1GOFJEcHBvZFljSGhiaWo3N3Q2dGlIVkN4UVlncXhOY3V0M2d3bnhWcjI0MTZ5V0hYVnFxcGNjS0xUaUkvSm9lQ2I1b0kyVVVDcmRldnlXZDRINXFOWmx5NGhMNVBCQ1lZNFR1cFVheWpoYldmeEpLNFVXY0R2N09PYSt1eHE0a1luR2V4RHBxQ2JXNmJ2Y0hiazQ3UDVSQVpJdmd2bkdvQmdTZm9oMzd6eFEvRnA2VkU0aVdBdWNDQXdFQUFUQU5CZ2txaGtpRzl3MEJBUXNGQUFPQ0FRRUFiZGtqUTl1SHB2ZGtTZUlHT25meHU0Vm5mM2pHTzR5bzgrQnJub0dhTEM4aTJDV21Wb2RpOUdPdTNIM2pyR3ZzU296N242QzJBK3ZJdkR4dkE3dHdqd0xBcXVaVlFKbkJDcE1LbXdsUENBQ0F3WitFbGI0cjJxTW14YTJGbTBJZVl6M3gyQldZT0FUdGljODFmRnpoSjhRa1dCdXdiOStkSiswbC9HR1FmOXBPMnFpSXFVRWQyb0lVVkR4cVdSWXpoUGV6ZWpwZlZqQnNUUFhZNXhRaGRCVUtITXIwWnBTVTlrTW9KemNNMW42bEpIN3BGSFpCVUtONzkyaG9FNTVPbEszTFFMVW9oKzNXNEROL1lWS2tEczZrSHI0b0w2dXo5ajJXODRIVVBYNURMbUZGaUorTHBTMDUyVkJ0WWNoangyQnQwRlBzSEpKNEMwRjByNUc0b3c9PTwvZHM6WDUwOUNlcnRpZmljYXRlPjwvZHM6WDUwOURhdGE%2BPC9kczpLZXlJbmZvPjwvZHM6U2lnbmF0dXJlPg0KICAgICAgICA8bnMyOlN1YmplY3Q%2BDQogICAgICAgICAgICA8bnMyOk5hbWVJRCBGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpuYW1laWQtZm9ybWF0OnBlcnNpc3RlbnQiPkE5RUQyQzU3NDJEQzQ1NTk5ODY3MkNDMkExMTgxNzRCPC9uczI6TmFtZUlEPg0KICAgICAgICAgICAgPG5zMjpTdWJqZWN0Q29uZmlybWF0aW9uIE1ldGhvZD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmNtOmJlYXJlciI%2BDQogICAgICAgICAgICAgICAgPG5zMjpTdWJqZWN0Q29uZmlybWF0aW9uRGF0YSBJblJlc3BvbnNlVG89IklEX2FhYTM1M2Q0LTdlNmMtNDQxNS05N2FkLWI2NmEzM2FhOTBkYyIgTm90T25PckFmdGVyPSIyMDIzLTEwLTMwVDE5OjU4OjA3LjE0OFoiIFJlY2lwaWVudD0iaHR0cHM6Ly90ZXN0LmxvZ2lucHJveHkuZ292LmJjLmNhL2F1dGgvcmVhbG1zL2JjZWlkYm90aC9icm9rZXIvYmNlaWRib3RoL2VuZHBvaW50Ii8%2BDQogICAgICAgICAgICA8L25zMjpTdWJqZWN0Q29uZmlybWF0aW9uPg0KICAgICAgICA8L25zMjpTdWJqZWN0Pg0KICAgICAgICA8bnMyOkNvbmRpdGlvbnMgTm90QmVmb3JlPSIyMDIzLTEwLTMwVDE5OjU2OjA3LjE0OFoiIE5vdE9uT3JBZnRlcj0iMjAyMy0xMC0zMFQxOTo1ODowNy4xNDhaIj4NCiAgICAgICAgICAgIDxuczI6QXVkaWVuY2VSZXN0cmljdGlvbj4NCiAgICAgICAgICAgICAgICA8bnMyOkF1ZGllbmNlPmh0dHBzOi8vdGVzdC5sb2dpbnByb3h5Lmdvdi5iYy5jYS9hdXRoL3JlYWxtcy9fYmNlaWRiYXNpY2J1c2luZXNzMS88L25zMjpBdWRpZW5jZT4NCiAgICAgICAgICAgIDwvbnMyOkF1ZGllbmNlUmVzdHJpY3Rpb24%2BDQogICAgICAgIDwvbnMyOkNvbmRpdGlvbnM%2BDQogICAgICAgIDxuczI6QXV0aG5TdGF0ZW1lbnQgQXV0aG5JbnN0YW50PSIyMDIzLTEwLTMwVDE5OjU2OjM1LjEzMloiIFNlc3Npb25JbmRleD0ibGdlQ1pvN01aRnpJaFFiU1dGcXg1SDJiK1U0PXlMMWRQUT09IiBTZXNzaW9uTm90T25PckFmdGVyPSIyMDIzLTEwLTMwVDE5OjU4OjA3LjEzMloiPg0KICAgICAgICAgICAgPG5zMjpBdXRobkNvbnRleHQ%2BDQogICAgICAgICAgICAgICAgPG5zMjpBdXRobkNvbnRleHRDbGFzc1JlZj51cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6YWM6Y2xhc3NlczpQYXNzd29yZDwvbnMyOkF1dGhuQ29udGV4dENsYXNzUmVmPg0KICAgICAgICAgICAgPC9uczI6QXV0aG5Db250ZXh0Pg0KICAgICAgICA8L25zMjpBdXRoblN0YXRlbWVudD4NCiAgICAgICAgPG5zMjpBdHRyaWJ1dGVTdGF0ZW1lbnQ%2BDQogICAgICAgICAgICA8bnMyOkF0dHJpYnV0ZSBOYW1lPSJiY2VpZF91c2VybmFtZSIgTmFtZUZvcm1hdD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmF0dHJuYW1lLWZvcm1hdDp1bnNwZWNpZmllZCI%2BDQogICAgICAgICAgICAgICAgPG5zMjpBdHRyaWJ1dGVWYWx1ZSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTp0eXBlPSJ4czpzdHJpbmciPk9SQkNUU1QzPC9uczI6QXR0cmlidXRlVmFsdWU%2BDQogICAgICAgICAgICA8L25zMjpBdHRyaWJ1dGU%2BDQogICAgICAgICAgICA8bnMyOkF0dHJpYnV0ZSBOYW1lPSJkaXNwbGF5X25hbWUiIE5hbWVGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphdHRybmFtZS1mb3JtYXQ6dW5zcGVjaWZpZWQiPg0KICAgICAgICAgICAgICAgIDxuczI6QXR0cmlidXRlVmFsdWUgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6dHlwZT0ieHM6c3RyaW5nIj5CcnlhbiBMYW5lPC9uczI6QXR0cmlidXRlVmFsdWU%2BDQogICAgICAgICAgICA8L25zMjpBdHRyaWJ1dGU%2BDQogICAgICAgICAgICA8bnMyOkF0dHJpYnV0ZSBOYW1lPSJiY2VpZF91c2VyX2d1aWQiIE5hbWVGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphdHRybmFtZS1mb3JtYXQ6dW5zcGVjaWZpZWQiPg0KICAgICAgICAgICAgICAgIDxuczI6QXR0cmlidXRlVmFsdWUgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6dHlwZT0ieHM6c3RyaW5nIj5BOUVEMkM1NzQyREM0NTU5OTg2NzJDQzJBMTE4MTc0QjwvbnMyOkF0dHJpYnV0ZVZhbHVlPg0KICAgICAgICAgICAgPC9uczI6QXR0cmlidXRlPg0KICAgICAgICAgICAgPG5zMjpBdHRyaWJ1dGUgTmFtZT0iZW1haWwiIE5hbWVGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphdHRybmFtZS1mb3JtYXQ6dW5zcGVjaWZpZWQiPg0KICAgICAgICAgICAgICAgIDxuczI6QXR0cmlidXRlVmFsdWUgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6dHlwZT0ieHM6c3RyaW5nIj5icnlhbi5sYW5lQGdvdi5iYy5jYTwvbnMyOkF0dHJpYnV0ZVZhbHVlPg0KICAgICAgICAgICAgPC9uczI6QXR0cmlidXRlPg0KICAgICAgICA8bnMyOkF0dHJpYnV0ZSBOYW1lPSJTTUdPVl9CVVNJTkVTU0dVSUQiIE5hbWVGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphdHRybmFtZS1mb3JtYXQ6dW5zcGVjaWZpZWQiPjxuczI6QXR0cmlidXRlVmFsdWU%2BRjQwMjNEQjNDMzBGNDg3QjlBRjVCMTRDOTU4OTg5Rjg8L25zMjpBdHRyaWJ1dGVWYWx1ZT48L25zMjpBdHRyaWJ1dGU%2BPG5zMjpBdHRyaWJ1dGUgTmFtZT0iU01HT1ZfQlVTSU5FU1NMRUdBTE5BTUUiIE5hbWVGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphdHRybmFtZS1mb3JtYXQ6dW5zcGVjaWZpZWQiPjxuczI6QXR0cmlidXRlVmFsdWU%2BU29uaWMgRGVsaXZlcnkgU2VydmljZXM8L25zMjpBdHRyaWJ1dGVWYWx1ZT48L25zMjpBdHRyaWJ1dGU%2BPC9uczI6QXR0cmlidXRlU3RhdGVtZW50Pg0KICAgIDwvbnMyOkFzc2VydGlvbj4NCjwvbnM1OlJlc3BvbnNlPg%3D%3D - = - - - - - - - - https://${KEYCLOAK_LOGIN_URL}/auth/realms/bceidboth/broker/bceidboth/endpoint - POST - true - false - true - false - - - - - - - - - Host - ${KEYCLOAK_LOGIN_URL} - - - Connection - keep-alive - - - Content-Length - 9217 - - - Cache-Control - max-age=0 - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - sec-ch-ua-mobile - ?0 - - - sec-ch-ua-platform - "Windows" - - - Upgrade-Insecure-Requests - 1 - - - Origin - https://sfstest7.gov.bc.ca - - - Content-Type - application/x-www-form-urlencoded - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Accept - text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - navigate - - - Sec-Fetch-Dest - document - - - Referer - https://sfstest7.gov.bc.ca/ - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - Cookie - AUTH_SESSION_ID=f26f78a0-28d2-40b4-9e57-b83fa590e32e.ycloak-78b4c74bcf-vtmwp; AUTH_SESSION_ID_LEGACY=f26f78a0-28d2-40b4-9e57-b83fa590e32e.ycloak-78b4c74bcf-vtmwp; KC_RESTART=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI1ZjExNjBiNS03Y2RjLTQ5NGQtYmFkOS0yZGRkNjU3MDU5Y2UifQ.eyJjaWQiOiJzdGFuZGFyZC1yZWFsbSIsInB0eSI6Im9wZW5pZC1jb25uZWN0IiwicnVyaSI6Imh0dHBzOi8vdGVzdC5sb2dpbnByb3h5Lmdvdi5iYy5jYS9hdXRoL3JlYWxtcy9zdGFuZGFyZC9icm9rZXIvYmNlaWRib3RoL2VuZHBvaW50IiwiYWN0IjoiQVVUSEVOVElDQVRFIiwibm90ZXMiOnsic2NvcGUiOiJvcGVuaWQiLCJpc3MiOiJodHRwczovL3Rlc3QubG9naW5wcm94eS5nb3YuYmMuY2EvYXV0aC9yZWFsbXMvYmNlaWRib3RoIiwicmVzcG9uc2VfdHlwZSI6ImNvZGUiLCJyZWRpcmVjdF91cmkiOiJodHRwczovL3Rlc3QubG9naW5wcm94eS5nb3YuYmMuY2EvYXV0aC9yZWFsbXMvc3RhbmRhcmQvYnJva2VyL2JjZWlkYm90aC9lbmRwb2ludCIsInN0YXRlIjoiSnZJeWZtb2owQXptQlpXdzBaUzhsQm1oTUpYZDdsQV91QVI4SlF2TE5sRS5LQXhZWGpvYXRHYy5vbi1yb3V0ZS1iYy1kaXJlY3QtNDU5OCIsIm5vbmNlIjoiMXNLV21kWjBhVjZRSXNjYjY1THJtZyJ9fQ.08S_Qi57kTkuLj_eH5VElw2zeuH4AVhfOUois5IUzEI; _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; FAILREASON=0; SMSESSION=Awk9KIrMNenX09Vl2cEMuy/VxV9CFVP4fsBzCp8Zo3AX2VsrDVWkOMVOdJyoY1Q1J9F8Vs8XFBtHTU29qS7+jlhEMK3f9j8tgudEVWHJq8LTizGhEj1cf8r7CX2QuxWMbdAHvK90hFnpocsL5xv2cAaFVdqhBKlIYkzwkY+r0YuH3Uh6DJVIhAhwjWeKfO6BAg5/jNFxQ31EPvzn4N7RxJK2bGyfAxzi6Cs6O7ieJ10MzcB8nWSIsO4ksfG8pzeGp9a+arl4maKnd9Je2L2FQohmiOjfGcrsezOgLgiWFl1B3+EL8ytArvtKhsFvr7WJsQuhYsQYzfY8shcfhNSltyqxLD422bDmU3NyZdhWY9313YG5I1U2vbO7zvXhxaCJYnpMrJR+inz8XsyqnGY1xu7AepY3pNd2wJH3twQJ42N6R2WlJVVN3oc3DvEHUbk85xrqHdwngd/FiMdEC2f5Kt51VYp8G/3R+sbFiy6Wt7wlZw2+/wI8EfxXs31HQ5q/RDUTXz6JMbzsR7EUOF+WkOrgi1nDugu13/O9hDnxPJnkzNGEfjt0xPxdhoDdl4vWdwRe1awBEn90SyJwc8+cFk1XACtvWoGwtPdf1xnHUwx5Ge1TqEd46xdjjlu+iTw2Xu5AsESUVVw81STsKA7vC8EBabQ+yXQHZlNFcFCKa1+AutNxfWHNQtnFK03kUCai4ZPJc/TQrhvf9DWjSyX+KknWdV6aQyz65KOpwtQWpd4ZlqAAKvf9vCQIBgk+YdsxFzAq6ySnLPcBLbFvP+Xyo5bcABg8IS9aJr6+05KT3ZOv49G1uYvz1ILaDED83D5NHF57ZswKR2911SevaqIO2i8NkZAJUMBpgroSejoJ1MxzpL/a7I26u6+p/08uMt/dT7vuo5OTTjayEtIlXy1IRXA/jU/uX/pKk1JrsZFhhwj7G5KEQpMAx+YvZUaaidqyfj3+fLb6+rsa8BukV8x0zfgUg20dm+Wu9XjDvyQHFP4Qt65CaUbhAKcVTgCChgTfSSdUJZIPPa5Yhzr7SmTuVGmYV/1cC4jGzNdSqr3Fq28fWukiEnRtqfZRXlOdA6xb - - - - - - - - - - false - - = - - - - - - - - https://${KEYCLOAK_LOGIN_URL}/auth/realms/standard/broker/bceidboth/endpoint?state=JvIyfmoj0AzmBZWw0ZS8lBmhMJXd7lA_uAR8JQvLNlE.KAxYXjoatGc.on-route-bc-direct-4598&session_state=f26f78a0-28d2-40b4-9e57-b83fa590e32e&code=c5719177-78e8-4d75-857a-0ef191c765d1.f26f78a0-28d2-40b4-9e57-b83fa590e32e.1123d85b-badf-4084-a3a6-b1c920ccb0c0 - GET - true - false - true - false - - - - - - - - - Host - ${KEYCLOAK_LOGIN_URL} - - - Connection - keep-alive - - - Cache-Control - max-age=0 - - - Upgrade-Insecure-Requests - 1 - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Accept - text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - navigate - - - Sec-Fetch-Dest - document - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - sec-ch-ua-mobile - ?0 - - - sec-ch-ua-platform - "Windows" - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - Cookie - AUTH_SESSION_ID=0e56ff7b-e277-400f-84f5-25801c43c829.ycloak-78b4c74bcf-kh476; AUTH_SESSION_ID_LEGACY=0e56ff7b-e277-400f-84f5-25801c43c829.ycloak-78b4c74bcf-kh476; KC_RESTART=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICIzMmI0MzNkNC02NjgwLTQxODMtOTc2Yy1kZDdjMTg0YjExMTQifQ.eyJjaWQiOiJvbi1yb3V0ZS1iYy1kaXJlY3QtNDU5OCIsInB0eSI6Im9wZW5pZC1jb25uZWN0IiwicnVyaSI6Imh0dHBzOi8vb25yb3V0ZWJjLXRlc3QtZnJvbnRlbmQuYXBwcy5zaWx2ZXIuZGV2b3BzLmdvdi5iYy5jYS8iLCJhY3QiOiJBVVRIRU5USUNBVEUiLCJub3RlcyI6eyJzY29wZSI6Im9wZW5pZCIsImlzcyI6Imh0dHBzOi8vdGVzdC5sb2dpbnByb3h5Lmdvdi5iYy5jYS9hdXRoL3JlYWxtcy9zdGFuZGFyZCIsInJlc3BvbnNlX3R5cGUiOiJjb2RlIiwiY29kZV9jaGFsbGVuZ2VfbWV0aG9kIjoiUzI1NiIsInJlZGlyZWN0X3VyaSI6Imh0dHBzOi8vb25yb3V0ZWJjLXRlc3QtZnJvbnRlbmQuYXBwcy5zaWx2ZXIuZGV2b3BzLmdvdi5iYy5jYS8iLCJzdGF0ZSI6IjdiZTBmNDk4ZGRmYTQ1ZTI4ZWU4ZjI0MTY0NzViYTQyIiwiY29kZV9jaGFsbGVuZ2UiOiJCNEpzelBjUzBIT1c3RUNUVFVVUkMxbXA2ejhhdDJiNkswbEQxdUtfMTFBIiwia2NfaWRwX2hpbnQiOiJiY2VpZGJvdGgiLCJyZXNwb25zZV9tb2RlIjoicXVlcnkifX0.2dLZTTjk8ZY0EFAaE88sAWQlfo7T17XcYLztnQwI_Yk; _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; FAILREASON=0; SMSESSION=Awk9KIrMNenX09Vl2cEMuy/VxV9CFVP4fsBzCp8Zo3AX2VsrDVWkOMVOdJyoY1Q1J9F8Vs8XFBtHTU29qS7+jlhEMK3f9j8tgudEVWHJq8LTizGhEj1cf8r7CX2QuxWMbdAHvK90hFnpocsL5xv2cAaFVdqhBKlIYkzwkY+r0YuH3Uh6DJVIhAhwjWeKfO6BAg5/jNFxQ31EPvzn4N7RxJK2bGyfAxzi6Cs6O7ieJ10MzcB8nWSIsO4ksfG8pzeGp9a+arl4maKnd9Je2L2FQohmiOjfGcrsezOgLgiWFl1B3+EL8ytArvtKhsFvr7WJsQuhYsQYzfY8shcfhNSltyqxLD422bDmU3NyZdhWY9313YG5I1U2vbO7zvXhxaCJYnpMrJR+inz8XsyqnGY1xu7AepY3pNd2wJH3twQJ42N6R2WlJVVN3oc3DvEHUbk85xrqHdwngd/FiMdEC2f5Kt51VYp8G/3R+sbFiy6Wt7wlZw2+/wI8EfxXs31HQ5q/RDUTXz6JMbzsR7EUOF+WkOrgi1nDugu13/O9hDnxPJnkzNGEfjt0xPxdhoDdl4vWdwRe1awBEn90SyJwc8+cFk1XACtvWoGwtPdf1xnHUwx5Ge1TqEd46xdjjlu+iTw2Xu5AsESUVVw81STsKA7vC8EBabQ+yXQHZlNFcFCKa1+AutNxfWHNQtnFK03kUCai4ZPJc/TQrhvf9DWjSyX+KknWdV6aQyz65KOpwtQWpd4ZlqAAKvf9vCQIBgk+YdsxFzAq6ySnLPcBLbFvP+Xyo5bcABg8IS9aJr6+05KT3ZOv49G1uYvz1ILaDED83D5NHF57ZswKR2911SevaqIO2i8NkZAJUMBpgroSejoJ1MxzpL/a7I26u6+p/08uMt/dT7vuo5OTTjayEtIlXy1IRXA/jU/uX/pKk1JrsZFhhwj7G5KEQpMAx+YvZUaaidqyfj3+fLb6+rsa8BukV8x0zfgUg20dm+Wu9XjDvyQHFP4Qt65CaUbhAKcVTgCChgTfSSdUJZIPPa5Yhzr7SmTuVGmYV/1cC4jGzNdSqr3Fq28fWukiEnRtqfZRXlOdA6xb - - - - - - - - - - false - - = - - - - - - - - https://${KEYCLOAK_LOGIN_URL}/auth/realms/standard/login-actions/post-broker-login?client_id=on-route-bc-direct-4598&tab_id=KAxYXjoatGc - GET - true - false - true - false - - - - - - - - - Host - ${KEYCLOAK_LOGIN_URL} - - - Connection - keep-alive - - - Cache-Control - max-age=0 - - - Upgrade-Insecure-Requests - 1 - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Accept - text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - navigate - - - Sec-Fetch-Dest - document - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - sec-ch-ua-mobile - ?0 - - - sec-ch-ua-platform - "Windows" - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - Cookie - AUTH_SESSION_ID=0e56ff7b-e277-400f-84f5-25801c43c829.ycloak-78b4c74bcf-kh476; AUTH_SESSION_ID_LEGACY=0e56ff7b-e277-400f-84f5-25801c43c829.ycloak-78b4c74bcf-kh476; KC_RESTART=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICIzMmI0MzNkNC02NjgwLTQxODMtOTc2Yy1kZDdjMTg0YjExMTQifQ.eyJjaWQiOiJvbi1yb3V0ZS1iYy1kaXJlY3QtNDU5OCIsInB0eSI6Im9wZW5pZC1jb25uZWN0IiwicnVyaSI6Imh0dHBzOi8vb25yb3V0ZWJjLXRlc3QtZnJvbnRlbmQuYXBwcy5zaWx2ZXIuZGV2b3BzLmdvdi5iYy5jYS8iLCJhY3QiOiJBVVRIRU5USUNBVEUiLCJub3RlcyI6eyJzY29wZSI6Im9wZW5pZCIsImlzcyI6Imh0dHBzOi8vdGVzdC5sb2dpbnByb3h5Lmdvdi5iYy5jYS9hdXRoL3JlYWxtcy9zdGFuZGFyZCIsInJlc3BvbnNlX3R5cGUiOiJjb2RlIiwiY29kZV9jaGFsbGVuZ2VfbWV0aG9kIjoiUzI1NiIsInJlZGlyZWN0X3VyaSI6Imh0dHBzOi8vb25yb3V0ZWJjLXRlc3QtZnJvbnRlbmQuYXBwcy5zaWx2ZXIuZGV2b3BzLmdvdi5iYy5jYS8iLCJzdGF0ZSI6IjdiZTBmNDk4ZGRmYTQ1ZTI4ZWU4ZjI0MTY0NzViYTQyIiwiY29kZV9jaGFsbGVuZ2UiOiJCNEpzelBjUzBIT1c3RUNUVFVVUkMxbXA2ejhhdDJiNkswbEQxdUtfMTFBIiwia2NfaWRwX2hpbnQiOiJiY2VpZGJvdGgiLCJyZXNwb25zZV9tb2RlIjoicXVlcnkifX0.2dLZTTjk8ZY0EFAaE88sAWQlfo7T17XcYLztnQwI_Yk; _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; FAILREASON=0; SMSESSION=Awk9KIrMNenX09Vl2cEMuy/VxV9CFVP4fsBzCp8Zo3AX2VsrDVWkOMVOdJyoY1Q1J9F8Vs8XFBtHTU29qS7+jlhEMK3f9j8tgudEVWHJq8LTizGhEj1cf8r7CX2QuxWMbdAHvK90hFnpocsL5xv2cAaFVdqhBKlIYkzwkY+r0YuH3Uh6DJVIhAhwjWeKfO6BAg5/jNFxQ31EPvzn4N7RxJK2bGyfAxzi6Cs6O7ieJ10MzcB8nWSIsO4ksfG8pzeGp9a+arl4maKnd9Je2L2FQohmiOjfGcrsezOgLgiWFl1B3+EL8ytArvtKhsFvr7WJsQuhYsQYzfY8shcfhNSltyqxLD422bDmU3NyZdhWY9313YG5I1U2vbO7zvXhxaCJYnpMrJR+inz8XsyqnGY1xu7AepY3pNd2wJH3twQJ42N6R2WlJVVN3oc3DvEHUbk85xrqHdwngd/FiMdEC2f5Kt51VYp8G/3R+sbFiy6Wt7wlZw2+/wI8EfxXs31HQ5q/RDUTXz6JMbzsR7EUOF+WkOrgi1nDugu13/O9hDnxPJnkzNGEfjt0xPxdhoDdl4vWdwRe1awBEn90SyJwc8+cFk1XACtvWoGwtPdf1xnHUwx5Ge1TqEd46xdjjlu+iTw2Xu5AsESUVVw81STsKA7vC8EBabQ+yXQHZlNFcFCKa1+AutNxfWHNQtnFK03kUCai4ZPJc/TQrhvf9DWjSyX+KknWdV6aQyz65KOpwtQWpd4ZlqAAKvf9vCQIBgk+YdsxFzAq6ySnLPcBLbFvP+Xyo5bcABg8IS9aJr6+05KT3ZOv49G1uYvz1ILaDED83D5NHF57ZswKR2911SevaqIO2i8NkZAJUMBpgroSejoJ1MxzpL/a7I26u6+p/08uMt/dT7vuo5OTTjayEtIlXy1IRXA/jU/uX/pKk1JrsZFhhwj7G5KEQpMAx+YvZUaaidqyfj3+fLb6+rsa8BukV8x0zfgUg20dm+Wu9XjDvyQHFP4Qt65CaUbhAKcVTgCChgTfSSdUJZIPPa5Yhzr7SmTuVGmYV/1cC4jGzNdSqr3Fq28fWukiEnRtqfZRXlOdA6xb - - - - - - - - - - false - - = - - - - - - - - https://${FRONTEND_API_URL}/?state=7be0f498ddfa45e28ee8f2416475ba42&session_state=0e56ff7b-e277-400f-84f5-25801c43c829&code=e1db6532-ce36-4aa5-845c-26c6d9f6e19f.0e56ff7b-e277-400f-84f5-25801c43c829.f462b30d-0893-4a2d-8169-3461d82c36eb - GET - true - false - true - false - - - - - - - - - Host - ${FRONTEND_API_URL} - - - Connection - keep-alive - - - Cache-Control - max-age=0 - - - Upgrade-Insecure-Requests - 1 - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Accept - text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - navigate - - - Sec-Fetch-Dest - document - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - sec-ch-ua-mobile - ?0 - - - sec-ch-ua-platform - "Windows" - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - Cookie - _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; FAILREASON=0; 9a75866e187615f9e3e688e8297548f9=1f5b60b83338df80ae3a11e1286008b7; SMSESSION=Awk9KIrMNenX09Vl2cEMuy/VxV9CFVP4fsBzCp8Zo3AX2VsrDVWkOMVOdJyoY1Q1J9F8Vs8XFBtHTU29qS7+jlhEMK3f9j8tgudEVWHJq8LTizGhEj1cf8r7CX2QuxWMbdAHvK90hFnpocsL5xv2cAaFVdqhBKlIYkzwkY+r0YuH3Uh6DJVIhAhwjWeKfO6BAg5/jNFxQ31EPvzn4N7RxJK2bGyfAxzi6Cs6O7ieJ10MzcB8nWSIsO4ksfG8pzeGp9a+arl4maKnd9Je2L2FQohmiOjfGcrsezOgLgiWFl1B3+EL8ytArvtKhsFvr7WJsQuhYsQYzfY8shcfhNSltyqxLD422bDmU3NyZdhWY9313YG5I1U2vbO7zvXhxaCJYnpMrJR+inz8XsyqnGY1xu7AepY3pNd2wJH3twQJ42N6R2WlJVVN3oc3DvEHUbk85xrqHdwngd/FiMdEC2f5Kt51VYp8G/3R+sbFiy6Wt7wlZw2+/wI8EfxXs31HQ5q/RDUTXz6JMbzsR7EUOF+WkOrgi1nDugu13/O9hDnxPJnkzNGEfjt0xPxdhoDdl4vWdwRe1awBEn90SyJwc8+cFk1XACtvWoGwtPdf1xnHUwx5Ge1TqEd46xdjjlu+iTw2Xu5AsESUVVw81STsKA7vC8EBabQ+yXQHZlNFcFCKa1+AutNxfWHNQtnFK03kUCai4ZPJc/TQrhvf9DWjSyX+KknWdV6aQyz65KOpwtQWpd4ZlqAAKvf9vCQIBgk+YdsxFzAq6ySnLPcBLbFvP+Xyo5bcABg8IS9aJr6+05KT3ZOv49G1uYvz1ILaDED83D5NHF57ZswKR2911SevaqIO2i8NkZAJUMBpgroSejoJ1MxzpL/a7I26u6+p/08uMt/dT7vuo5OTTjayEtIlXy1IRXA/jU/uX/pKk1JrsZFhhwj7G5KEQpMAx+YvZUaaidqyfj3+fLb6+rsa8BukV8x0zfgUg20dm+Wu9XjDvyQHFP4Qt65CaUbhAKcVTgCChgTfSSdUJZIPPa5Yhzr7SmTuVGmYV/1cC4jGzNdSqr3Fq28fWukiEnRtqfZRXlOdA6xb - - - - - - - - - - false - - = - true - - - - - - - - https://${KEYCLOAK_LOGIN_URL}/auth/realms/standard/.well-known/openid-configuration - GET - true - false - true - false - - - - - - - - - Host - ${KEYCLOAK_LOGIN_URL} - - - Connection - keep-alive - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - Accept - application/jwk-set+json, application/json - - - sec-ch-ua-mobile - ?0 - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - sec-ch-ua-platform - "Windows" - - - Origin - https://${FRONTEND_API_URL} - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - cors - - - Sec-Fetch-Dest - empty - - - Referer - https://${FRONTEND_API_URL}/ - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - - - - - - - - false - - = - - - - - - - - https://${VEHICLES_API_URL}/users/user-context - OPTIONS - true - false - true - false - - - - - - - - - Host - ${VEHICLES_API_URL} - - - Connection - keep-alive - - - Accept - */* - - - Access-Control-Request-Method - POST - - - Access-Control-Request-Headers - authorization,content-type - - - Origin - https://${FRONTEND_API_URL} - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Sec-Fetch-Mode - cors - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Dest - empty - - - Referer - https://${FRONTEND_API_URL}/ - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - - - - - true - - - - false - {} - = - - - - - - - - https://${VEHICLES_API_URL}/users/user-context - POST - true - false - true - false - - - - - - - - - Host - ${VEHICLES_API_URL} - - - Connection - keep-alive - - - Content-Length - 2 - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - Accept - application/json, text/plain, */* - - - Content-Type - application/json - - - sec-ch-ua-mobile - ?0 - - - Authorization - Bearer ${BEARER_TOKEN} - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - sec-ch-ua-platform - "Windows" - - - Origin - https://${FRONTEND_API_URL} - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - cors - - - Sec-Fetch-Dest - empty - - - Referer - https://${FRONTEND_API_URL}/ - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - - - - - - - - false - - = - - - - - - - - https://${VEHICLES_API_URL}/users/roles?companyId=102 - OPTIONS - true - false - true - false - - - - - - - - - Host - ${VEHICLES_API_URL} - - - Connection - keep-alive - - - Accept - */* - - - Access-Control-Request-Method - GET - - - Access-Control-Request-Headers - authorization - - - Origin - https://${FRONTEND_API_URL} - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Sec-Fetch-Mode - cors - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Dest - empty - - - Referer - https://${FRONTEND_API_URL}/ - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - - - - - - - - false - - = - - - - - - - - https://${VEHICLES_API_URL}/users/roles?companyId=102 - GET - true - false - true - false - - - - - - - - - Host - ${VEHICLES_API_URL} - - - Connection - keep-alive - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - Accept - application/json, text/plain, */* - - - sec-ch-ua-mobile - ?0 - - - Authorization - Bearer ${BEARER_TOKEN} - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - sec-ch-ua-platform - "Windows" - - - Origin - https://${FRONTEND_API_URL} - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - cors - - - Sec-Fetch-Dest - empty - - - Referer - https://${FRONTEND_API_URL}/ - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - If-None-Match - W/"1b4-DdYKGtaFZ5+U7pxjw6uu3owPOfo" - - - - - - - - - - false - - = - - - - - - - - https://${VEHICLES_API_URL}/permits/applications?status=IN_PROGRESS&companyId=102&userGUID=A9ED2C5742DC455998672CC2A118174B - OPTIONS - true - false - true - false - - - - - - - - - Host - ${VEHICLES_API_URL} - - - Connection - keep-alive - - - Accept - */* - - - Access-Control-Request-Method - GET - - - Access-Control-Request-Headers - authorization - - - Origin - https://${FRONTEND_API_URL} - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Sec-Fetch-Mode - cors - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Dest - empty - - - Referer - https://${FRONTEND_API_URL}/ - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - - - - - - - - false - - = - true - - - - - - - - https://${VEHICLES_API_URL}/permits/applications?status=IN_PROGRESS&companyId=102&userGUID=A9ED2C5742DC455998672CC2A118174B - GET - true - false - true - false - - - - - - - - - Host - ${VEHICLES_API_URL} - - - Connection - keep-alive - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - Accept - application/json, text/plain, */* - - - sec-ch-ua-mobile - ?0 - - - Authorization - Bearer ${BEARER_TOKEN} - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - sec-ch-ua-platform - "Windows" - - - Origin - https://${FRONTEND_API_URL} - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - cors - - - Sec-Fetch-Dest - empty - - - Referer - https://${FRONTEND_API_URL}/ - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - If-None-Match - W/"17b2-OQs45yY+9rxT8oaE549bg+d9IqA" - - - - - - - - - - - - - - https://${VEHICLES_API_URL}/users/roles?companyId=102 - GET - true - false - true - false - - - - - - - - - Host - ${VEHICLES_API_URL} - - - Connection - keep-alive - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - Accept - application/json - - - sec-ch-ua-mobile - ?0 - - - Authorization - Bearer ${BEARER_TOKEN} - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - sec-ch-ua-platform - "Windows" - - - Origin - https://${FRONTEND_API_URL} - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - cors - - - Sec-Fetch-Dest - empty - - - Referer - https://${FRONTEND_API_URL}/ - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - If-None-Match - W/"17b2-OQs45yY+9rxT8oaE549bg+d9IqA" - - - - - - - - Authorization - Bearer ${BEARER_TOKEN} - - - Accept - */* - - - - - - - true - - - - false - { - "companyId": 102, - "permitId": null, - "originalPermitId": "", - "applicationNumber": null, - "previousRevision": "", - "revision": "", - "userGuid": "06267945F2EB4E31B585932F78B76269", - "permitType": "TROS", - "permitStatus": "IN_PROGRESS", - "permitApprovalSource": "PPC", - "permitApplicationOrigin": "ONLINE", - "permitData": { - "startDate": "2023-06-05T19:12:22Z", - "expiryDate": "2023-07-04T19:12:22Z", - "permitDuration": 30, - "feeSummary": "30", - "commodities": [ - { - "description": "General Permit Conditions", - "condition": "CVSE-1000", - "conditionLink": "https://www.th.gov.bc.ca/forms/getForm.aspx?formId=1251", - "checked": true - }, - { - "description": "Permit Scope and Limitation", - "condition": "CVSE-1070", - "conditionLink": "https://www.th.gov.bc.ca/forms/getForm.aspx?formId=1261", - "checked": true - }, - { - "description": "Log Permit Conditions", - "condition": "CVSE-1000L", - "conditionLink": "https://www.th.gov.bc.ca/forms/getForm.aspx?formId=1250", - "checked": true - } - ], - "contactDetails": { - "firstName": "Lewis", - "lastName": "Hamilton", - "phone1": "(778) 952-1234", - "email": "lewis@f1.com", - "phone1Extension": "1", - "phone2": null, - "phone2Extension": null, - "fax": null - }, - "mailingAddress": { - "addressLine1": "123 Short Street", - "addressLine2": null, - "city": "Victoria", - "provinceCode": "BC", - "countryCode": "CA", - "postalCode": "V8X2V5" - }, - "vehicleDetails": { - "vin": "781452", - "plate": "PRJZZP", - "make": "GMC", - "year": 2001, - "countryCode": "CA", - "provinceCode": "BC", - "vehicleType": "powerUnit", - "vehicleSubType": "LOGGING", - "saveVehicle": true - } - }, - "comment": "This application was amended because of so-and-so reason." -} - = - - - - - - - - https://${VEHICLES_API_URL}/permits/applications - POST - true - false - true - false - - - - - - - - - Host - ${VEHICLES_API_URL} - - - Connection - keep-alive - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - Accept - application/json - - - sec-ch-ua-mobile - ?0 - - - Authorization - Bearer ${BEARER_TOKEN} - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - sec-ch-ua-platform - "Windows" - - - Origin - https://${FRONTEND_API_URL} - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - cors - - - Sec-Fetch-Dest - empty - - - Referer - https://${FRONTEND_API_URL}/ - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - If-None-Match - W/"17b2-OQs45yY+9rxT8oaE549bg+d9IqA" - - - - - - - - Authorization - Bearer ${BEARER_TOKEN} - - - Content-Type - application/json - - - Accept - application/json - - - - - - - + continue false @@ -9234,7 +3018,7 @@ Authorization - Bearer ${BEARER_TOKEN} + Bearer ${IDIR_BEARER_TOKEN} User-Agent @@ -9410,7 +3194,7 @@ Authorization - Bearer ${BEARER_TOKEN} + Bearer ${IDIR_BEARER_TOKEN} User-Agent @@ -9589,7 +3373,7 @@ Authorization - Bearer ${BEARER_TOKEN} + Bearer ${IDIR_BEARER_TOKEN} User-Agent @@ -9678,7 +3462,7 @@ Authorization - Bearer ${BEARER_TOKEN} + Bearer ${IDIR_BEARER_TOKEN} User-Agent @@ -9727,7 +3511,7 @@ Authorization - Bearer ${BEARER_TOKEN} + Bearer ${IDIR_BEARER_TOKEN} Accept @@ -9787,7 +3571,7 @@ Authorization - Bearer ${BEARER_TOKEN} + Bearer ${IDIR_BEARER_TOKEN} User-Agent @@ -9836,7 +3620,7 @@ Authorization - Bearer ${BEARER_TOKEN} + Bearer ${IDIR_BEARER_TOKEN} Accept @@ -9896,7 +3680,7 @@ Authorization - Bearer ${BEARER_TOKEN} + Bearer ${IDIR_BEARER_TOKEN} User-Agent @@ -9945,7 +3729,7 @@ Authorization - Bearer ${BEARER_TOKEN} + Bearer ${IDIR_BEARER_TOKEN} Accept @@ -10005,7 +3789,7 @@ Authorization - Bearer ${BEARER_TOKEN} + Bearer ${IDIR_BEARER_TOKEN} User-Agent @@ -10054,7 +3838,7 @@ Authorization - Bearer ${BEARER_TOKEN} + Bearer ${IDIR_BEARER_TOKEN} Accept @@ -10065,7 +3849,7 @@ - + continue false @@ -11583,7 +5367,7 @@ Authorization - Bearer ${BEARER_TOKEN} + Bearer ${IDIR_BEARER_TOKEN} User-Agent @@ -11759,7 +5543,7 @@ Authorization - Bearer ${BEARER_TOKEN} + Bearer ${IDIR_BEARER_TOKEN} User-Agent @@ -11938,7 +5722,7 @@ Authorization - Bearer ${BEARER_TOKEN} + Bearer ${IDIR_BEARER_TOKEN} User-Agent @@ -12027,7 +5811,7 @@ Authorization - Bearer ${BEARER_TOKEN} + Bearer ${IDIR_BEARER_TOKEN} User-Agent @@ -12076,7 +5860,7 @@ Authorization - Bearer ${BEARER_TOKEN} + Bearer ${IDIR_BEARER_TOKEN} Accept @@ -12136,7 +5920,7 @@ Authorization - Bearer ${BEARER_TOKEN} + Bearer ${IDIR_BEARER_TOKEN} User-Agent @@ -12185,7 +5969,7 @@ Authorization - Bearer ${BEARER_TOKEN} + Bearer ${IDIR_BEARER_TOKEN} Accept @@ -12322,7 +6106,7 @@ Authorization - Bearer ${BEARER_TOKEN} + Bearer ${IDIR_BEARER_TOKEN} User-Agent @@ -12371,7 +6155,7 @@ Authorization - Bearer ${BEARER_TOKEN} + Bearer ${IDIR_BEARER_TOKEN} Accept From ab872b93207de2b8bcdf8907475dce58d902f829 Mon Sep 17 00:00:00 2001 From: John Fletcher <113134542+john-fletcher-aot@users.noreply.github.com> Date: Thu, 5 Sep 2024 15:58:37 -0700 Subject: [PATCH 18/63] feat: Initial load of OS permittable data (#1572) Co-authored-by: Derek Roberts --- policy-engine/README.md | 9 +- policy-engine/package-lock.json | 49 +- policy-engine/package.json | 2 +- policy-engine/src/_examples/_debug-helper.ts | 75 + .../src/_examples/get-policy-details.ts | 48 +- .../os-dimensions-simplified-nodefault.csv | 211 + .../_examples/os-dimensions-simplified.csv | 212 + .../src/_examples/update-os-from-csv.ts | 153 + .../permit-app/permit-application.type.ts | 29 + .../src/_test/permit-app/test-stos.ts | 26 + .../policy-config/all-event-types.sample.ts | 31 +- .../complete-in-progress.sample.ts | 4933 ++++++++++++++--- .../_test/policy-config/five-types.sample.ts | 1736 ++++-- .../src/_test/policy-config/master.sample.ts | 61 +- .../src/_test/policy-config/mimimal.sample.ts | 10 +- .../stos-vehicle-config.sample.ts | 4870 +++++++++++++--- .../tros-multiple-cost-rules.sample.ts | 10 +- .../tros-no-allowed-vehicles.sample.ts | 13 +- .../policy-config/tros-no-params.sample.ts | 13 +- .../_test/policy-config/tros-only.sample.ts | 31 +- .../src/_test/unit/configuration.spec.ts | 107 +- .../src/_test/unit/size-dimension.spec.ts | 94 +- policy-engine/src/_test/unit/utility.spec.ts | 12 +- .../src/_test/unit/validation.spec.ts | 43 +- .../src/enum/accessory-vehicle-type.ts | 4 + policy-engine/src/enum/facts.ts | 1 + policy-engine/src/enum/index.ts | 2 + policy-engine/src/enum/permit-app-info.ts | 11 +- policy-engine/src/enum/vehicle-types.ts | 4 + policy-engine/src/helper/facts.helper.ts | 95 +- policy-engine/src/helper/lists.helper.ts | 38 + .../src/helper/rules-engine.helper.ts | 5 +- policy-engine/src/policy-engine.ts | 622 ++- .../src/rule-operator/custom-operators.ts | 6 +- policy-engine/src/types/commodity.ts | 18 +- policy-engine/src/types/index.ts | 10 +- .../src/types/region-size-override.ts | 6 +- policy-engine/src/types/self-issuable.ts | 2 +- policy-engine/src/types/size-dimension.ts | 10 +- policy-engine/src/types/vehicle.ts | 14 +- 40 files changed, 11370 insertions(+), 2256 deletions(-) create mode 100644 policy-engine/src/_examples/_debug-helper.ts create mode 100644 policy-engine/src/_examples/os-dimensions-simplified-nodefault.csv create mode 100644 policy-engine/src/_examples/os-dimensions-simplified.csv create mode 100644 policy-engine/src/_examples/update-os-from-csv.ts create mode 100644 policy-engine/src/enum/accessory-vehicle-type.ts create mode 100644 policy-engine/src/enum/vehicle-types.ts diff --git a/policy-engine/README.md b/policy-engine/README.md index 3d4566d9a..952caa60b 100644 --- a/policy-engine/README.md +++ b/policy-engine/README.md @@ -10,7 +10,7 @@ A JSON-based rules engine to validate onRouteBC permit applications against comm import Policy from 'orbc-policy-engine'; // Instantiate a new Policy object -// policyConfiguration is a JSON object of type PolicyDefinition +// policyDefinition is a JSON object of type PolicyDefinition const policy: Policy = new Policy(policyDefinition); // Get list of all available permit types (ID and name) @@ -31,19 +31,20 @@ const commodities: Map = policy.getCommodities(permitTypeId); // Get list of all vehicle types valid to be added to a configuration, // by permit type and commodity. Requires supplying the vehicles already // added to the configuration, or empty array if starting from scratch -const allowableVehicles: Map = policy.getAllowableVehicles( +const allowableVehicles: Map = policy.getNextPermittableVehicles( permitTypeId, commodityId, currentConfiguration); // Validate a permit application against policy // permitApplication is a JSON object of type PermitApplication -// A PermitApplication is just the standard permitData object wrapped +// A PermitApplication is the standard permitData object wrapped // in an object with a permitType key. For example: // { // permitType: 'TROS', // permitData: { ... } // } -const results: ValidationResults = policy.validate(permitApplication); +// Note this is an async call due to the reliance on json-rules-engine +const results: ValidationResults = await policy.validate(permitApplication); ``` diff --git a/policy-engine/package-lock.json b/policy-engine/package-lock.json index 4bf90bb69..dbe272077 100644 --- a/policy-engine/package-lock.json +++ b/policy-engine/package-lock.json @@ -10,12 +10,12 @@ "license": "Apache-2.0", "dependencies": { "dayjs": "^1.11.10", - "flattie": "^1.1.1", "json-rules-engine": "^6.5.0" }, "devDependencies": { "@types/jest": "^29.5.12", "@typescript-eslint/eslint-plugin": "^7.5.0", + "csv": "^6.3.10", "eslint": "^8.57.0", "eslint-config-prettier": "^9.1.0", "jest": "^29.7.0", @@ -2271,6 +2271,39 @@ "node": ">= 8" } }, + "node_modules/csv": { + "version": "6.3.10", + "resolved": "https://registry.npmjs.org/csv/-/csv-6.3.10.tgz", + "integrity": "sha512-5NYZG4AN2ZUthmNxIudgBEdMPUnbQHu9V4QTzBPqQzUP3KQsFiJo+8HQ0+oVxj1PomIT1/f67VI1QH/hsrZLKA==", + "dev": true, + "dependencies": { + "csv-generate": "^4.4.1", + "csv-parse": "^5.5.6", + "csv-stringify": "^6.5.1", + "stream-transform": "^3.3.2" + }, + "engines": { + "node": ">= 0.1.90" + } + }, + "node_modules/csv-generate": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/csv-generate/-/csv-generate-4.4.1.tgz", + "integrity": "sha512-O/einO0v4zPmXaOV+sYqGa02VkST4GP5GLpWBNHEouIU7pF3kpGf3D0kCCvX82ydIY4EKkOK+R8b1BYsRXravg==", + "dev": true + }, + "node_modules/csv-parse": { + "version": "5.5.6", + "resolved": "https://registry.npmjs.org/csv-parse/-/csv-parse-5.5.6.tgz", + "integrity": "sha512-uNpm30m/AGSkLxxy7d9yRXpJQFrZzVWLFBkS+6ngPcZkw/5k3L/jjFuj7tVnEpRn+QgmiXr21nDlhCiUK4ij2A==", + "dev": true + }, + "node_modules/csv-stringify": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/csv-stringify/-/csv-stringify-6.5.1.tgz", + "integrity": "sha512-+9lpZfwpLntpTIEpFbwQyWuW/hmI/eHuJZD1XzeZpfZTqkf1fyvBbBLXTJJMsBuuS11uTShMqPwzx4A6ffXgRQ==", + "dev": true + }, "node_modules/dayjs": { "version": "1.11.10", "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.10.tgz", @@ -2892,14 +2925,6 @@ "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", "dev": true }, - "node_modules/flattie": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/flattie/-/flattie-1.1.1.tgz", - "integrity": "sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ==", - "engines": { - "node": ">=8" - } - }, "node_modules/foreground-child": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.2.1.tgz", @@ -4913,6 +4938,12 @@ "node": ">=10" } }, + "node_modules/stream-transform": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/stream-transform/-/stream-transform-3.3.2.tgz", + "integrity": "sha512-v64PUnPy9Qw94NGuaEMo+9RHQe4jTBYf+NkTtqkCgeuiNo8NlL0LtLR7fkKWNVFtp3RhIm5Dlxkgm5uz7TDimQ==", + "dev": true + }, "node_modules/string-length": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", diff --git a/policy-engine/package.json b/policy-engine/package.json index 72b815baf..55ac20d00 100644 --- a/policy-engine/package.json +++ b/policy-engine/package.json @@ -28,6 +28,7 @@ "devDependencies": { "@types/jest": "^29.5.12", "@typescript-eslint/eslint-plugin": "^7.5.0", + "csv": "^6.3.10", "eslint": "^8.57.0", "eslint-config-prettier": "^9.1.0", "jest": "^29.7.0", @@ -38,7 +39,6 @@ }, "dependencies": { "dayjs": "^1.11.10", - "flattie": "^1.1.1", "json-rules-engine": "^6.5.0" }, "jest": { diff --git a/policy-engine/src/_examples/_debug-helper.ts b/policy-engine/src/_examples/_debug-helper.ts new file mode 100644 index 000000000..9431db5c8 --- /dev/null +++ b/policy-engine/src/_examples/_debug-helper.ts @@ -0,0 +1,75 @@ +import { Policy } from 'onroute-policy-engine'; +import { completePolicyConfig } from '../_test/policy-config/complete-in-progress.sample'; + +function start() { + const policy: Policy = new Policy(completePolicyConfig); + console.log(JSON.stringify(policy.policyDefinition)); + /* + + console.log('***ALL COMMODITIES***'); + const allCommodities = policy.getCommodities(); + console.log( + JSON.stringify(Array.from(allCommodities.entries()), null, ' '), + ); + + console.log('***COMMODITIES FOR STOS***'); + const stosCommodities = policy.getCommodities('STOS'); + console.log( + JSON.stringify(Array.from(stosCommodities.entries()), null, ' '), + ); + + console.log('***POWER UNITS PERMITTABLE FOR STOS AND EMPTY COMMODITY***'); + const puTypesEmpty = policy.getPermittablePowerUnitTypes('STOS', 'EMPTYXX'); + console.log(JSON.stringify(Array.from(puTypesEmpty.entries()), null, ' ')); + + console.log( + '***POWER UNITS PERMITTABLE FOR STOS AND BRIDGE BEAMS COMMODITY***', + ); + const puTypesBridgeBeams = policy.getPermittablePowerUnitTypes( + 'STOS', + 'BRGBEAM', + ); + console.log( + JSON.stringify(Array.from(puTypesBridgeBeams.entries()), null, ' '), + ); + + console.log( + '***PERMITTABLE NEXT VEHICLES WITH EMPTY CONFIGURATION, STOS AND EMPTY***', + ); + const vehicleTypes1 = policy.getNextPermittableVehicles( + 'STOS', + 'EMPTYXX', + [], + ); + console.log(JSON.stringify(Array.from(vehicleTypes1.entries()), null, ' ')); + + console.log( + '***PERMITTABLE NEXT VEHICLES WITH TRUCK TRACTOR AND JEEP, STOS AND EMPTY***', + ); + const vehicleTypes2 = policy.getNextPermittableVehicles('STOS', 'EMPTYXX', [ + 'TRKTRAC', + 'JEEPSRG', + ]); + console.log(JSON.stringify(Array.from(vehicleTypes2.entries()), null, ' ')); + + console.log( + '***MAX SIZE FOR TRUCK TRACTOR, JEEP, HIBOEXP, STOS AND EMPTYXX***', + ); + const sizeDimension = policy.getSizeDimension('STOS', 'EMPTYXX', ['TRKTRAC', 'JEEPSRG', 'HIBOEXP']); + console.log(JSON.stringify(sizeDimension, null, ' ')); + + console.log( + '***MAX SIZE FOR TRUCK TRACTOR, JEEP, HIBOEXP, STOS AND EMPTYXX IN PEACE***', + ); + const sizeDimensionPeace = policy.getSizeDimension('STOS', 'EMPTYXX', ['TRKTRAC', 'JEEPSRG', 'HIBOEXP'], ['PCE']); + console.log(JSON.stringify(sizeDimensionPeace, null, ' ')); + + console.log( + '***MAX SIZE FOR TRUCK TRACTOR, JEEP, HIBOEXP, STOS AND EMPTYXX IN PEACE,BC DEFAULT***', + ); + const sizeDimensionPeaceBC = policy.getSizeDimension('STOS', 'EMPTYXX', ['TRKTRAC', 'JEEPSRG', 'HIBOEXP'], ['PCE','BCD']); + console.log(JSON.stringify(sizeDimensionPeaceBC, null, ' ')); + */ +} + +start(); diff --git a/policy-engine/src/_examples/get-policy-details.ts b/policy-engine/src/_examples/get-policy-details.ts index 176352f56..9065c208d 100644 --- a/policy-engine/src/_examples/get-policy-details.ts +++ b/policy-engine/src/_examples/get-policy-details.ts @@ -4,6 +4,12 @@ import { completePolicyConfig } from '../_test/policy-config/complete-in-progres function start() { const policy: Policy = new Policy(completePolicyConfig); + console.log('***ALL PERMIT TYPES***'); + const allPermitTypes = policy.getPermitTypes(); + console.log( + JSON.stringify(Array.from(allPermitTypes.entries()), null, ' '), + ); + console.log('***ALL COMMODITIES***'); const allCommodities = policy.getCommodities(); console.log( @@ -53,20 +59,56 @@ function start() { console.log( '***MAX SIZE FOR TRUCK TRACTOR, JEEP, HIBOEXP, STOS AND EMPTYXX***', ); - const sizeDimension = policy.getSizeDimension('STOS', 'EMPTYXX', ['TRKTRAC', 'JEEPSRG', 'HIBOEXP']); + const sizeDimension = policy.getSizeDimension('STOS', 'EMPTYXX', [ + 'TRKTRAC', + 'JEEPSRG', + 'HIBOEXP', + ]); console.log(JSON.stringify(sizeDimension, null, ' ')); console.log( '***MAX SIZE FOR TRUCK TRACTOR, JEEP, HIBOEXP, STOS AND EMPTYXX IN PEACE***', ); - const sizeDimensionPeace = policy.getSizeDimension('STOS', 'EMPTYXX', ['TRKTRAC', 'JEEPSRG', 'HIBOEXP'], ['PCE']); + const sizeDimensionPeace = policy.getSizeDimension( + 'STOS', + 'EMPTYXX', + ['TRKTRAC', 'JEEPSRG', 'HIBOEXP'], + ['PCE'], + ); console.log(JSON.stringify(sizeDimensionPeace, null, ' ')); console.log( '***MAX SIZE FOR TRUCK TRACTOR, JEEP, HIBOEXP, STOS AND EMPTYXX IN PEACE,BC DEFAULT***', ); - const sizeDimensionPeaceBC = policy.getSizeDimension('STOS', 'EMPTYXX', ['TRKTRAC', 'JEEPSRG', 'HIBOEXP'], ['PCE','BCD']); + const sizeDimensionPeaceBC = policy.getSizeDimension( + 'STOS', + 'EMPTYXX', + ['TRKTRAC', 'JEEPSRG', 'HIBOEXP'], + ['PCE', 'BCD'], + ); console.log(JSON.stringify(sizeDimensionPeaceBC, null, ' ')); + + console.log( + '***MAX SIZE FOR TRUCK TRACTOR, JEEP, STWHELR, STOS AND EMPTYXX IN BC DEFAULT***', + ); + const sizeDimensionBC = policy.getSizeDimension( + 'STOS', + 'EMPTYXX', + ['TRKTRAC', 'JEEPSRG', 'STWHELR'], + ['BCD'], + ); + console.log(JSON.stringify(sizeDimensionBC, null, ' ')); + + console.log( + '***MAX SIZE FOR TRUCK TRACTOR, JEEP, STWHELR, STOS AND EMPTYXX IN PEACE***', + ); + const sizeDimensionStwhelrPce = policy.getSizeDimension( + 'STOS', + 'EMPTYXX', + ['TRKTRAC', 'JEEPSRG', 'STWHELR'], + ['PCE'], + ); + console.log(JSON.stringify(sizeDimensionStwhelrPce, null, ' ')); } start(); diff --git a/policy-engine/src/_examples/os-dimensions-simplified-nodefault.csv b/policy-engine/src/_examples/os-dimensions-simplified-nodefault.csv new file mode 100644 index 000000000..30ffc16eb --- /dev/null +++ b/policy-engine/src/_examples/os-dimensions-simplified-nodefault.csv @@ -0,0 +1,211 @@ +,"Auto Carrier, Campers And Boats (Stinger Steered Transporters Only)",Truck Tractors - Stinger Steered,Mandatory,Semi-Trailers - Stinger Steered Automobile Transporters,,,,4.3,25,,4.3,25,,4.88,25,,4.4,25,1,1.2,4.2.7.A.1/4.2.7.B.A/ 5.3.11,,"Loaded dimensions used, equipment itself is less",FP and RP points can vary in CTPM (i.e. rear projection can be from turn centre or bumper or sometimes bunk!) +,Bridge Beams,Truck Tractors,Mandatory,Pole Trailers,X,,,,31,,,31,,,31,,,31,3,6.5,4.5.5/5.3.12.F.(over 31m use Non-Reducible with Semi-Trailers - Steering Trailers),,"OAL could be greater with steering trailers, do we need two categories?", +,Brushcutters (Peace Only),Truck Tractors,Mandatory,Semi-Trailers,,,,,,,,,4.57,5.33,,,,,3,6.5,4.2.7.B.B,,tractor semi-trailer could be 23.5 if a tridem , +,Brushcutters (Peace Only),Truck Tractors,Mandatory,"Semi-Trailers - Single Drop, Double Drop, Step Decks, Lowbed, Expandos, etc.",X,X,,,,,,,4.57,5.33,,,,,3,6.5,4.2.7.B.B,,, +,Brushcutters (Peace Only),Trucks,Prohibited,None,,,,,,,,,4.57,5.33,,,,,,,4.2.7.B.B,,, +,Brushcutters (Peace Only),Trucks,Mandatory,Pony Trailers,,,,,,,,,3.8,5.33,,,,,,,4.2.7.B.B/5.3.12.G,,, +,Doglogger/Sjostrum Trailers (decked),Truck Tractors,Mandatory,None,,,,,13.5,,,13.5,,,13.5,,,13.5,,5,4.2.7.A.13,,, +,Empty,Truck Tractors,Mandatory,Logging Trailer - Overwidth Bunks,,,3.2,,,3.2,,,3.2,,,3.2,,,0,0,5.3.5.B,,, +,Empty,Picker Truck Tractors,Mandatory,Oil and Gas - Oversize Oilfield Flat Deck Semi-Trailers,X,X,3.2,4.3,23,3.2,4.3,23,3.2,4.3,23,3.2,4.3,23,3,6.5,5.3.8.B.,,, +X,Empty,Picker Truck Tractors,Mandatory,Platform Trailers,X,X,3.2,4.88,27.5,3.2,4.88,27.5,3.2,5.33,27.5,3.2,4.88,27.5,,,,,, +,Empty,Picker Truck Tractors,Mandatory,Semi-Trailers - Hiboys/Expandos,X,X,,,,,,,,,27.5,,,25,3,6.5,5.3.9.A./5.3.9.B.,,, +X,Empty,Picker Truck Tractors,Mandatory,Semi-Trailers - Wheelers,X,X,3.2,4.88,27.5,3.2,4.88,27.5,3.2,5.33,27.5,3.2,4.88,27.5,,,,,, +X,Empty,Picker Truck Tractors,Mandatory,Semi-Trailers - Wide Wheelers,X,X,3.2,4.88,27.5,3.2,4.88,27.5,3.2,5.33,27.5,3.2,4.88,27.5,,,,,, +,Empty,Picker Truck Tractors,Mandatory,Semi-Trailers with Crane,X,X,3.2,4.88,27.5,3.2,4.88,27.5,3.2,5.33,27.5,3.2,4.88,27.5,,,,,, +X,Empty,Truck Tractors,Mandatory,Platform Trailers,X,X,3.2,4.88,27.5,3.2,4.88,27.5,3.2,5.33,27.5,3.2,4.88,27.5,,,,,, +,Empty,Truck Tractors,Mandatory,Semi-Trailers - Hiboys/Expandos,X,X,,,31,,,31,,,31,,,31,3,6.5,5.3.12.C.,,, +,Empty,Truck Tractors,Mandatory,Semi-Trailers - Hiboys/Flat Decks,X,X,,,27.5,,,27.5,,,27.5,,,27.5,3,6.5,5.3.12.B.,,, +,Empty,Truck Tractors,Mandatory,"Semi-Trailers - Single Drop, Double Drop, Step Decks, Lowbed, Expandos, etc.",X,X,3.2,,31,3.2,,31,3.2,,31,3.2,,31,3,6.5,5.3.12.A.,,, +X,Empty,Truck Tractors,Mandatory,Semi-Trailers - Wheelers,X,X,3.2,4.88,27.5,3.2,4.88,27.5,3.2,5.33,27.5,3.2,4.88,27.5,,,,,, +X,Empty,Truck Tractors,Mandatory,Semi-Trailers - Wide Wheelers,X,X,3.2,4.88,27.5,3.2,4.88,27.5,3.2,5.33,27.5,3.2,4.88,27.5,,,,,, +,Empty,Truck Tractors,Mandatory,Semi-Trailers with Crane,X,X,3.2,4.88,27.5,3.2,4.88,27.5,3.2,5.33,27.5,3.2,4.88,27.5,,,,,, +,Fixed Equipment,Truck Tractors,Mandatory,Fixed Equipment - Conveyors (Semi-Trailers),X,X,3.8,4.72,31,3.8,4.72,31,3.8,5.33,31,3.8,4.72,31,4,9.5,5.3.4.F.,,, +,Fixed Equipment,Truck Tractors,Mandatory,Fixed Equipment - Counter Flow Asphalt Drum Mixers,X,X,3.8,4.72,31,3.8,4.72,31,3.8,5.33,31,3.8,4.72,31,3,6.5,5.3.4.D.,,, +,Fixed Equipment,Truck Tractors,Mandatory,Fixed Equipment - Portable Asphalt Baghouses,X,X,4.26,4.72,31,4.26,4.72,31,4.26,5.33,31,4.26,4.72,31,3,6.5,5.3.4.E.,,, +,Fixed Equipment,Truck Tractors,Mandatory,Fixed Equipment - Semi-Trailers,X,X,3.8,4.72,31,3.8,4.72,31,3.8,5.33,31,3.8,4.72,31,3,6.5,5.3.4.A.,,, +X,Fixed Equipment,Truck Tractors,Mandatory,Fixed Equipment - Wheeler Semi-Trailers,X,X,3.8,4.72,31,3.8,4.72,31,3.8,5.33,31,3.8,4.72,31,3,6.5,5.3.4.B.,,, +,Fixed Equipment,Trucks,Mandatory,Fixed Equipment - Conveyors (Pony Trailers),,,3.2,4.3,31,3.2,4.3,31,3.2,4.3,31,3.2,4.3,31,4,9.5,5.3.4.F.,,, +,Fixed Equipment,Trucks,Mandatory,Fixed Equipment - Counter Flow Asphalt Drum Mixers,,,3.8,4.72,31,3.8,4.72,31,3.8,5.33,31,3.8,4.72,31,3,6.5,5.3.4.D.,,, +,Fixed Equipment,Trucks,Mandatory,Fixed Equipment - Pony Trailers,,,3.2,4.3,31,3.2,4.3,31,3.2,4.3,31,3.2,4.3,31,,4,5.3.4.C.,,, +,Fixed Equipment,Trucks,Mandatory,Fixed Equipment - Portable Asphalt Baghouses,,,4.26,4.72,31,4.26,4.72,31,4.26,4.72,31,4.26,4.72,31,3,6.5,5.3.4.E.,,, +,Garbage Bins,Trucks,Mandatory,Full Trailers,,,,,,,,,,,,,,,3,6.5,4.2.7.A.7,,, +,Garbage Bins,Trucks,Prohibited,None,,,,,,,,,,,,,,,3,6.5,4.2.7.A.7,,, +,Garbage Bins,Trucks,Mandatory,Pony Trailers,,,,,,,,,,,,,,,3,6.5,4.2.7.A.7,,, +,"Grader, Tractor Blades, Buckets",Fixed Equipment - Trucks/Graders etc.,Prohibited,None,,,4.4,,,4.4,,,4.4,,,4.4,,,,,4.2.7.B.C,,, +,Hay Bales (Round) Peace River Only,Truck Tractors,Mandatory,Semi-Trailers - A-Trains and C-Trains,,,3.5,4.3,26,3.5,4.3,26,3.84,4.8,26,3.5,4.3,26,,,4.2.7.A.8/4.4.2,,, +,Hay Bales (Round) Peace River Only,Truck Tractors,Mandatory,Semi-Trailers - B-Trains,,,3.5,4.3,,3.5,4.3,,3.84,4.8,,3.5,4.3,,,,4.2.7.A.8/4.4.2,,, +,Hay Bales (Round) Peace River Only,Truck Tractors,Mandatory,Semi-Trailers - Hiboys/Flat Decks,X,X,3.5,4.3,,3.5,4.3,,3.84,4.8,,3.5,4.3,,3,6.5,4.2.7.A.8/4.4.2,,, +,Hay Bales (Round) Peace River Only,Truck Tractors,Mandatory,"Semi-Trailers - Single Drop, Double Drop, Step Decks, Lowbed, Expandos, etc.",X,X,3.5,4.3,,3.5,4.3,,3.84,4.8,,3.5,4.3,,3,6.5,4.2.7.A.8/4.4.2,,, +,Hay Bales (Round) Peace River Only,Trucks,Mandatory,Full Trailers,,,3.5,4.3,,3.5,4.3,,3.84,4.8,,3.5,4.3,,,4,4.2.7.A.8/4.4.2,,, +,Hay Bales (Round) Peace River Only,Trucks,Prohibited,None,,,3.5,4.3,,3.5,4.3,,3.84,4.8,,3.5,4.3,,,,4.2.7.A.8/4.4.2,,, +,Hay Bales (Round) Peace River Only,Trucks,Mandatory,Pony Trailers,,,3.5,4.3,,3.5,4.3,,3.84,4.8,,3.5,4.3,,,4,4.2.7.A.8/4.4.2,,, +,Hay Bales Large Rectangular,Truck Tractors,Mandatory,Semi-Trailers - A-Trains and C-Trains,,,3.05,4.3,26,3.05,4.3,26,3.05,4.8,26,3.05,4.3,26,,,4.2.7.A.8/4.4.1,,, +,Hay Bales Large Rectangular,Truck Tractors,Mandatory,Semi-Trailers - B-Trains,,,3.05,4.3,27.5,3.05,4.3,27.5,3.05,4.8,27.5,3.05,4.3,27.5,,,4.2.7.A.8/4.4.1,,, +,Hay Bales Large Rectangular,Truck Tractors,Mandatory,Semi-Trailers - Hiboys/Flat Decks,X,X,3.05,4.3,,3.05,4.3,,3.05,4.8,,3.05,4.4,,3,6.5,4.2.7.A.8/4.4.1,,, +,Hay Bales Large Rectangular,Truck Tractors,Mandatory,"Semi-Trailers - Single Drop, Double Drop, Step Decks, Lowbed, Expandos, etc.",X,X,3.05,4.3,,3.05,4.3,,3.05,4.8,,3.05,4.3,,3,6.5,4.2.7.A.8/4.4.1,,, +,Hay Bales Large Rectangular,Trucks,Mandatory,Full Trailers,,,3.05,4.3,,3.05,4.3,,3.05,4.8,,3.05,4.3,,,4,4.2.7.A.8/4.4.1,,, +,Hay Bales Large Rectangular,Trucks,Prohibited,None,,,3.05,4.3,,3.05,4.3,,3.05,4.8,,3.05,4.3,,,,4.2.7.A.8/4.4.1,,, +,Hay Bales Large Rectangular,Trucks,Mandatory,Pony Trailers,,,3.05,4.3,,3.05,4.3,,3.05,4.8,,3.05,4.3,,,4,4.2.7.A.8/4.4.1,,, +,Hay Bales Round,Truck Tractors,Mandatory,Semi-Trailers - A-Trains and C-Trains,,,3.5,4.3,26,3.5,4.3,26,3.84,4.8,26,3.5,4.3,26,,,4.2.7.A.8/4.4.2,,, +,Hay Bales Round,Truck Tractors,Mandatory,Semi-Trailers - B-Trains,,,3.5,4.3,27.5,3.5,4.3,27.5,3.84,4.8,27.5,3.5,4.3,27.5,,,4.2.7.A.8/4.4.2,,, +,Hay Bales Round,Truck Tractors,Mandatory,Semi-Trailers - Hiboys/Flat Decks,X,X,3.5,4.3,,3.5,4.3,,3.84,4.8,,3.5,4.3,,3,6.5,4.2.7.A.8/4.4.2,,, +,Hay Bales Round,Truck Tractors,Mandatory,"Semi-Trailers - Single Drop, Double Drop, Step Decks, Lowbed, Expandos, etc.",X,X,3.5,4.3,,3.5,4.3,,3.84,4.8,,3.5,4.3,,3,6.5,4.2.7.A.8/4.4.2,,, +,Hay Bales Round,Trucks,Mandatory,Full Trailers,,,3.5,4.3,,3.5,4.3,,3.84,4.8,,3.5,4.3,,,4,4.2.7.A.8/4.4.2,,, +,Hay Bales Round,Trucks,Prohibited,None,,,3.5,4.3,,3.5,4.3,,3.84,4.8,,3.5,4.3,,,,4.2.7.A.8/4.4.2,,, +,Hay Bales Round,Trucks,Mandatory,Pony Trailers,,,3.5,4.3,,3.5,4.3,,3.84,4.8,,3.5,4.3,,,4,4.2.7.A.8/4.4.2,,, +,Hay Bales Small Rectangular,Truck Tractors,Mandatory,Semi-Trailers - A-Trains and C-Trains,,,3.05,4.3,26,3.05,4.3,26,3.05,4.8,26,3.05,4.3,26,,,4.2.7.A.8/4.4.1,,, +,Hay Bales Small Rectangular,Truck Tractors,Mandatory,Semi-Trailers - B-Trains,,,3.05,4.3,27.5,3.05,4.3,27.5,3.05,4.8,27.5,3.05,4.3,27.5,,,4.2.7.A.8/4.4.1,,, +,Hay Bales Small Rectangular,Truck Tractors,Mandatory,Semi-Trailers - Hiboys/Flat Decks,X,X,3.05,4.3,,3.05,4.3,,3.05,4.8,,3.05,4.3,,3,6.5,4.2.7.A.8/4.4.1,,, +,Hay Bales Small Rectangular,Truck Tractors,Mandatory,"Semi-Trailers - Single Drop, Double Drop, Step Decks, Lowbed, Expandos, etc.",X,X,3.05,4.3,,3.05,4.3,,3.05,4.8,,3.05,4.3,,3,6.5,4.2.7.A.8/4.4.1,,, +,Hay Bales Small Rectangular,Trucks,Mandatory,Full Trailers,,,3.05,4.3,,3.05,4.3,,3.05,4.8,,3.05,4.3,,,4,4.2.7.A.8/4.4.1,,, +,Hay Bales Small Rectangular,Trucks,Prohibited,None,,,3.05,4.3,,3.05,4.3,,3.05,4.8,,3.05,4.3,,,,4.2.7.A.8/4.4.1,,, +,Hay Bales Small Rectangular,Trucks,Mandatory,Pony Trailers,,,3.05,4.3,,3.05,4.3,,3.05,4.8,,3.05,4.3,,,4,4.2.7.A.8/4.4.1,,, +,Hayrack Semi-Trailer with a Folded Chassis/Empty Piggyback,Truck Tractors,Mandatory,Semi-Trailers - Logging,,,,,,,,,,,,,4.15,,,5,4.5.6.E.,,, +,Intermodal Containers,Truck Tractors,Mandatory,Semi-Trailers - A-Trains and C-Trains,,,,4.4,26,,4.4,26,,4.4,26,,4.4,26,,,4.2.7.A.9,,, +,Intermodal Containers,Truck Tractors,Mandatory,Semi-Trailers - B-Trains,,,,4.4,27.5,,4.4,27.5,,4.4,27.5,,4.4,27.5,,,4.2.7.A.9,,, +,Intermodal Containers,Truck Tractors,Mandatory,Semi-Trailers - Hiboys/Flat Decks,X,X,,4.4,,,4.4,,,4.4,,,4.4,,,,4.2.7.A.9,,, +,Intermodal Containers,Trucks,Mandatory,None,,,,4.4,,,4.4,,,4.4,,,4.4,,,,4.2.7.A.9,,, +,Intermodal Containers without Sides,Truck Tractors,Mandatory,"Semi-Trailers - Single Drop, Double Drop, Step Decks, Lowbed, Expandos, etc.",X,X,4.4,4.72,,4.4,4.72,,4.4,4.72,,4.4,4.72,,,,4.2.7.10/4.2.7.B.D.,,, +,Laminated Beams,Truck Tractors,Mandatory,Pole Trailers,X,X,,,40,,,40,,,40,,,40,3,6.5,4.5.3,,, +,Laminated Beams,Truck Tractors,Mandatory,Semi-Trailers - Hiboys/Expandos,X,X,,,31,,,31,,,31,,,31,3,6.5,4.5.3,,, +X,"Logs, Poles And Boomsticks (Over 20.1)",Truck Tractors,Mandatory,"Logging Trailer - Full Trailers, Tri Axle, Quad Axle",,,,,40,,,40,,,40,,,40,10,10,4.5.2,,, +X,"Logs, Poles And Boomsticks (Over 20.1)",Truck Tractors,Mandatory,Pole Trailers,X,X,,,40,,,40,,,40,,,40,8,9,4.5.2,,, +,"Logs, Poles And Boomsticks (Over 20.1)",Truck Tractors,Mandatory,Steering Trailers - Manned,X,X,,,40,,,40,,,40,,,40,10,10,5.3.12.F,,, +,"Logs, Poles And Boomsticks (Over 20.1)",Truck Tractors,Mandatory,Steering Trailers - Self/Remote,X,X,,,36,,,36,,,36,,,36,10,10,5.3.12.F,,, +,"Logs, Poles And Boomsticks (Up To 20.1)",Truck Tractors,Mandatory,Full Trailers,,,2.9,,27.5,2.9,,27.5,2.9,,27.5,2.9,,27.5,3,6.5,4.5.1,,, +,"Logs, Poles And Boomsticks (Up To 20.1)",Truck Tractors,Mandatory,Legacy Logging Trailer Combinations,,,2.6,,25,2.6,,25,2.6,,25,2.6,,25,3,5,5.3.7.C.,,, +,"Logs, Poles And Boomsticks (Up To 20.1)",Truck Tractors,Mandatory,Pole Trailers,X,,2.9,,27.5,2.9,,27.5,2.9,,27.5,2.9,,27.5,3,6.5,4.5.1,,, +,"Logs, Poles And Boomsticks (Up To 20.1)",Truck Tractors,Mandatory,Semi-Trailers - A-Trains and C-Trains,,,2.9,,26,2.9,,26,2.9,,26,2.9,,26,3,6.5,4.5.1,,, +,"Logs, Poles And Boomsticks (Up To 20.1)",Truck Tractors,Mandatory,Semi-Trailers - B-Trains,,,2.9,,27.5,2.9,,27.5,2.9,,27.5,2.9,,27.5,3,6.5,4.5.1,,, +,"Logs, Poles And Boomsticks (Up To 20.1)",Truck Tractors,Mandatory,Semi-Trailers - Hiboys/Flat Decks,,,2.9,,25,2.9,,25,2.9,,25,2.9,,25,3,6.5,4.5.1,,, +,"Logs, Poles And Boomsticks (Up To 20.1)",Truck Tractors,Mandatory,Semi-Trailers - Logging,,,2.9,,25,2.9,,25,2.9,,25,2.9,,25,3,6.5,4.5.1,,, +X,"Manufactured Homes, Modular Buildings, Structures and Houseboats (<= 5.0 m OAW)",Truck Tractors,Mandatory,Semi-Trailers,X,X,,4.88,,,4.88,,,5.33,36,,4.88,31.5,3.0,7.5,4.3.5,,, +X,"Manufactured Homes, Modular Buildings, Structures and Houseboats (<= 5.0 m OAW)",Truck Tractors,Mandatory,"Semi-Trailers - Single Drop, Double Drop, Step Decks, Lowbed, Expandos, etc.",X,X,,4.88,,,4.88,,,5.33,36,,4.88,31.5,3.0,7.5,4.3.5,,, +X,"Manufactured Homes, Modular Buildings, Structures and Houseboats (<= 5.0 m OAW)",Trucks,Mandatory,Dollies,,,,4.88,,,4.88,,,5.33,36,,4.88,31.5,1,6.9,4.3,,, +X,"Manufactured Homes, Modular Buildings, Structures and Houseboats (<= 5.0 m OAW)",Trucks,Mandatory,Float Trailers,,,,4.57,,,4.57,,,5.33,36,,4.57,31.5,1,6.9,4.3.5.F,,, +X,"Manufactured Homes, Modular Buildings, Structures and Houseboats (<= 5.0 m OAW)",Trucks,Mandatory,Pony Trailers,,,,4.88,,,4.88,,,5.33,36,,4.88,31.5,1,6.9,4.3,,, +X,"Manufactured Homes, Modular Buildings, Structures and Houseboats (> 5.0 m OAW)",Truck Tractors,Mandatory,Semi-Trailers,X,X,,4.88,,,4.88,,,5.33,36,,4.88,31.5,3.0,7.5,4.3.5,,, +X,"Manufactured Homes, Modular Buildings, Structures and Houseboats (> 5.0 m OAW)",Truck Tractors,Mandatory,"Semi-Trailers - Single Drop, Double Drop, Step Decks, Lowbed, Expandos, etc.",X,X,,4.88,,,4.88,,,5.33,36,,4.88,31.5,3.0,7.5,4.3.5,,, +X,"Manufactured Homes, Modular Buildings, Structures and Houseboats (> 5.0 m OAW)",Trucks,Mandatory,Dollies,,,,4.88,,,4.88,,,5.33,36,,4.88,31.5,1,6.9,4.3,,, +X,"Manufactured Homes, Modular Buildings, Structures and Houseboats (> 5.0 m OAW)",Trucks,Mandatory,Float Trailers,,,,4.57,,,4.57,,,5.33,36,,4.57,31.5,1,6.9,4.3.5.F,,, +X,"Manufactured Homes, Modular Buildings, Structures and Houseboats (> 5.0 m OAW)",Trucks,Mandatory,Pony Trailers,,,,4.88,,,4.88,,,5.33,36,,4.88,31.5,1,6.9,4.3,,, +,None,Concrete Pumper Trucks,Prohibited,None,,X,,,15.5,,,15.5,,,15.5,,,15.5,3,6.5,5.3.2.A.,,, +,None,"Cranes, Rubber-Tired Loaders, Firetrucks - All Terrain",Prohibited,Dollies,,,3.8,4.3,25,3.8,4.3,25,3.8,4.3,25,3.8,4.3,25,10,6.5,5.3.3.B.,,, +,None,"Cranes, Rubber-Tired Loaders, Firetrucks - All Terrain",Prohibited,None,,,3.8,4.3,14,3.8,4.3,14,3.8,4.3,15,3.8,4.3,14,10,6.5,5.3.3.B.,,, +,None,"Cranes, Rubber-Tired Loaders, Firetrucks - Mobile",Prohibited,Dollies,,,3.8,4.3,25,3.8,4.3,25,3.8,4.3,25,3.8,4.3,25,10,6.5,5.3.3.A.,,, +,None,"Cranes, Rubber-Tired Loaders, Firetrucks - Mobile",Prohibited,None,,,3.8,4.3,14,3.8,4.3,14,3.8,4.3,15,3.8,4.3,14,10,6.5,5.3.3.A.,,, +,None,Double Decker Buses,Prohibited,None,,,,4.3,,,4.3,,,4.3,,,4.42,,,,5.3.1.A,,, +,None,Fixed Equipment - Trucks/Graders etc.,Prohibited,Fixed Equipment - Pony Trailers,,,3.2,4.3,31,3.2,4.3,31,3.2,4.3,31,3.2,4.3,31,,4,,,, +X,None,Fixed Equipment - Trucks/Graders etc.,Prohibited,None,,,3.5,4.3,,3.5,4.3,,3.5,5.33,,3.5,4.4,12.5,,,5.3.4.G.,,, +X,None,Inter-City Bus (Pulling Pony Trailer),Mandatory,Pony Trailers,,,,,,,,,,,,,,,,,5.3.1.B,,, +,None,Logging Trucks - Off-Highway,Mandatory,Semi-Trailers - Logging,,,4.4,,,4.4,,,4.4,,,4.4,,,3,6.5,5.3.5.A.,,, +X,None,Long Combination Vehicles (LCV) - Rocky Mountain Doubles,Prohibited,Semi-Trailers,,,,,32,,,32,,,31,,,32,,,5.3.6.D.,,, +,None,Long Combination Vehicles (LCV) - Turnpike Doubles,Prohibited,Semi-Trailers,,,,,41,,,41,,,41,,,41,,,5.3.6.D.,,, +X,None,Long Wheelbase Truck Tractors Exceeding 6.2 m up to 7.25 m,Mandatory,Semi-Trailers,X,X,,,,,,,,,,2.6,4.15,23,,,5.3.7.A.,,, +,None,Picker Truck Tractors,Prohibited,None,,,,,16,,,16,,,16,2.6,4.15,16,3,,5.3.9,,, +,None,Picker Truck Tractors,Mandatory,Semi-Trailers with Crane,X,X,,,25,,,25,,,25,2.6,4.15,25,3,6.5,5.3.9,,, +,None,Picker Truck Tractors,Mandatory,Steering Trailers - Manned,X,X,5,4.88,40,5,4.88,40,5,5.33,40,5,4.88,40,,,,,, +,None,Picker Truck Tractors,Mandatory,Steering Trailers - Self/Remote,X,X,5,4.88,36,5,4.88,36,5,5.33,36,5,4.88,36,,,,,, +,None,Scrapers,Prohibited,None,,,,,,,,,,,,,,12.5,,,5.3.10.A.1),,, +,None,Truck Tractors,Mandatory,Fixed Equipment - Conveyors (Semi-Trailers),X,X,3.8,4.72,31,3.8,4.72,31,3.8,5.33,31,3.8,4.72,31,4,9.5,,,, +,None,Truck Tractors,Mandatory,Fixed Equipment - Counter Flow Asphalt Drum Mixers,X,X,3.8,4.72,31,3.8,4.72,31,3.8,5.33,31,3.8,4.72,31,3,6.5,,,, +X,None,Truck Tractors,Mandatory,Fixed Equipment - Portable Asphalt Baghouses,X,X,4.26,4.72,31,4.26,4.72,31,4.26,5.33,31,4.26,4.72,31,3,6.5,,,, +X,None,Truck Tractors,Mandatory,Fixed Equipment - Semi-Trailers,X,X,3.8,4.72,31,3.8,4.72,31,3.8,5.33,31,3.8,4.72,31,3,6.5,,,, +,None,Truck Tractors,Mandatory,Fixed Equipment - Wheeler Semi-Trailers,X,X,5,4.88,31,5,4.88,31,5,5.33,31,5,4.88,31,,,,,, +X,None,Truck Tractors,Mandatory,Overdimensional Trailers and Semi-Trailers (For Export),,,3.65,,,3.65,,,3.65,,,3.65,,,,,5.3.12.D.,,, +,None,Truck Tractors,Mandatory,Ready Mix Concrete Pump Semi-Trailers,X,X,,,,,,,,,,,,,3,6.5,5.3.2.B.,,, +,None,Truck Tractors,Mandatory,Semi-Trailers - Hiboys/Flat Decks,X,X,,4.3,,,4.3,,,5.33,,,4.3,31,3,6.5,5.3.12.B.,,, +,None,Truck Tractors,Mandatory,Semi-Trailers - Insulated Vans with Reefer/Refrigeration Units,,,,4.3,,,4.3,,,4.3,,,4.3,,,,5.3.12.H.,,, +,None,Truck Tractors,Mandatory,Semi-Trailers - Non-Tac Short Chassis,,,,,,,,,,,,,,,,,5.3.7.D.,,, +,None,Truck Tractors,Mandatory,"Semi-Trailers - Single Drop, Double Drop, Step Decks, Lowbed, Expandos, etc.",X,X,3.2,4.3,27.5,3.2,4.3,27.5,3.2,4.3,32,3.2,4.3,27.5,3,6.5,5.3.12.A.,,, +,None,Truck Tractors,Mandatory,Steering Trailers - Manned,X,X,,,40,,,40,,,40,,4.15,40,,,5.3.12.F.ii),,, +,None,Truck Tractors,Mandatory,Steering Trailers - Self/Remote,X,X,,,36,,,36,,,36,,,36,,,5.3.12.F.i),,, +,None,Trucks,Mandatory,Fixed Equipment - Conveyors (Pony Trailers),,,3.2,4.3,31,3.2,4.3,31,3.2,4.3,31,3.2,4.3,31,4,9.5,,,, +,None,Trucks,Mandatory,Fixed Equipment - Pony Trailers,,,3.2,4.3,31,3.2,4.3,31,3.2,4.3,31,3.2,4.3,31,,4,,,, +,None,Trucks,Mandatory,Full Trailers ,,,3.8,4.3,,3.8,4.3,,3.8,5.33,,3.8,4.3,,,6.5,5.3.12.G.,,, +,None,Trucks,Mandatory,"Manufactured Homes, Modular Buildings, Structures and Houseboats (<= 5.0 m OAW) with Attached Axles",,,,4.88,,,4.88,,,5.33,36,,4.88,31.5,1,6.9,"4.3.5.A, 4.3.5.B, 4.3.5.C",,, +,None,Trucks,Mandatory,"Manufactured Homes, Modular Buildings, Structures and Houseboats (> 5.0 m OAW) with Attached Axles",,,,4.88,,,4.88,,,5.33,36,,4.88,31.5,1,6.9,"4.3.5.D, 4.3.5.E",,, +,None,Trucks,Mandatory,None,,,3.2,4.3,16,3.2,4.3,16,3.2,4.4,16,3.2,4.3,16,1,6.5,,,, +,None,Trucks,Mandatory,Overdimensional Trailers and Semi-Trailers (For Export),,,3.65,,,3.65,,,3.65,,,3.65,,,,,5.3.12.D.,,, +,None,Trucks,Mandatory,Park Model Homes with Attached Axles,,,4.4,4.88,31.5,4.4,4.88,31.5,4.4,5.33,31.5,4.4,4.88,31.5,3.0,6.9,4.3.4,,, +,None,Trucks,Mandatory,Pony Trailers,,,3.2,4.3,,3.2,4.3,,3.2,5.33,,3.2,4.3,,,6.5,5.3.12.G.,,, +,None,Trucks Equipped with Front or Underbody Plow Blades,Prohibited,None,,,3.2,,,3.2,,,3.2,,,3.2,,,,,5.3.13,,, +X,Non-Reducible Loads,Truck Tractors,Mandatory,Semi-Trailers - Logging,,,3.8,4.15,27.5,3.8,4.15,27.5,3.8,4.15,27.5,3.8,4.15,27.5,,,5.3.9.A./5.3.9.B.,,, +X,Non-Reducible Loads,Picker Truck Tractors,Mandatory,Oil and Gas - Oversize Oilfield Flat Deck Semi-Trailers,X,X,3.3,4.3,23,3.3,4.3,23,3.3,4.3,23,3.3,4.3,23,3,6.5,5.3.8.B.,,, +,Non-Reducible Loads,Picker Truck Tractors,Mandatory,Semi-Trailers,X,X,5,4.88,25,5,4.88,25,5,5.33,25,5,4.88,25,3,,5.3.9.A./5.3.9.B.,non compliant vehicle,, +,Non-Reducible Loads,Picker Truck Tractors,Mandatory,Semi-Trailers - Hiboys/Expandos,X,X,5,4.4,25,5,4.4,25,5,5.33,25,5,4.4,25,3,,5.3.9.A./5.3.9.B.,,, +,Non-Reducible Loads,Picker Truck Tractors,Mandatory,Semi-Trailers - Hiboys/Flat Decks,X,X,5,4.4,25,5,4.4,25,5,5.33,25,5,4.4,25,3,,5.3.9.A./5.3.9.B.,,, +X,Non-Reducible Loads,Picker Truck Tractors,Mandatory,"Semi-Trailers - Single Drop, Double Drop, Step Decks, Lowbed, Expandos, etc.",X,X,5,4.88,25,5,4.88,25,5,5.33,25,5,4.88,25,3,,5.3.9.A./5.3.9.B.,,, +,Non-Reducible Loads,Picker Truck Tractors,Mandatory,Semi-Trailers - Steering Trailers,X,X,5,4.88,27.5,5,4.88,27.5,5,5.33,27.5,5,4.88,27.5,,,,,, +X,Non-Reducible Loads,Picker Truck Tractors,Mandatory,Semi-Trailers - Wheelers,X,X,5,4.88,27.5,5,4.88,27.5,5,5.33,27.5,5,4.88,27.5,,,,,, +,Non-Reducible Loads,Picker Truck Tractors,Mandatory,Semi-Trailers - Wide Wheelers,X,X,5,4.88,27.5,5,4.88,27.5,5,5.33,27.5,5,4.88,27.5,,,,,, +,Non-Reducible Loads,Picker Truck Tractors,Mandatory,Semi-Trailers with Crane,X,X,5,4.88,27.5,5,4.88,27.5,5,5.33,27.5,5,4.88,27.5,,,,,, +,Non-Reducible Loads,Picker Truck Tractors,Mandatory,Steering Trailers - Manned,X,X,5,4.88,40,5,4.88,40,5,5.33,40,5,4.88,40,,,,,, +,Non-Reducible Loads,Picker Truck Tractors,Mandatory,Steering Trailers - Self/Remote,X,X,5,4.88,36,5,4.88,36,5,5.33,36,5,4.88,36,,,,,, +X,Non-Reducible Loads,Truck Tractors,Mandatory,Platform Trailers,X,X,5,4.88,27.5,5,4.88,27.5,5,5.33,27.5,5,4.88,27.5,,,4.2.4/4.2.5i)/4.2.6,,, +,Non-Reducible Loads,Truck Tractors,Mandatory,Semi-Trailers,X,X,5,4.88,27.5,5,4.88,27.5,5,5.33,27.5,5,4.88,27.5,,,4.2.4/4.2.5i)/4.2.6,,, +,Non-Reducible Loads,Truck Tractors,Mandatory,Semi-Trailers - A-Trains and C-Trains,,,5,4.4,26,5,4.4,26,5,5.33,26,5,4.4,26,,,4.2.4/4.2.5i)/4.2.6,,, +,Non-Reducible Loads,Truck Tractors,Mandatory,Semi-Trailers - B-Trains,,,5,4.4,27.5,5,4.4,27.5,5,5.33,27.5,5,4.4,27.5,,,4.2.4/4.2.5i)/4.2.6,,, +,Non-Reducible Loads,Truck Tractors,Mandatory,Semi-Trailers - Hiboys/Expandos,X,X,5,4.4,27.5,5,4.4,27.5,5,5.33,27.5,5,4.4,27.5,,,4.2.4/4.2.5i)/4.2.6,,, +,Non-Reducible Loads,Truck Tractors,Mandatory,Semi-Trailers - Hiboys/Flat Decks,X,X,5,4.4,27.5,5,4.4,27.5,5,5.33,27.5,5,4.4,27.5,,,4.2.4/4.2.5i)/4.2.6,,, +,Non-Reducible Loads,Truck Tractors,Mandatory,"Semi-Trailers - Single Drop, Double Drop, Step Decks, Lowbed, Expandos, etc.",X,X,5,4.88,27.5,5,4.88,27.5,5,5.33,27.5,5,4.88,27.5,,,4.2.4/4.2.5i)/4.2.6,,, +X,Non-Reducible Loads,Truck Tractors,Mandatory,Semi-Trailers - Steering Trailers,X,X,5,4.88,27.5,5,4.88,27.5,5,5.33,27.5,5,4.88,27.5,,,4.2.4/4.2.5i)/4.2.6,,, +,Non-Reducible Loads,Truck Tractors,Mandatory,Semi-Trailers - Wheelers,X,X,5,4.88,27.5,5,4.88,27.5,5,5.33,27.5,5,4.88,27.5,,,4.2.4/4.2.5i)/4.2.6,,, +,Non-Reducible Loads,Truck Tractors,Mandatory,Semi-Trailers - Wide Wheelers,X,X,5,4.88,27.5,5,4.88,27.5,5,5.33,27.5,5,4.88,27.5,,,4.2.4/4.2.5i)/4.2.6,,, +,Non-Reducible Loads,Truck Tractors,Mandatory,Semi-Trailers with Crane,X,X,5,4.88,27.5,5,4.88,27.5,5,5.33,27.5,5,4.88,27.5,,,4.2.4/4.2.5i)/4.2.6,,, +,Non-Reducible Loads,Truck Tractors,Mandatory,Steering Trailers - Manned,X,X,5,4.88,40,5,4.88,40,5,5.33,40,5,4.88,40,,,4.2.4/4.2.5i)/4.2.6,,, +,Non-Reducible Loads,Truck Tractors,Mandatory,Steering Trailers - Self/Remote,X,X,5,4.88,36,5,4.88,36,5,5.33,36,5,4.88,36,,,4.2.4/4.2.5i)/4.2.6,,, +X,Non-Reducible Loads,Truck Tractors - Stinger Steered,Mandatory,Semi-Trailers,,,,4.88,25,,4.88,25,,5.33,25,,4.88,25,1,1.2,4.2.7.A.2/4.2.7.B.B/ 5.3.11,,, +,Non-Reducible Loads,Truck Tractors - Stinger Steered,Mandatory,Semi-Trailers - Stinger Steered Automobile Transporters,,,,4.88,25,,4.88,25,,5.33,25,,4.88,25,1,1.2,4.2.7.A.2/4.2.7.B.B/ 5.3.11,,, +,Non-Reducible Loads,Trucks,Mandatory,Dollies,,,5,4.88,25,5,4.88,25,5,5.33,25,5,4.88,25,1,6.5,4.2.7.A.2/4.2.7.B.B/ 5.3.11,,, +,Non-Reducible Loads,Trucks,Mandatory,Full Trailers,,,5,4.88,25,5,4.88,25,5,5.33,25,5,4.88,25,1,6.5,4.2.7.B.G,,, +,Non-Reducible Loads,Trucks,Prohibited,None,,,5,4.88,16,5,4.88,16,5,5.33,16,5,4.88,16,1,6.5,4.2.7.B.G,,, +,Non-Reducible Loads,Trucks,Mandatory,Pony Trailers,,,5,4.88,25,5,4.88,25,5,5.33,25,5,4.88,25,1,6.5,4.2.7.B.G,,, +,Oil Field Equipment,Oil and Gas - Bed Trucks,Mandatory,Expando Semi-Trailers,X,X,,4.3,27.5,,4.3,27.5,,4.3,27.5,,4.3,27.5,3,6.5,5.3.8.C.,,, +,Oil Field Equipment,Oil and Gas - Bed Trucks,Prohibited,None,,,3.3,4.3,14,3.3,4.3,14,3.3,4.3,14,3.3,4.3,14,,5,5.3.8.A.i)/ii),,, +,Oil Field Equipment,Oil and Gas - Bed Trucks,Mandatory,Oil and Gas - Oversize Oilfield Flat Deck Semi-Trailers,X,X,3.3,4.3,23,3.3,4.3,23,3.3,4.3,23,3.3,4.3,23,3,6.5,5.3.8.B.,,, +,Oil Field Equipment,Oil and Gas - Oilfield Sows,Prohibited,None,,,3.2,4.3,15,3.2,4.3,15,3.2,4.3,15,3.2,4.3,15,,5,5.3.8.D.,,, +,Oil Field Equipment,Oil and Gas - Oilfield Sows,Mandatory,Semi-Trailers - Hiboys/Flat Decks,X,X,3.2,4.3,25,3.2,4.3,25,3.2,4.3,25,3.2,4.3,25,3,6.5,5.3.8.E.,,, +,Oil Field Equipment,Oil and Gas - Service Rigs,Prohibited,None,,,3.8,4.3,15,3.8,4.3,15,3.8,4.3,15,3.8,4.3,15,10,6.5,5.3.8.F.,,, +,Oil Field Equipment,Oil and Gas - Service Rigs,Mandatory,Pony Trailers,,,3.8,4.3,23,3.8,4.3,23,3.8,4.3,23,3.8,4.3,23,10,6.5,5.3.8.F.i),,, +x,Oil Field Equipment,"Oil and Gas - Service Rigs and Rathole Augers Only Equipped with Heavy Front Projected Crane (must exceed 14,000 kg tare weight)",Prohibited,None,,,2.9,4.15,15.5,2.9,4.15,15.5,2.9,4.15,15.5,2.9,4.15,15.5,10,6.5,5.3.8.F.,,, +x,Oil Field Equipment,"Oil and Gas - Service Rigs and Rathole Augers Only Equipped with Heavy Front Projected Crane (must exceed 14,000 kg tare weight)",Mandatory,Pony Trailers,,,2.9,4.15,23,2.9,4.15,23,2.9,4.15,23,2.9,4.15,23,10,6.5,5.3.8.F.i),,, +,Oil Field Equipment,Truck Tractors,Mandatory,Oil and Gas - Oversize Oilfield Flat Deck Semi-Trailers,X,X,3.3,4.3,23,3.3,4.3,23,3.3,4.3,23,3.3,4.3,23,3,6.5,5.3.8.B.,,, +X,Park Model Homes,Trucks,Mandatory,Dollies,,,4.4,4.88,31.5,4.4,4.88,31.5,4.4,5.33,31.5,4.4,4.88,31.5,3.0,6.9,4.3.4,,, +X,Park Model Homes,Trucks,Mandatory,Float Trailers,,,4.4,4.88,31.5,4.4,4.88,31.5,4.4,5.33,31.5,4.4,4.88,31.5,3.0,6.9,4.3.4,,, +X,Park Model Homes,Trucks,Mandatory,Pony Trailers,,,4.4,4.88,31.5,4.4,4.88,31.5,4.4,5.33,31.5,4.4,4.88,31.5,3.0,6.9,4.3.4,,, +,"Pipe And Steel Products (Rebar, Pilings, Reinforcing Steel, Etc.)",Truck Tractors,Mandatory,Semi-Trailers - Hiboys/Expandos,X,X,3.2,4.3,31,3.2,4.3,31,3.2,4.3,31,3.2,4.3,31,3,6.5,4.2.5.A.ii)/4.2.7.A.14,,, +,"Pipe And Steel Products (Rebar, Pilings, Reinforcing Steel, Etc.)",Truck Tractors,Mandatory,Semi-Trailers - Hiboys/Flat Decks,X,X,3.2,4.3,27.5,3.2,4.3,27.5,3.2,4.3,27.5,3.2,4.3,27.5,3,6.5,4.2.5.A.ii),,, +,"Pipe And Steel Products (Rebar, Pilings, Reinforcing Steel, Etc.)",Truck Tractors,Mandatory,Semi-Trailers - Steering Trailers,X,X,3.2,4.3,36,3.2,4.3,36,3.2,4.3,36,3.2,4.3,36,3,6.5,4.2.7.B.H,,, +X,"Pipe And Steel Products (Rebar, Pilings, Reinforcing Steel, Etc.)",Truck Tractors,Mandatory,Steering Trailers - Manned,X,X,3.2,4.3,40,3.2,4.3,40,3.2,4.3,40,3.2,4.3,40,3,6.5,4.2.7.B.H,,, +,Reducible Loads,Truck Tractors,Mandatory,Semi-Trailers - Logging,,,3.2,4.15,27.5,3.2,4.15,27.5,3.2,4.15,27.5,3.2,4.15,27.5,,,4.2.4/4.2.5i)/4.2.6,,, +,Reducible Loads,Picker Truck Tractors,Mandatory,Semi-Trailers,X,X,3.2,4.3,27.5,3.2,4.3,27.5,3.2,5.33,27.5,3.2,4.3,27.5,3,,4.2.4/4.2.5i)/4.2.6,,, +,Reducible Loads,Picker Truck Tractors,Mandatory,Semi-Trailers - Hiboys/Expandos,X,X,3.2,4.3,27.5,3.2,4.3,27.5,3.2,5.33,27.5,3.2,4.3,27.5,3,,4.2.4/4.2.5i)/4.2.6,,, +,Reducible Loads,Picker Truck Tractors,Mandatory,Semi-Trailers - Hiboys/Flat Decks,X,X,3.2,4.3,27.5,3.2,4.3,27.5,3.2,5.33,27.5,3.2,4.3,27.5,3,,4.2.4/4.2.5i)/4.2.6,,, +,Reducible Loads,Picker Truck Tractors,Mandatory,"Semi-Trailers - Single Drop, Double Drop, Step Decks, Lowbed, Expandos, etc.",X,X,3.2,4.3,27.5,3.2,4.3,27.5,3.2,5.33,27.5,3.2,4.3,27.5,3,,4.2.4/4.2.5i)/4.2.6,,, +X,Reducible Loads,Truck Tractors,Mandatory,Platform Trailers,X,X,3.2,4.3,27.5,3.2,4.3,27.5,3.2,5.33,27.5,3.2,4.3,27.5,,,4.2.4/4.2.5i)/4.2.6,,, +,Reducible Loads,Truck Tractors,Mandatory,Semi-Trailers,X,X,3.2,4.3,27.5,3.2,4.3,27.5,3.2,5.33,27.5,3.2,4.3,27.5,,,4.2.4/4.2.5i)/4.2.6,,, +,Reducible Loads,Truck Tractors,Mandatory,Semi-Trailers - A-Trains and C-Trains,,,3.2,4.3,26,3.2,4.3,26,3.2,5.33,26,3.2,4.3,26,,,4.2.4/4.2.5i)/4.2.6,,, +,Reducible Loads,Truck Tractors,Mandatory,Semi-Trailers - B-Trains,,,3.2,4.3,27.5,3.2,4.3,27.5,3.2,5.33,27.5,3.2,4.3,27.5,,,4.2.4/4.2.5i)/4.2.6,,, +,Reducible Loads,Truck Tractors,Mandatory,Semi-Trailers - Hiboys/Expandos,X,X,3.2,4.3,27.5,3.2,4.3,27.5,3.2,5.33,27.5,3.2,4.3,27.5,,,4.2.4/4.2.5i)/4.2.6,,, +,Reducible Loads,Truck Tractors,Mandatory,Semi-Trailers - Hiboys/Flat Decks,X,X,3.2,4.3,27.5,3.2,4.3,27.5,3.2,5.33,27.5,3.2,4.3,27.5,,,4.2.4/4.2.5i)/4.2.6,,, +,Reducible Loads,Truck Tractors,Mandatory,"Semi-Trailers - Single Drop, Double Drop, Step Decks, Lowbed, Expandos, etc.",X,X,3.2,4.3,27.5,3.2,4.3,27.5,3.2,5.33,27.5,3.2,4.3,27.5,,,4.2.4/4.2.5i)/4.2.6,,, +,Reducible Loads,Truck Tractors,Mandatory,Semi-Trailers - Steering Trailers,X,X,3.2,4.3,27.5,3.2,4.3,27.5,3.2,5.33,27.5,3.2,4.3,27.5,,,4.2.4/4.2.5i)/4.2.6,,, +X,Reducible Loads,Truck Tractors,Mandatory,Semi-Trailers - Wheelers,X,X,3.2,4.3,27.5,3.2,4.3,27.5,3.2,5.33,27.5,3.2,4.3,27.5,,,4.2.4/4.2.5i)/4.2.6,,, +X,Reducible Loads,Truck Tractors,Mandatory,Semi-Trailers - Wide Wheelers,X,X,3.2,4.3,27.5,3.2,4.3,27.5,3.2,5.33,27.5,3.2,4.3,27.5,,,4.2.4/4.2.5i)/4.2.6,,, +,Reducible Loads,Truck Tractors,Mandatory,Semi-Trailers with Crane,X,X,3.2,4.3,27.5,3.2,4.3,27.5,3.2,5.33,27.5,3.2,4.3,27.5,,,4.2.4/4.2.5i)/4.2.6,,, +X,Reducible Loads,Truck Tractors,Mandatory,Steering Trailers - Manned,X,X,3.2,4.3,40,3.2,4.3,40,3.2,5.33,40,3.2,4.3,40,,,4.2.4/4.2.5i)/4.2.6,,, +,Reducible Loads,Truck Tractors,Mandatory,Steering Trailers - Self/Remote,X,X,3.2,4.3,36,3.2,4.3,36,3.2,5.33,36,3.2,4.3,36,,,4.2.4/4.2.5i)/4.2.6,,, +,Reducible Loads,Truck Tractors - Stinger Steered,Mandatory,Semi-Trailers,,,,4.3,25,,4.3,25,,5.33,25,,4.3,25,1,1.2,4.2.4/4.2.5i)/4.2.6,,, +,Reducible Loads,Truck Tractors - Stinger Steered,Mandatory,Semi-Trailers - Stinger Steered Automobile Transporters,,,,4.3,25,,4.3,25,,5.33,25,,4.3,25,1,1.2,4.2.4/4.2.5i)/4.2.6,,, +,Reducible Loads,Trucks,Mandatory,Dollies,,,3.2,4.3,25,3.2,4.3,25,3.2,4.4,25,3.2,4.3,25,1,6.5,4.2.4/4.2.5i)/4.2.6,,, +,Reducible Loads,Trucks,Mandatory,Full Trailers,,,3.2,4.3,25,3.2,4.3,25,3.2,4.4,25,3.2,4.3,25,1,6.5,4.2.4/4.2.5i)/4.2.6,,, +,Reducible Loads,Trucks,Prohibited,None,,,3.2,4.3,16,3.2,4.3,16,3.2,4.4,16,3.2,4.3,16,1,6.5,4.2.4/4.2.5i)/4.2.6,,, +,Reducible Loads,Trucks,Mandatory,Pony Trailers,,,3.2,4.3,25,3.2,4.3,25,3.2,4.4,25,3.2,4.3,25,1,6.5,4.2.4/4.2.5i)/4.2.6,,, +X,Scraper on Dollies,Truck Tractors,Mandatory,Dollies,X,,3.2,4.3,25,3.2,4.3,25,3.2,4.4,25,3.2,4.3,25,,,5.3.10.B.,,, +,Tandem Jeep/Pole Trailer Loaded on Logging Truck,Truck Tractors,Prohibited,None,,,2.9,4.3,,2.9,4.3,,2.9,4.3,,2.9,4.3,,,5,4.2.7.A.6/4.5.6.C.,,, +,Tandem Jeep/Pole Trailer Loaded on Logging Truck,Trucks,Prohibited,None,,,2.9,4.3,,2.9,4.3,,2.9,4.3,,2.9,4.3,,,5,4.2.7.A.6/4.5.6.C.,,, +,Tow Trucks And Disabled Vehicles,Tow Vehicles,Prohibited,None,,,,4.3,27.5,,4.3,27.5,,4.3,27.5,,4.3,27.5,,,5.3.14,,, +,Tri-Axle or Quad Axle Full Trailer Loaded on Logging Truck,Truck Tractors,Prohibited,None,,,,4.3,13.5,,4.3,13.5,,4.3,13.5,,4.3,13.5,,5,4.2.7.A.6/4.5.6.D.,,, +,Tri-Axle or Quad Axle Full Trailer Loaded on Logging Truck,Trucks,Prohibited,None,,,,4.3,13.5,,4.3,13.5,,4.3,13.5,,4.3,13.5,,5,4.2.7.A.6/4.5.6.D.,,, +,"Wood Chips, Residuals",Truck Tractors,Mandatory,Semi-Trailers - B-Trains,,,,4.45,27.5,,4.45,27.5,,4.45,27.5,,4.45,27.5,,,4.2.7.A.16/4.5.4,,, diff --git a/policy-engine/src/_examples/os-dimensions-simplified.csv b/policy-engine/src/_examples/os-dimensions-simplified.csv new file mode 100644 index 000000000..67f29e884 --- /dev/null +++ b/policy-engine/src/_examples/os-dimensions-simplified.csv @@ -0,0 +1,212 @@ +,"Auto Carrier, Campers And Boats (Stinger Steered Transporters Only)",Truck Tractors - Stinger Steered,Mandatory,Semi-Trailers - Stinger Steered Automobile Transporters,,,2.6,4.3,25,2.6,4.3,25,2.6,4.88,25,2.6,4.4,25,1,1.2,4.2.7.A.1/4.2.7.B.A/ 5.3.11,,"Loaded dimensions used, equipment itself is less",FP and RP points can vary in CTPM (i.e. rear projection can be from turn centre or bumper or sometimes bunk!) +,Bridge Beams,Truck Tractors,Mandatory,Pole Trailers,X,,2.6,4.15,31,2.6,4.15,31,2.6,4.15,31,2.6,4.15,31,3,6.5,4.5.5/5.3.12.F.(over 31m use Non-Reducible with Semi-Trailers - Steering Trailers),,"OAL could be greater with steering trailers, do we need two categories?", +,Brushcutters (Peace Only),Truck Tractors,Mandatory,Semi-Trailers,,,2.6,4.15,23,2.6,4.15,23,4.57,5.33,23,2.6,4.15,23,3,6.5,4.2.7.B.B,,tractor semi-trailer could be 23.5 if a tridem , +,Brushcutters (Peace Only),Truck Tractors,Mandatory,"Semi-Trailers - Single Drop, Double Drop, Step Decks, Lowbed, Expandos, etc.",X,X,2.6,4.15,23,2.6,4.15,23,4.57,5.33,23,2.6,4.15,23,3,6.5,4.2.7.B.B,,, +,Brushcutters (Peace Only),Trucks,Mandatory,Full Trailers,,,2.6,4.15,23,2.6,4.15,23,4.57,5.33,23,2.6,4.15,23,1,1,4.2.7.B.B,,, +,Brushcutters (Peace Only),Trucks,Prohibited,None,,,2.6,4.15,12.5,2.6,4.15,12.5,4.57,5.33,12.5,2.6,4.15,12.5,1,1,4.2.7.B.B,,, +,Brushcutters (Peace Only),Trucks,Mandatory,Pony Trailers,,,2.6,4.15,23,2.6,4.15,23,3.8,5.33,23,2.6,4.15,23,1,1,4.2.7.B.B/5.3.12.G,,, +,Doglogger/Sjostrum Trailers (decked),Truck Tractors,Mandatory,None,,,2.6,4.15,13.5,2.6,4.15,13.5,2.6,4.15,13.5,2.6,4.15,13.5,1,5,4.2.7.A.13,,, +,Empty,Truck Tractors,Mandatory,Logging Trailer - Overwidth Bunks,,,3.2,4.15,23,3.2,4.15,23,3.2,4.15,23,3.2,4.15,23,0,0,5.3.5.B,,, +,Empty,Picker Truck Tractors,Mandatory,Oil and Gas - Oversize Oilfield Flat Deck Semi-Trailers,X,X,3.2,4.3,23,3.2,4.3,23,3.2,4.3,23,3.2,4.3,23,3,6.5,5.3.8.B.,,, +X,Empty,Picker Truck Tractors,Mandatory,Platform Trailers,X,X,3.2,4.88,27.5,3.2,4.88,27.5,3.2,5.33,27.5,3.2,4.88,27.5,3,6.5,,,, +,Empty,Picker Truck Tractors,Mandatory,Semi-Trailers - Hiboys/Expandos,X,X,2.6,4.4,25,2.6,4.4,25,2.6,5.33,27.5,2.6,4.4,25,3,6.5,5.3.9.A./5.3.9.B.,,, +X,Empty,Picker Truck Tractors,Mandatory,Semi-Trailers - Wheelers,X,X,3.2,4.88,27.5,3.2,4.88,27.5,3.2,5.33,27.5,3.2,4.88,27.5,3,6.5,,,, +X,Empty,Picker Truck Tractors,Mandatory,Semi-Trailers - Wide Wheelers,X,X,3.2,4.88,27.5,3.2,4.88,27.5,3.2,5.33,27.5,3.2,4.88,27.5,3,6.5,,,, +,Empty,Picker Truck Tractors,Mandatory,Semi-Trailers with Crane,X,X,3.2,4.88,27.5,3.2,4.88,27.5,3.2,5.33,27.5,3.2,4.88,27.5,3,6.5,,,, +X,Empty,Truck Tractors,Mandatory,Platform Trailers,X,X,3.2,4.88,27.5,3.2,4.88,27.5,3.2,5.33,27.5,3.2,4.88,27.5,3,6.5,,,, +,Empty,Truck Tractors,Mandatory,Semi-Trailers - Hiboys/Expandos,X,X,2.6,4.4,31,2.6,4.4,31,2.6,5.33,31,2.6,4.4,31,3,6.5,5.3.12.C.,,, +,Empty,Truck Tractors,Mandatory,Semi-Trailers - Hiboys/Flat Decks,X,X,2.6,4.4,27.5,2.6,4.4,27.5,2.6,5.33,27.5,2.6,4.4,27.5,3,6.5,5.3.12.B.,,, +,Empty,Truck Tractors,Mandatory,"Semi-Trailers - Single Drop, Double Drop, Step Decks, Lowbed, Expandos, etc.",X,X,3.2,4.4,31,3.2,4.4,31,3.2,5.33,31,3.2,4.4,31,3,6.5,5.3.12.A.,,, +X,Empty,Truck Tractors,Mandatory,Semi-Trailers - Wheelers,X,X,3.2,4.88,27.5,3.2,4.88,27.5,3.2,5.33,27.5,3.2,4.88,27.5,3,6.5,,,, +X,Empty,Truck Tractors,Mandatory,Semi-Trailers - Wide Wheelers,X,X,3.2,4.88,27.5,3.2,4.88,27.5,3.2,5.33,27.5,3.2,4.88,27.5,3,6.5,,,, +,Empty,Truck Tractors,Mandatory,Semi-Trailers with Crane,X,X,3.2,4.88,27.5,3.2,4.88,27.5,3.2,5.33,27.5,3.2,4.88,27.5,3,6.5,,,, +,Fixed Equipment,Truck Tractors,Mandatory,Fixed Equipment - Conveyors (Semi-Trailers),X,X,3.8,4.72,31,3.8,4.72,31,3.8,5.33,31,3.8,4.72,31,4,9.5,5.3.4.F.,,, +,Fixed Equipment,Truck Tractors,Mandatory,Fixed Equipment - Counter Flow Asphalt Drum Mixers,X,X,3.8,4.72,31,3.8,4.72,31,3.8,5.33,31,3.8,4.72,31,3,6.5,5.3.4.D.,,, +,Fixed Equipment,Truck Tractors,Mandatory,Fixed Equipment - Portable Asphalt Baghouses,X,X,4.26,4.72,31,4.26,4.72,31,4.26,5.33,31,4.26,4.72,31,3,6.5,5.3.4.E.,,, +,Fixed Equipment,Truck Tractors,Mandatory,Fixed Equipment - Semi-Trailers,X,X,3.8,4.72,31,3.8,4.72,31,3.8,5.33,31,3.8,4.72,31,3,6.5,5.3.4.A.,,, +X,Fixed Equipment,Truck Tractors,Mandatory,Fixed Equipment - Wheeler Semi-Trailers,X,X,3.8,4.72,31,3.8,4.72,31,3.8,5.33,31,3.8,4.72,31,3,6.5,5.3.4.B.,,, +,Fixed Equipment,Trucks,Mandatory,Fixed Equipment - Conveyors (Pony Trailers),,,3.2,4.3,31,3.2,4.3,31,3.2,4.3,31,3.2,4.3,31,4,9.5,5.3.4.F.,,, +,Fixed Equipment,Trucks,Mandatory,Fixed Equipment - Counter Flow Asphalt Drum Mixers,,,3.8,4.72,31,3.8,4.72,31,3.8,5.33,31,3.8,4.72,31,3,6.5,5.3.4.D.,,, +,Fixed Equipment,Trucks,Mandatory,Fixed Equipment - Pony Trailers,,,3.2,4.3,31,3.2,4.3,31,3.2,4.3,31,3.2,4.3,31,1,4,5.3.4.C.,,, +,Fixed Equipment,Trucks,Mandatory,Fixed Equipment - Portable Asphalt Baghouses,,,4.26,4.72,31,4.26,4.72,31,4.26,4.72,31,4.26,4.72,31,3,6.5,5.3.4.E.,,, +,Garbage Bins,Trucks,Mandatory,Full Trailers,,,2.6,4.15,23,2.6,4.15,23,2.6,4.15,23,2.6,4.15,23,3,6.5,4.2.7.A.7,,, +,Garbage Bins,Trucks,Prohibited,None,,,2.6,4.15,12.5,2.6,4.15,12.5,2.6,4.15,12.5,2.6,4.15,12.5,3,6.5,4.2.7.A.7,,, +,Garbage Bins,Trucks,Mandatory,Pony Trailers,,,2.6,4.15,23,2.6,4.15,23,2.6,4.15,23,2.6,4.15,23,3,6.5,4.2.7.A.7,,, +,"Grader, Tractor Blades, Buckets",Fixed Equipment - Trucks/Graders etc.,Prohibited,None,,,4.4,4.15,12.5,4.4,4.15,12.5,4.4,4.15,12.5,4.4,4.15,12.5,1,1,4.2.7.B.C,,, +,Hay Bales (Round) Peace River Only,Truck Tractors,Mandatory,Semi-Trailers - A-Trains and C-Trains,,,3.5,4.3,26,3.5,4.3,26,3.84,4.8,26,3.5,4.3,26,1,1,4.2.7.A.8/4.4.2,,, +,Hay Bales (Round) Peace River Only,Truck Tractors,Mandatory,Semi-Trailers - B-Trains,,,3.5,4.3,27.5,3.5,4.3,27.5,3.84,4.8,27.5,3.5,4.3,27.5,1,1,4.2.7.A.8/4.4.2,,, +,Hay Bales (Round) Peace River Only,Truck Tractors,Mandatory,Semi-Trailers - Hiboys/Flat Decks,X,X,3.5,4.3,23,3.5,4.3,23,3.84,4.8,23,3.5,4.3,23,3,6.5,4.2.7.A.8/4.4.2,,, +,Hay Bales (Round) Peace River Only,Truck Tractors,Mandatory,"Semi-Trailers - Single Drop, Double Drop, Step Decks, Lowbed, Expandos, etc.",X,X,3.5,4.3,23,3.5,4.3,23,3.84,4.8,23,3.5,4.3,23,3,6.5,4.2.7.A.8/4.4.2,,, +,Hay Bales (Round) Peace River Only,Trucks,Mandatory,Full Trailers,,,3.5,4.3,23,3.5,4.3,23,3.84,4.8,23,3.5,4.3,23,1,4,4.2.7.A.8/4.4.2,,, +,Hay Bales (Round) Peace River Only,Trucks,Prohibited,None,,,3.5,4.3,12.5,3.5,4.3,12.5,3.84,4.8,12.5,3.5,4.3,12.5,1,1,4.2.7.A.8/4.4.2,,, +,Hay Bales (Round) Peace River Only,Trucks,Mandatory,Pony Trailers,,,3.5,4.3,23,3.5,4.3,23,3.84,4.8,23,3.5,4.3,23,1,4,4.2.7.A.8/4.4.2,,, +,Hay Bales Large Rectangular,Truck Tractors,Mandatory,Semi-Trailers - A-Trains and C-Trains,,,3.05,4.3,26,3.05,4.3,26,3.05,4.8,26,3.05,4.3,26,1,1,4.2.7.A.8/4.4.1,,, +,Hay Bales Large Rectangular,Truck Tractors,Mandatory,Semi-Trailers - B-Trains,,,3.05,4.3,27.5,3.05,4.3,27.5,3.05,4.8,27.5,3.05,4.3,27.5,1,1,4.2.7.A.8/4.4.1,,, +,Hay Bales Large Rectangular,Truck Tractors,Mandatory,Semi-Trailers - Hiboys/Flat Decks,X,X,3.05,4.3,23,3.05,4.3,23,3.05,4.8,23,3.05,4.4,23,3,6.5,4.2.7.A.8/4.4.1,,, +,Hay Bales Large Rectangular,Truck Tractors,Mandatory,"Semi-Trailers - Single Drop, Double Drop, Step Decks, Lowbed, Expandos, etc.",X,X,3.05,4.3,23,3.05,4.3,23,3.05,4.8,23,3.05,4.3,23,3,6.5,4.2.7.A.8/4.4.1,,, +,Hay Bales Large Rectangular,Trucks,Mandatory,Full Trailers,,,3.05,4.3,23,3.05,4.3,23,3.05,4.8,23,3.05,4.3,23,1,4,4.2.7.A.8/4.4.1,,, +,Hay Bales Large Rectangular,Trucks,Prohibited,None,,,3.05,4.3,12.5,3.05,4.3,12.5,3.05,4.8,12.5,3.05,4.3,12.5,1,1,4.2.7.A.8/4.4.1,,, +,Hay Bales Large Rectangular,Trucks,Mandatory,Pony Trailers,,,3.05,4.3,23,3.05,4.3,23,3.05,4.8,23,3.05,4.3,23,1,4,4.2.7.A.8/4.4.1,,, +,Hay Bales Round,Truck Tractors,Mandatory,Semi-Trailers - A-Trains and C-Trains,,,3.5,4.3,26,3.5,4.3,26,3.84,4.8,26,3.5,4.3,26,1,1,4.2.7.A.8/4.4.2,,, +,Hay Bales Round,Truck Tractors,Mandatory,Semi-Trailers - B-Trains,,,3.5,4.3,27.5,3.5,4.3,27.5,3.84,4.8,27.5,3.5,4.3,27.5,1,1,4.2.7.A.8/4.4.2,,, +,Hay Bales Round,Truck Tractors,Mandatory,Semi-Trailers - Hiboys/Flat Decks,X,X,3.5,4.3,23,3.5,4.3,23,3.84,4.8,23,3.5,4.3,23,3,6.5,4.2.7.A.8/4.4.2,,, +,Hay Bales Round,Truck Tractors,Mandatory,"Semi-Trailers - Single Drop, Double Drop, Step Decks, Lowbed, Expandos, etc.",X,X,3.5,4.3,23,3.5,4.3,23,3.84,4.8,23,3.5,4.3,23,3,6.5,4.2.7.A.8/4.4.2,,, +,Hay Bales Round,Trucks,Mandatory,Full Trailers,,,3.5,4.3,23,3.5,4.3,23,3.84,4.8,23,3.5,4.3,23,1,4,4.2.7.A.8/4.4.2,,, +,Hay Bales Round,Trucks,Prohibited,None,,,3.5,4.3,12.5,3.5,4.3,12.5,3.84,4.8,12.5,3.5,4.3,12.5,1,1,4.2.7.A.8/4.4.2,,, +,Hay Bales Round,Trucks,Mandatory,Pony Trailers,,,3.5,4.3,23,3.5,4.3,23,3.84,4.8,23,3.5,4.3,23,1,4,4.2.7.A.8/4.4.2,,, +,Hay Bales Small Rectangular,Truck Tractors,Mandatory,Semi-Trailers - A-Trains and C-Trains,,,3.05,4.3,26,3.05,4.3,26,3.05,4.8,26,3.05,4.3,26,1,1,4.2.7.A.8/4.4.1,,, +,Hay Bales Small Rectangular,Truck Tractors,Mandatory,Semi-Trailers - B-Trains,,,3.05,4.3,27.5,3.05,4.3,27.5,3.05,4.8,27.5,3.05,4.3,27.5,1,1,4.2.7.A.8/4.4.1,,, +,Hay Bales Small Rectangular,Truck Tractors,Mandatory,Semi-Trailers - Hiboys/Flat Decks,X,X,3.05,4.3,23,3.05,4.3,23,3.05,4.8,23,3.05,4.3,23,3,6.5,4.2.7.A.8/4.4.1,,, +,Hay Bales Small Rectangular,Truck Tractors,Mandatory,"Semi-Trailers - Single Drop, Double Drop, Step Decks, Lowbed, Expandos, etc.",X,X,3.05,4.3,23,3.05,4.3,23,3.05,4.8,23,3.05,4.3,23,3,6.5,4.2.7.A.8/4.4.1,,, +,Hay Bales Small Rectangular,Trucks,Mandatory,Full Trailers,,,3.05,4.3,23,3.05,4.3,23,3.05,4.8,23,3.05,4.3,23,1,4,4.2.7.A.8/4.4.1,,, +,Hay Bales Small Rectangular,Trucks,Prohibited,None,,,3.05,4.3,12.5,3.05,4.3,12.5,3.05,4.8,12.5,3.05,4.3,12.5,1,1,4.2.7.A.8/4.4.1,,, +,Hay Bales Small Rectangular,Trucks,Mandatory,Pony Trailers,,,3.05,4.3,23,3.05,4.3,23,3.05,4.8,23,3.05,4.3,23,1,4,4.2.7.A.8/4.4.1,,, +,Hayrack Semi-Trailer with a Folded Chassis/Empty Piggyback,Truck Tractors,Mandatory,Semi-Trailers - Logging,,,2.6,4.15,23,2.6,4.15,23,2.6,4.15,23,2.6,4.15,23,1,5,4.5.6.E.,,, +,Intermodal Containers,Truck Tractors,Mandatory,Semi-Trailers - A-Trains and C-Trains,,,2.6,4.4,26,2.6,4.4,26,2.6,4.4,26,2.6,4.4,26,1,1,4.2.7.A.9,,, +,Intermodal Containers,Truck Tractors,Mandatory,Semi-Trailers - B-Trains,,,2.6,4.4,27.5,2.6,4.4,27.5,2.6,4.4,27.5,2.6,4.4,27.5,1,1,4.2.7.A.9,,, +,Intermodal Containers,Truck Tractors,Mandatory,Semi-Trailers - Hiboys/Flat Decks,X,X,2.6,4.4,23,2.6,4.4,23,2.6,4.4,23,2.6,4.4,23,1,1,4.2.7.A.9,,, +,Intermodal Containers,Trucks,Mandatory,None,,,2.6,4.4,12.5,2.6,4.4,12.5,2.6,4.4,12.5,2.6,4.4,12.5,1,1,4.2.7.A.9,,, +,Intermodal Containers without Sides,Truck Tractors,Mandatory,"Semi-Trailers - Single Drop, Double Drop, Step Decks, Lowbed, Expandos, etc.",X,X,4.4,4.72,23,4.4,4.72,23,4.4,4.72,23,4.4,4.72,23,1,1,4.2.7.10/4.2.7.B.D.,,, +,Laminated Beams,Truck Tractors,Mandatory,Pole Trailers,X,X,2.6,4.15,40,2.6,4.15,40,2.6,4.15,40,2.6,4.15,40,3,6.5,4.5.3,,, +,Laminated Beams,Truck Tractors,Mandatory,Semi-Trailers - Hiboys/Expandos,X,X,2.6,4.15,31,2.6,4.15,31,2.6,4.15,31,2.6,4.15,31,3,6.5,4.5.3,,, +X,"Logs, Poles And Boomsticks (Over 20.1)",Truck Tractors,Mandatory,"Logging Trailer - Full Trailers, Tri Axle, Quad Axle",,,2.6,4.15,40,2.6,4.15,40,2.6,4.15,40,2.6,4.15,40,10,10,4.5.2,,, +X,"Logs, Poles And Boomsticks (Over 20.1)",Truck Tractors,Mandatory,Pole Trailers,X,X,2.6,4.15,40,2.6,4.15,40,2.6,4.15,40,2.6,4.15,40,8,9,4.5.2,,, +,"Logs, Poles And Boomsticks (Over 20.1)",Truck Tractors,Mandatory,Steering Trailers - Manned,X,X,2.6,4.15,40,2.6,4.15,40,2.6,4.15,40,2.6,4.15,40,10,10,5.3.12.F,,, +,"Logs, Poles And Boomsticks (Over 20.1)",Truck Tractors,Mandatory,Steering Trailers - Self/Remote,X,X,2.6,4.15,36,2.6,4.15,36,2.6,4.15,36,2.6,4.15,36,10,10,5.3.12.F,,, +,"Logs, Poles And Boomsticks (Up To 20.1)",Truck Tractors,Mandatory,Full Trailers,,,2.9,4.15,27.5,2.9,4.15,27.5,2.9,4.15,27.5,2.9,4.15,27.5,3,6.5,4.5.1,,, +,"Logs, Poles And Boomsticks (Up To 20.1)",Truck Tractors,Mandatory,Legacy Logging Trailer Combinations,,,2.6,4.15,25,2.6,4.15,25,2.6,4.15,25,2.6,4.15,25,3,5,5.3.7.C.,,, +,"Logs, Poles And Boomsticks (Up To 20.1)",Truck Tractors,Mandatory,Pole Trailers,X,,2.9,4.15,27.5,2.9,4.15,27.5,2.9,4.15,27.5,2.9,4.15,27.5,3,6.5,4.5.1,,, +,"Logs, Poles And Boomsticks (Up To 20.1)",Truck Tractors,Mandatory,Semi-Trailers - A-Trains and C-Trains,,,2.9,4.15,26,2.9,4.15,26,2.9,4.15,26,2.9,4.15,26,3,6.5,4.5.1,,, +,"Logs, Poles And Boomsticks (Up To 20.1)",Truck Tractors,Mandatory,Semi-Trailers - B-Trains,,,2.9,4.15,27.5,2.9,4.15,27.5,2.9,4.15,27.5,2.9,4.15,27.5,3,6.5,4.5.1,,, +,"Logs, Poles And Boomsticks (Up To 20.1)",Truck Tractors,Mandatory,Semi-Trailers - Hiboys/Flat Decks,,,2.9,4.15,25,2.9,4.15,25,2.9,4.15,25,2.9,4.15,25,3,6.5,4.5.1,,, +,"Logs, Poles And Boomsticks (Up To 20.1)",Truck Tractors,Mandatory,Semi-Trailers - Logging,,,2.9,4.15,25,2.9,4.15,25,2.9,4.15,25,2.9,4.15,25,3,6.5,4.5.1,,, +,"Manufactured Homes, Modular Buildings, Structures and Houseboats (<= 5.0 m OAW)",Truck Tractors,Mandatory,Semi-Trailers,X,X,5.0,4.88,31.5,5.0,4.88,31.5,5.0,5.33,36,5.0,4.88,31.5,3.0,7.5,4.3.5,,, +,"Manufactured Homes, Modular Buildings, Structures and Houseboats (<= 5.0 m OAW)",Truck Tractors,Mandatory,"Semi-Trailers - Single Drop, Double Drop, Step Decks, Lowbed, Expandos, etc.",X,X,5.0,4.88,31.5,5.0,4.88,31.5,5.0,5.33,36,5.0,4.88,31.5,3.0,7.5,4.3.5,,, +X,"Manufactured Homes, Modular Buildings, Structures and Houseboats (<= 5.0 m OAW)",Trucks,Mandatory,Dollies,,,5.0,4.88,31.5,5.0,4.88,31.5,5.0,5.33,36,5.0,4.88,31.5,1,6.9,4.3,,, +X,"Manufactured Homes, Modular Buildings, Structures and Houseboats (<= 5.0 m OAW)",Trucks,Mandatory,Float Trailers,,,5.0,4.57,31.5,5.0,4.57,31.5,5.0,5.33,36,5.0,4.57,31.5,1,6.9,4.3.5.F,,, +,"Manufactured Homes, Modular Buildings, Structures and Houseboats (<= 5.0 m OAW)",Trucks,Mandatory,Pony Trailers,,,5.0,4.88,31.5,5.0,4.88,31.5,5.0,5.33,36,5.0,4.88,31.5,1,6.9,4.3,,, +,"Manufactured Homes, Modular Buildings, Structures and Houseboats (> 5.0 m OAW)",Truck Tractors,Mandatory,Semi-Trailers,X,X,6.0,4.88,31.5,6.0,4.88,31.5,6.1,5.33,36,6.0,4.88,31.5,3.0,7.5,4.3.5,,, +,"Manufactured Homes, Modular Buildings, Structures and Houseboats (> 5.0 m OAW)",Truck Tractors,Mandatory,"Semi-Trailers - Single Drop, Double Drop, Step Decks, Lowbed, Expandos, etc.",X,X,6.0,4.88,31.5,6.0,4.88,31.5,6.1,5.33,36,6.0,4.88,31.5,3.0,7.5,4.3.5,,, +X,"Manufactured Homes, Modular Buildings, Structures and Houseboats (> 5.0 m OAW)",Trucks,Mandatory,Dollies,,,6.0,4.88,31.5,6.0,4.88,31.5,6.1,5.33,36,6.0,4.88,31.5,1,6.9,4.3,,, +X,"Manufactured Homes, Modular Buildings, Structures and Houseboats (> 5.0 m OAW)",Trucks,Mandatory,Float Trailers,,,6.0,4.57,31.5,6.0,4.57,31.5,6.1,5.33,36,6.0,4.57,31.5,1,6.9,4.3.5.F,,, +X,"Manufactured Homes, Modular Buildings, Structures and Houseboats (> 5.0 m OAW)",Trucks,Mandatory,Pony Trailers,,,6.0,4.88,31.5,6.0,4.88,31.5,6.1,5.33,36,6.0,4.88,31.5,1,6.9,4.3,,, +,None,Concrete Pumper Trucks,Prohibited,None,,X,2.6,4.15,15.5,2.6,4.15,15.5,2.6,4.15,15.5,2.6,4.15,15.5,3,6.5,5.3.2.A.,,, +,None,"Cranes, Rubber-Tired Loaders, Firetrucks - All Terrain",Prohibited,Dollies,,,3.8,4.3,25,3.8,4.3,25,3.8,4.3,25,3.8,4.3,25,10,6.5,5.3.3.B.,,, +,None,"Cranes, Rubber-Tired Loaders, Firetrucks - All Terrain",Prohibited,None,,,3.8,4.3,14,3.8,4.3,14,3.8,4.3,15,3.8,4.3,14,10,6.5,5.3.3.B.,,, +,None,"Cranes, Rubber-Tired Loaders, Firetrucks - Mobile",Prohibited,Dollies,,,3.8,4.3,25,3.8,4.3,25,3.8,4.3,25,3.8,4.3,25,10,6.5,5.3.3.A.,,, +,None,"Cranes, Rubber-Tired Loaders, Firetrucks - Mobile",Prohibited,None,,,3.8,4.3,14,3.8,4.3,14,3.8,4.3,15,3.8,4.3,14,10,6.5,5.3.3.A.,,, +,None,Double Decker Buses,Prohibited,None,,,2.6,4.3,12.5,2.6,4.3,12.5,2.6,4.3,12.5,2.6,4.42,12.5,1,1,5.3.1.A,,, +,None,Fixed Equipment - Trucks/Graders etc.,Prohibited,Fixed Equipment - Pony Trailers,,,3.2,4.3,31,3.2,4.3,31,3.2,4.3,31,3.2,4.3,31,1,4,,,, +X,None,Fixed Equipment - Trucks/Graders etc.,Prohibited,None,,,3.5,4.3,12.5,3.5,4.3,12.5,3.5,5.33,12.5,3.5,4.4,12.5,1,1,5.3.4.G.,,, +X,None,Inter-City Bus (Pulling Pony Trailer),Mandatory,Pony Trailers,,,2.6,4.15,20,2.6,4.15,20,2.6,4.15,20,2.6,4.15,20,1,1,5.3.1.B,,, +,None,Logging Trucks - Off-Highway,Mandatory,Semi-Trailers - Logging,,,4.4,4.15,23,4.4,4.15,23,4.4,4.15,23,4.4,4.15,23,3,6.5,5.3.5.A.,,, +X,None,Long Combination Vehicles (LCV) - Rocky Mountain Doubles,Prohibited,Semi-Trailers,,,2.6,4.15,32,2.6,4.15,32,2.6,4.15,31,2.6,4.15,32,1,1,5.3.6.D.,,, +,None,Long Combination Vehicles (LCV) - Turnpike Doubles,Prohibited,Semi-Trailers,,,2.6,4.15,41,2.6,4.15,41,2.6,4.15,41,2.6,4.15,41,1,1,5.3.6.D.,,, +X,None,Long Wheelbase Truck Tractors Exceeding 6.2 m up to 7.25 m,Mandatory,Semi-Trailers,X,X,2.6,4.15,23,2.6,4.15,23,2.6,4.15,23,2.6,4.15,23,1,1,5.3.7.A.,,, +,None,Picker Truck Tractors,Prohibited,None,,,2.6,4.15,16,2.6,4.15,16,2.6,4.15,16,2.6,4.15,16,3,1,5.3.9,,, +,None,Picker Truck Tractors,Mandatory,Semi-Trailers with Crane,X,X,2.6,4.15,25,2.6,4.15,25,2.6,4.15,25,2.6,4.15,25,3,6.5,5.3.9,,, +,None,Picker Truck Tractors,Mandatory,Steering Trailers - Manned,X,X,5,4.88,40,5,4.88,40,5,5.33,40,5,4.88,40,3,6.5,,,, +,None,Picker Truck Tractors,Mandatory,Steering Trailers - Self/Remote,X,X,5,4.88,36,5,4.88,36,5,5.33,36,5,4.88,36,3,6.5,,,, +,None,Scrapers,Prohibited,None,,,2.6,4.15,12.5,2.6,4.15,12.5,2.6,4.15,12.5,2.6,4.15,12.5,1,1,5.3.10.A.1),,, +,None,Truck Tractors,Mandatory,Fixed Equipment - Conveyors (Semi-Trailers),X,X,3.8,4.72,31,3.8,4.72,31,3.8,5.33,31,3.8,4.72,31,4,9.5,,,, +,None,Truck Tractors,Mandatory,Fixed Equipment - Counter Flow Asphalt Drum Mixers,X,X,3.8,4.72,31,3.8,4.72,31,3.8,5.33,31,3.8,4.72,31,3,6.5,,,, +X,None,Truck Tractors,Mandatory,Fixed Equipment - Portable Asphalt Baghouses,X,X,4.26,4.72,31,4.26,4.72,31,4.26,5.33,31,4.26,4.72,31,3,6.5,,,, +X,None,Truck Tractors,Mandatory,Fixed Equipment - Semi-Trailers,X,X,3.8,4.72,31,3.8,4.72,31,3.8,5.33,31,3.8,4.72,31,3,6.5,,,, +,None,Truck Tractors,Mandatory,Fixed Equipment - Wheeler Semi-Trailers,X,X,5,4.88,31,5,4.88,31,5,5.33,31,5,4.88,31,3,6.5,,,, +X,None,Truck Tractors,Mandatory,Overdimensional Trailers and Semi-Trailers (For Export),,,3.65,4.15,23,3.65,4.15,23,3.65,4.15,23,3.65,4.15,23,1,1,5.3.12.D.,,, +,None,Truck Tractors,Mandatory,Ready Mix Concrete Pump Semi-Trailers,X,X,2.6,4.15,23,2.6,4.15,23,2.6,4.15,23,2.6,4.15,23,3,6.5,5.3.2.B.,,, +,None,Truck Tractors,Mandatory,Semi-Trailers - Hiboys/Flat Decks,X,X,2.6,4.3,23,2.6,4.3,23,2.6,5.33,31,2.6,4.3,31,3,6.5,5.3.12.B.,,, +,None,Truck Tractors,Mandatory,Semi-Trailers - Insulated Vans with Reefer/Refrigeration Units,,,2.6,4.3,23,2.6,4.3,23,2.6,4.3,23,2.6,4.3,23,1,1,5.3.12.H.,,, +,None,Truck Tractors,Mandatory,Semi-Trailers - Non-Tac Short Chassis,,,2.6,4.15,20,2.6,4.15,20,2.6,4.15,20,2.6,4.15,20,5,2.25,5.3.7.D.,,, +,None,Truck Tractors,Mandatory,"Semi-Trailers - Single Drop, Double Drop, Step Decks, Lowbed, Expandos, etc.",X,X,3.2,4.3,27.5,3.2,4.3,27.5,3.2,4.3,32,3.2,4.3,27.5,3,6.5,5.3.12.A.,,, +,None,Truck Tractors,Mandatory,Steering Trailers - Manned,X,X,2.6,4.15,40,2.6,4.15,40,2.6,4.15,40,2.6,4.15,40,1,1,5.3.12.F.ii),,, +,None,Truck Tractors,Mandatory,Steering Trailers - Self/Remote,X,X,2.6,4.15,36,2.6,4.15,36,2.6,4.15,36,2.6,4.15,36,1,1,5.3.12.F.i),,, +,None,Trucks,Mandatory,Fixed Equipment - Conveyors (Pony Trailers),,,3.2,4.3,31,3.2,4.3,31,3.2,4.3,31,3.2,4.3,31,4,9.5,,,, +,None,Trucks,Mandatory,Fixed Equipment - Pony Trailers,,,3.2,4.3,31,3.2,4.3,31,3.2,4.3,31,3.2,4.3,31,1,4,,,, +,None,Trucks,Mandatory,Full Trailers ,,,3.8,4.3,23,3.8,4.3,23,3.8,5.33,23,3.8,4.3,23,1,6.5,5.3.12.G.,,, +,None,Trucks,Mandatory,"Manufactured Homes, Modular Buildings, Structures and Houseboats (<= 5.0 m OAW) with Attached Axles",,,5.0,4.88,31.5,5.0,4.88,31.5,5.0,5.33,36,5.0,4.88,31.5,1,6.9,"4.3.5.A, 4.3.5.B, 4.3.5.C",,, +,None,Trucks,Mandatory,"Manufactured Homes, Modular Buildings, Structures and Houseboats (> 5.0 m OAW) with Attached Axles",,,6.0,4.88,31.5,6.0,4.88,31.5,6.1,5.33,36,6.0,4.88,31.5,1,6.9,"4.3.5.D, 4.3.5.E",,, +,None,Trucks,Mandatory,None,,,3.2,4.3,16,3.2,4.3,16,3.2,4.4,16,3.2,4.3,16,1,6.5,,,, +,None,Trucks,Mandatory,Overdimensional Trailers and Semi-Trailers (For Export),,,3.65,4.15,23,3.65,4.15,23,3.65,4.15,23,3.65,4.15,23,1,1,5.3.12.D.,,, +,None,Trucks,Mandatory,Park Model Homes with Attached Axles,,,4.4,4.88,31.5,4.4,4.88,31.5,4.4,5.33,31.5,4.4,4.88,31.5,3.0,6.9,4.3.4,,, +,None,Trucks,Mandatory,Pony Trailers,,,3.2,4.3,23,3.2,4.3,23,3.2,5.33,23,3.2,4.3,23,1,6.5,5.3.12.G.,,, +,None,Trucks Equipped with Front or Underbody Plow Blades,Prohibited,None,,,3.2,4.15,12.5,3.2,4.15,12.5,3.2,4.15,12.5,3.2,4.15,12.5,1,1,5.3.13,,, +X,Non-Reducible Loads,Truck Tractors,Mandatory,Semi-Trailers - Logging,,,3.8,4.15,27.5,3.8,4.15,27.5,3.8,4.15,27.5,3.8,4.15,27.5,3,6.5,5.3.9.A./5.3.9.B.,,, +X,Non-Reducible Loads,Picker Truck Tractors,Mandatory,Oil and Gas - Oversize Oilfield Flat Deck Semi-Trailers,X,X,3.3,4.3,23,3.3,4.3,23,3.3,4.3,23,3.3,4.3,23,3,6.5,5.3.8.B.,,, +,Non-Reducible Loads,Picker Truck Tractors,Mandatory,Semi-Trailers,X,X,5,4.88,25,5,4.88,25,5,5.33,25,5,4.88,25,3,6.5,5.3.9.A./5.3.9.B.,non compliant vehicle,, +,Non-Reducible Loads,Picker Truck Tractors,Mandatory,Semi-Trailers - Hiboys/Expandos,X,X,5,4.4,25,5,4.4,25,5,5.33,25,5,4.4,25,3,6.5,5.3.9.A./5.3.9.B.,,, +,Non-Reducible Loads,Picker Truck Tractors,Mandatory,Semi-Trailers - Hiboys/Flat Decks,X,X,5,4.4,25,5,4.4,25,5,5.33,25,5,4.4,25,3,6.5,5.3.9.A./5.3.9.B.,,, +X,Non-Reducible Loads,Picker Truck Tractors,Mandatory,"Semi-Trailers - Single Drop, Double Drop, Step Decks, Lowbed, Expandos, etc.",X,X,5,4.88,25,5,4.88,25,5,5.33,25,5,4.88,25,3,6.5,5.3.9.A./5.3.9.B.,,, +,Non-Reducible Loads,Picker Truck Tractors,Mandatory,Semi-Trailers - Steering Trailers,X,X,5,4.88,27.5,5,4.88,27.5,5,5.33,27.5,5,4.88,27.5,3,6.5,,,, +X,Non-Reducible Loads,Picker Truck Tractors,Mandatory,Semi-Trailers - Wheelers,X,X,5,4.88,27.5,5,4.88,27.5,5,5.33,27.5,5,4.88,27.5,3,6.5,,,, +,Non-Reducible Loads,Picker Truck Tractors,Mandatory,Semi-Trailers - Wide Wheelers,X,X,5,4.88,27.5,5,4.88,27.5,5,5.33,27.5,5,4.88,27.5,3,6.5,,,, +,Non-Reducible Loads,Picker Truck Tractors,Mandatory,Semi-Trailers with Crane,X,X,5,4.88,27.5,5,4.88,27.5,5,5.33,27.5,5,4.88,27.5,3,6.5,,,, +,Non-Reducible Loads,Picker Truck Tractors,Mandatory,Steering Trailers - Manned,X,X,5,4.88,40,5,4.88,40,5,5.33,40,5,4.88,40,3,6.5,,,, +,Non-Reducible Loads,Picker Truck Tractors,Mandatory,Steering Trailers - Self/Remote,X,X,5,4.88,36,5,4.88,36,5,5.33,36,5,4.88,36,3,6.5,,,, +X,Non-Reducible Loads,Truck Tractors,Mandatory,Platform Trailers,X,X,5,4.88,27.5,5,4.88,27.5,5,5.33,27.5,5,4.88,27.5,3,6.5,4.2.4/4.2.5i)/4.2.6,,, +,Non-Reducible Loads,Truck Tractors,Mandatory,Semi-Trailers,X,X,5,4.88,27.5,5,4.88,27.5,5,5.33,27.5,5,4.88,27.5,3,6.5,4.2.4/4.2.5i)/4.2.6,,, +,Non-Reducible Loads,Truck Tractors,Mandatory,Semi-Trailers - A-Trains and C-Trains,,,5,4.4,26,5,4.4,26,5,5.33,26,5,4.4,26,3,6.5,4.2.4/4.2.5i)/4.2.6,,, +,Non-Reducible Loads,Truck Tractors,Mandatory,Semi-Trailers - B-Trains,,,5,4.4,27.5,5,4.4,27.5,5,5.33,27.5,5,4.4,27.5,3,6.5,4.2.4/4.2.5i)/4.2.6,,, +,Non-Reducible Loads,Truck Tractors,Mandatory,Semi-Trailers - Hiboys/Expandos,X,X,5,4.4,27.5,5,4.4,27.5,5,5.33,27.5,5,4.4,27.5,3,6.5,4.2.4/4.2.5i)/4.2.6,,, +,Non-Reducible Loads,Truck Tractors,Mandatory,Semi-Trailers - Hiboys/Flat Decks,X,X,5,4.4,27.5,5,4.4,27.5,5,5.33,27.5,5,4.4,27.5,3,6.5,4.2.4/4.2.5i)/4.2.6,,, +,Non-Reducible Loads,Truck Tractors,Mandatory,"Semi-Trailers - Single Drop, Double Drop, Step Decks, Lowbed, Expandos, etc.",X,X,5,4.88,27.5,5,4.88,27.5,5,5.33,27.5,5,4.88,27.5,3,6.5,4.2.4/4.2.5i)/4.2.6,,, +X,Non-Reducible Loads,Truck Tractors,Mandatory,Semi-Trailers - Steering Trailers,X,X,5,4.88,27.5,5,4.88,27.5,5,5.33,27.5,5,4.88,27.5,3,6.5,4.2.4/4.2.5i)/4.2.6,,, +,Non-Reducible Loads,Truck Tractors,Mandatory,Semi-Trailers - Wheelers,X,X,5,4.88,27.5,5,4.88,27.5,5,5.33,27.5,5,4.88,27.5,3,6.5,4.2.4/4.2.5i)/4.2.6,,, +,Non-Reducible Loads,Truck Tractors,Mandatory,Semi-Trailers - Wide Wheelers,X,X,5,4.88,27.5,5,4.88,27.5,5,5.33,27.5,5,4.88,27.5,3,6.5,4.2.4/4.2.5i)/4.2.6,,, +,Non-Reducible Loads,Truck Tractors,Mandatory,Semi-Trailers with Crane,X,X,5,4.88,27.5,5,4.88,27.5,5,5.33,27.5,5,4.88,27.5,3,6.5,4.2.4/4.2.5i)/4.2.6,,, +,Non-Reducible Loads,Truck Tractors,Mandatory,Steering Trailers - Manned,X,X,5,4.88,40,5,4.88,40,5,5.33,40,5,4.88,40,3,6.5,4.2.4/4.2.5i)/4.2.6,,, +,Non-Reducible Loads,Truck Tractors,Mandatory,Steering Trailers - Self/Remote,X,X,5,4.88,36,5,4.88,36,5,5.33,36,5,4.88,36,3,6.5,4.2.4/4.2.5i)/4.2.6,,, +X,Non-Reducible Loads,Truck Tractors - Stinger Steered,Mandatory,Semi-Trailers,,,2.6,4.88,25,2.6,4.88,25,2.6,5.33,25,2.6,4.88,25,1,1.2,4.2.7.A.2/4.2.7.B.B/ 5.3.11,,, +,Non-Reducible Loads,Truck Tractors - Stinger Steered,Mandatory,Semi-Trailers - Stinger Steered Automobile Transporters,,,2.6,4.88,25,2.6,4.88,25,2.6,5.33,25,2.6,4.88,25,1,1.2,4.2.7.A.2/4.2.7.B.B/ 5.3.11,,, +,Non-Reducible Loads,Trucks,Mandatory,Dollies,,,5,4.88,25,5,4.88,25,5,5.33,25,5,4.88,25,1,6.5,4.2.7.A.2/4.2.7.B.B/ 5.3.11,,, +,Non-Reducible Loads,Trucks,Mandatory,Full Trailers,,,5,4.88,25,5,4.88,25,5,5.33,25,5,4.88,25,1,6.5,4.2.7.B.G,,, +,Non-Reducible Loads,Trucks,Prohibited,None,,,5,4.88,16,5,4.88,16,5,5.33,16,5,4.88,16,1,6.5,4.2.7.B.G,,, +,Non-Reducible Loads,Trucks,Mandatory,Pony Trailers,,,5,4.88,25,5,4.88,25,5,5.33,25,5,4.88,25,1,6.5,4.2.7.B.G,,, +,Oil Field Equipment,Oil and Gas - Bed Trucks,Mandatory,Expando Semi-Trailers,X,X,2.6,4.3,27.5,2.6,4.3,27.5,2.6,4.3,27.5,2.6,4.3,27.5,3,6.5,5.3.8.C.,,, +,Oil Field Equipment,Oil and Gas - Bed Trucks,Prohibited,None,,,3.3,4.3,14,3.3,4.3,14,3.3,4.3,14,3.3,4.3,14,1,5,5.3.8.A.i)/ii),,, +,Oil Field Equipment,Oil and Gas - Bed Trucks,Mandatory,Oil and Gas - Oversize Oilfield Flat Deck Semi-Trailers,X,X,3.3,4.3,23,3.3,4.3,23,3.3,4.3,23,3.3,4.3,23,3,6.5,5.3.8.B.,,, +,Oil Field Equipment,Oil and Gas - Oilfield Sows,Prohibited,None,,,3.2,4.3,15,3.2,4.3,15,3.2,4.3,15,3.2,4.3,15,1,5,5.3.8.D.,,, +,Oil Field Equipment,Oil and Gas - Oilfield Sows,Mandatory,Semi-Trailers - Hiboys/Flat Decks,X,X,3.2,4.3,25,3.2,4.3,25,3.2,4.3,25,3.2,4.3,25,3,6.5,5.3.8.E.,,, +,Oil Field Equipment,Oil and Gas - Service Rigs,Prohibited,None,,,3.8,4.3,15,3.8,4.3,15,3.8,4.3,15,3.8,4.3,15,10,6.5,5.3.8.F.,,, +,Oil Field Equipment,Oil and Gas - Service Rigs,Mandatory,Pony Trailers,,,3.8,4.3,23,3.8,4.3,23,3.8,4.3,23,3.8,4.3,23,10,6.5,5.3.8.F.i),,, +x,Oil Field Equipment,"Oil and Gas - Service Rigs and Rathole Augers Only Equipped with Heavy Front Projected Crane (must exceed 14,000 kg tare weight)",Prohibited,None,,,2.9,4.15,15.5,2.9,4.15,15.5,2.9,4.15,15.5,2.9,4.15,15.5,10,6.5,5.3.8.F.,,, +x,Oil Field Equipment,"Oil and Gas - Service Rigs and Rathole Augers Only Equipped with Heavy Front Projected Crane (must exceed 14,000 kg tare weight)",Mandatory,Pony Trailers,,,2.9,4.15,23,2.9,4.15,23,2.9,4.15,23,2.9,4.15,23,10,6.5,5.3.8.F.i),,, +,Oil Field Equipment,Truck Tractors,Mandatory,Oil and Gas - Oversize Oilfield Flat Deck Semi-Trailers,X,X,3.3,4.3,23,3.3,4.3,23,3.3,4.3,23,3.3,4.3,23,3,6.5,5.3.8.B.,,, +,Park Model Homes,Trucks,Mandatory,Dollies,,,4.4,4.88,31.5,4.4,4.88,31.5,4.4,5.33,31.5,4.4,4.88,31.5,3.0,6.9,4.3.4,,, +,Park Model Homes,Trucks,Mandatory,Float Trailers,,,4.4,4.88,31.5,4.4,4.88,31.5,4.4,5.33,31.5,4.4,4.88,31.5,3.0,6.9,4.3.4,,, +,Park Model Homes,Trucks,Mandatory,Pony Trailers,,,4.4,4.88,31.5,4.4,4.88,31.5,4.4,5.33,31.5,4.4,4.88,31.5,3.0,6.9,4.3.4,,, +,"Pipe And Steel Products (Rebar, Pilings, Reinforcing Steel, Etc.)",Truck Tractors,Mandatory,Semi-Trailers - Hiboys/Expandos,X,X,3.2,4.3,31,3.2,4.3,31,3.2,4.3,31,3.2,4.3,31,3,6.5,4.2.5.A.ii)/4.2.7.A.14,,, +,"Pipe And Steel Products (Rebar, Pilings, Reinforcing Steel, Etc.)",Truck Tractors,Mandatory,Semi-Trailers - Hiboys/Flat Decks,X,X,3.2,4.3,27.5,3.2,4.3,27.5,3.2,4.3,27.5,3.2,4.3,27.5,3,6.5,4.2.5.A.ii),,, +,"Pipe And Steel Products (Rebar, Pilings, Reinforcing Steel, Etc.)",Truck Tractors,Mandatory,Semi-Trailers - Steering Trailers,X,X,3.2,4.3,36,3.2,4.3,36,3.2,4.3,36,3.2,4.3,36,3,6.5,4.2.7.B.H,,, +X,"Pipe And Steel Products (Rebar, Pilings, Reinforcing Steel, Etc.)",Truck Tractors,Mandatory,Steering Trailers - Manned,X,X,3.2,4.3,40,3.2,4.3,40,3.2,4.3,40,3.2,4.3,40,3,6.5,4.2.7.B.H,,, +,Reducible Loads,Truck Tractors,Mandatory,Semi-Trailers - Logging,,,3.2,4.15,27.5,3.2,4.15,27.5,3.2,4.15,27.5,3.2,4.15,27.5,3,6.5,4.2.4/4.2.5i)/4.2.6,,, +,Reducible Loads,Picker Truck Tractors,Mandatory,Semi-Trailers,X,X,3.2,4.3,27.5,3.2,4.3,27.5,3.2,5.33,27.5,3.2,4.3,27.5,3,6.5,4.2.4/4.2.5i)/4.2.6,,, +,Reducible Loads,Picker Truck Tractors,Mandatory,Semi-Trailers - Hiboys/Expandos,X,X,3.2,4.3,27.5,3.2,4.3,27.5,3.2,5.33,27.5,3.2,4.3,27.5,3,6.5,4.2.4/4.2.5i)/4.2.6,,, +,Reducible Loads,Picker Truck Tractors,Mandatory,Semi-Trailers - Hiboys/Flat Decks,X,X,3.2,4.3,27.5,3.2,4.3,27.5,3.2,5.33,27.5,3.2,4.3,27.5,3,6.5,4.2.4/4.2.5i)/4.2.6,,, +,Reducible Loads,Picker Truck Tractors,Mandatory,"Semi-Trailers - Single Drop, Double Drop, Step Decks, Lowbed, Expandos, etc.",X,X,3.2,4.3,27.5,3.2,4.3,27.5,3.2,5.33,27.5,3.2,4.3,27.5,3,6.5,4.2.4/4.2.5i)/4.2.6,,, +X,Reducible Loads,Truck Tractors,Mandatory,Platform Trailers,X,X,3.2,4.3,27.5,3.2,4.3,27.5,3.2,5.33,27.5,3.2,4.3,27.5,3,6.5,4.2.4/4.2.5i)/4.2.6,,, +,Reducible Loads,Truck Tractors,Mandatory,Semi-Trailers,X,X,3.2,4.3,27.5,3.2,4.3,27.5,3.2,5.33,27.5,3.2,4.3,27.5,3,6.5,4.2.4/4.2.5i)/4.2.6,,, +,Reducible Loads,Truck Tractors,Mandatory,Semi-Trailers - A-Trains and C-Trains,,,3.2,4.3,26,3.2,4.3,26,3.2,5.33,26,3.2,4.3,26,3,6.5,4.2.4/4.2.5i)/4.2.6,,, +,Reducible Loads,Truck Tractors,Mandatory,Semi-Trailers - B-Trains,,,3.2,4.3,27.5,3.2,4.3,27.5,3.2,5.33,27.5,3.2,4.3,27.5,3,6.5,4.2.4/4.2.5i)/4.2.6,,, +,Reducible Loads,Truck Tractors,Mandatory,Semi-Trailers - Hiboys/Expandos,X,X,3.2,4.3,27.5,3.2,4.3,27.5,3.2,5.33,27.5,3.2,4.3,27.5,3,6.5,4.2.4/4.2.5i)/4.2.6,,, +,Reducible Loads,Truck Tractors,Mandatory,Semi-Trailers - Hiboys/Flat Decks,X,X,3.2,4.3,27.5,3.2,4.3,27.5,3.2,5.33,27.5,3.2,4.3,27.5,3,6.5,4.2.4/4.2.5i)/4.2.6,,, +,Reducible Loads,Truck Tractors,Mandatory,"Semi-Trailers - Single Drop, Double Drop, Step Decks, Lowbed, Expandos, etc.",X,X,3.2,4.3,27.5,3.2,4.3,27.5,3.2,5.33,27.5,3.2,4.3,27.5,3,6.5,4.2.4/4.2.5i)/4.2.6,,, +,Reducible Loads,Truck Tractors,Mandatory,Semi-Trailers - Steering Trailers,X,X,3.2,4.3,27.5,3.2,4.3,27.5,3.2,5.33,27.5,3.2,4.3,27.5,3,6.5,4.2.4/4.2.5i)/4.2.6,,, +X,Reducible Loads,Truck Tractors,Mandatory,Semi-Trailers - Wheelers,X,X,3.2,4.3,27.5,3.2,4.3,27.5,3.2,5.33,27.5,3.2,4.3,27.5,3,6.5,4.2.4/4.2.5i)/4.2.6,,, +X,Reducible Loads,Truck Tractors,Mandatory,Semi-Trailers - Wide Wheelers,X,X,3.2,4.3,27.5,3.2,4.3,27.5,3.2,5.33,27.5,3.2,4.3,27.5,3,6.5,4.2.4/4.2.5i)/4.2.6,,, +,Reducible Loads,Truck Tractors,Mandatory,Semi-Trailers with Crane,X,X,3.2,4.3,27.5,3.2,4.3,27.5,3.2,5.33,27.5,3.2,4.3,27.5,3,6.5,4.2.4/4.2.5i)/4.2.6,,, +X,Reducible Loads,Truck Tractors,Mandatory,Steering Trailers - Manned,X,X,3.2,4.3,40,3.2,4.3,40,3.2,5.33,40,3.2,4.3,40,3,6.5,4.2.4/4.2.5i)/4.2.6,,, +,Reducible Loads,Truck Tractors,Mandatory,Steering Trailers - Self/Remote,X,X,3.2,4.3,36,3.2,4.3,36,3.2,5.33,36,3.2,4.3,36,3,6.5,4.2.4/4.2.5i)/4.2.6,,, +,Reducible Loads,Truck Tractors - Stinger Steered,Mandatory,Semi-Trailers,,,2.6,4.3,25,2.6,4.3,25,2.6,5.33,25,2.6,4.3,25,1,1.2,4.2.4/4.2.5i)/4.2.6,,, +,Reducible Loads,Truck Tractors - Stinger Steered,Mandatory,Semi-Trailers - Stinger Steered Automobile Transporters,,,2.6,4.3,25,2.6,4.3,25,2.6,5.33,25,2.6,4.3,25,1,1.2,4.2.4/4.2.5i)/4.2.6,,, +,Reducible Loads,Trucks,Mandatory,Dollies,,,3.2,4.3,25,3.2,4.3,25,3.2,4.4,25,3.2,4.3,25,1,6.5,4.2.4/4.2.5i)/4.2.6,,, +,Reducible Loads,Trucks,Mandatory,Full Trailers,,,3.2,4.3,25,3.2,4.3,25,3.2,4.4,25,3.2,4.3,25,1,6.5,4.2.4/4.2.5i)/4.2.6,,, +,Reducible Loads,Trucks,Prohibited,None,,,3.2,4.3,16,3.2,4.3,16,3.2,4.4,16,3.2,4.3,16,1,6.5,4.2.4/4.2.5i)/4.2.6,,, +,Reducible Loads,Trucks,Mandatory,Pony Trailers,,,3.2,4.3,25,3.2,4.3,25,3.2,4.4,25,3.2,4.3,25,1,6.5,4.2.4/4.2.5i)/4.2.6,,, +X,Scraper on Dollies,Truck Tractors,Mandatory,Dollies,X,,3.2,4.3,25,3.2,4.3,25,3.2,4.4,25,3.2,4.3,25,1,1,5.3.10.B.,,, +,Tandem Jeep/Pole Trailer Loaded on Logging Truck,Truck Tractors,Prohibited,None,,,2.9,4.3,12.5,2.9,4.3,12.5,2.9,4.3,12.5,2.9,4.3,12.5,1,5,4.2.7.A.6/4.5.6.C.,,, +,Tandem Jeep/Pole Trailer Loaded on Logging Truck,Trucks,Prohibited,None,,,2.9,4.3,12.5,2.9,4.3,12.5,2.9,4.3,12.5,2.9,4.3,12.5,1,5,4.2.7.A.6/4.5.6.C.,,, +,Tow Trucks And Disabled Vehicles,Tow Vehicles,Prohibited,None,,,2.6,4.3,27.5,2.6,4.3,27.5,2.6,4.3,27.5,2.6,4.3,27.5,1,1,5.3.14,,, +,Tri-Axle or Quad Axle Full Trailer Loaded on Logging Truck,Truck Tractors,Prohibited,None,,,2.6,4.3,13.5,2.6,4.3,13.5,2.6,4.3,13.5,2.6,4.3,13.5,1,5,4.2.7.A.6/4.5.6.D.,,, +,Tri-Axle or Quad Axle Full Trailer Loaded on Logging Truck,Trucks,Prohibited,None,,,2.6,4.3,13.5,2.6,4.3,13.5,2.6,4.3,13.5,2.6,4.3,13.5,1,5,4.2.7.A.6/4.5.6.D.,,, +,"Wood Chips, Residuals",Truck Tractors,Mandatory,Semi-Trailers - B-Trains,,,2.6,4.45,27.5,2.6,4.45,27.5,2.6,4.45,27.5,2.6,4.45,27.5,1,1,4.2.7.A.16/4.5.4,,, diff --git a/policy-engine/src/_examples/update-os-from-csv.ts b/policy-engine/src/_examples/update-os-from-csv.ts new file mode 100644 index 000000000..1faf277f4 --- /dev/null +++ b/policy-engine/src/_examples/update-os-from-csv.ts @@ -0,0 +1,153 @@ +import * as fs from 'fs'; +import { parse } from 'csv-parse'; +import { completePolicyConfig } from '../_test/policy-config/complete-in-progress.sample'; +import { Policy } from '../policy-engine'; +import { getIdFromName } from '../helper/lists.helper'; +import { RegionSizeOverride, SizeDimension, TrailerSize } from '../types'; + +type DimensionEntry = { + commodity: string; + powerUnit: string; + trailer: TrailerSize; +}; + +function csvRowToObject( + row: Array, + pol: Policy, +): DimensionEntry | null { + const commodityId = getIdFromName(pol.policyDefinition.commodities, row[1]); + const puId = getIdFromName( + pol.policyDefinition.vehicleTypes.powerUnitTypes, + row[2].trim(), + ); + const trId = getIdFromName( + pol.policyDefinition.vehicleTypes.trailerTypes, + row[4].trim(), + ); + let entryObject: DimensionEntry | null = null; + if (commodityId && puId && trId) { + entryObject = { + commodity: commodityId, + powerUnit: puId, + trailer: { + type: trId, + jeep: row[5] == 'X', + booster: row[6] == 'X', + selfIssue: row[0] != 'X', + }, + }; + + const sizeDimension: SizeDimension = {}; + + const fp = parseFloat(row[19]); + const rp = parseFloat(row[20]); + if (!isNaN(fp)) { + sizeDimension.fp = fp; + } + if (!isNaN(rp)) { + sizeDimension.rp = rp; + } + + // Populate the BC Default dimensions + const bcWidth = parseFloat(row[16]); + const bcHeight = parseFloat(row[17]); + const bcLength = parseFloat(row[18]); + if (!isNaN(bcWidth)) sizeDimension.w = bcWidth; + if (!isNaN(bcHeight)) sizeDimension.h = bcHeight; + if (!isNaN(bcLength)) sizeDimension.l = bcLength; + + const regionIds: Array = ['LMN', 'KTN', 'PCE']; + // Populate the 3 region dimensions + for (let i = 0; i < regionIds.length; i++) { + const w = parseFloat(row[7 + i * 3]); + const h = parseFloat(row[8 + i * 3]); + const l = parseFloat(row[9 + i * 3]); + if ( + (isNaN(w) || w == sizeDimension.w) && + (isNaN(h) || h == sizeDimension.h) && + (isNaN(l) || l == sizeDimension.l) + ) { + // All values for this region are empty or are the + // same as the BC default values. In this case do not + // include the region in the configuration at all + continue; + } + + if (!sizeDimension.regions) { + sizeDimension.regions = []; + } + + const regionOverride: RegionSizeOverride = { region: regionIds[i] }; + if (!isNaN(w) && w != sizeDimension.w) regionOverride.w = w; + if (!isNaN(h) && h != sizeDimension.h) regionOverride.h = h; + if (!isNaN(l) && l != sizeDimension.l) regionOverride.l = l; + sizeDimension.regions.push(regionOverride); + } + + entryObject.trailer.sizeDimensions = []; + entryObject.trailer.sizeDimensions.push(sizeDimension); + + return entryObject; + } else { + console.log( + `No entry in policy config for commodity '${row[1]}' and/or power unit '${row[2]}' and/or trailer '${row[4]}'`, + ); + return null; + } +} + +const policy = new Policy(completePolicyConfig); +policy.policyDefinition.commodities.forEach((c) => { + // Remove each size property from the commodity, will + // be replaced wholesale with the new size. If the configuration + // is not present in the new input, it should be deleted. + if (c.size) delete c.size; +}); + +function processCsvRow(row: any) { + const dimensionEntry = csvRowToObject(row, policy); + if (dimensionEntry) { + const commodity = policy.getCommodityDefinition(dimensionEntry.commodity); + if (commodity) { + // Update the list of power units + if (!commodity.size) { + commodity.size = { powerUnits: [] }; + } + + // Get or create power unit entry + let powerUnit = commodity.size.powerUnits?.find( + (pu) => pu.type == dimensionEntry.powerUnit, + ); + if (!powerUnit) { + // We don't have this power unit yet, create it + powerUnit = { + type: dimensionEntry.powerUnit, + trailers: [], + }; + commodity.size.powerUnits?.push(powerUnit); + } + + const trailer = powerUnit.trailers.find( + (tr) => tr.type == dimensionEntry.trailer.type, + ); + if (!trailer) { + // Create the trailer in configuration + powerUnit.trailers.push(dimensionEntry.trailer); + } else { + console.log( + `*** Duplicate trailer '${trailer.type}' in input for power unit '${powerUnit.type}'`, + ); + } + } + } +} + +fs.createReadStream('./os-dimensions-simplified-nodefault.csv') + .pipe(parse({ delimiter: ',', from_line: 1 })) + .on('data', function (row) { + processCsvRow(row); + }) + .on('end', function () { + console.log(JSON.stringify(policy.policyDefinition, null, ' ')); + //console.log(JSON.stringify(policy.policyDefinition)); + }); diff --git a/policy-engine/src/_test/permit-app/permit-application.type.ts b/policy-engine/src/_test/permit-app/permit-application.type.ts index e9b994bad..59b78eccb 100644 --- a/policy-engine/src/_test/permit-app/permit-application.type.ts +++ b/policy-engine/src/_test/permit-app/permit-application.type.ts @@ -30,6 +30,7 @@ type PermitVehicleDetails = { provinceCode: string; vehicleType: string; vehicleSubType: string; + licensedGVW?: number | null; saveVehicle?: boolean | null; }; @@ -53,6 +54,34 @@ type PermitData = { feeSummary?: string | null; startDate: string; expiryDate?: string | null; + permittedCommodity?: string | null; + vehicleConfiguration?: VehicleConfiguration | null; + permittedRoute?: PermittedRoute | null; + applicationNotes?: string | null; +}; + +type VehicleInConfiguration = { + vehicleSubType: string; +}; + +type VehicleConfiguration = { + overallLength?: number; + overallWidth?: number; + overallHeight?: number; + frontProjection?: number; + rearProjection?: number; + trailers?: Array | null; +}; + +type PermittedRoute = { + manualRoute?: ManualRoute | null; + routeDetails?: string | null; +}; + +type ManualRoute = { + highwaySequence: Array; + origin: string; + destination: string; }; type PermitApplication = { diff --git a/policy-engine/src/_test/permit-app/test-stos.ts b/policy-engine/src/_test/permit-app/test-stos.ts index 37d92e9f0..08b33772a 100644 --- a/policy-engine/src/_test/permit-app/test-stos.ts +++ b/policy-engine/src/_test/permit-app/test-stos.ts @@ -43,6 +43,30 @@ export const testStos: PermitApplication = { countryCode: 'CA', postalCode: 'V8B1A2', }, + permittedCommodity: 'EMPTYXX', + vehicleConfiguration: { + overallLength: 25, + overallWidth: 3, + overallHeight: 4.1, + frontProjection: 1, + rearProjection: 1, + trailers: [ + { + vehicleSubType: 'JEEPSRG', + }, + { + vehicleSubType: 'PLATFRM', + }, + ], + }, + permittedRoute: { + manualRoute: { + origin: 'Victoria, BC', + destination: 'Prince George, BC', + highwaySequence: ['1', '5'], + }, + routeDetails: 'Just driving here', + }, vehicleDetails: { vehicleId: '101', unitNumber: '321', @@ -54,10 +78,12 @@ export const testStos: PermitApplication = { provinceCode: 'BC', vehicleType: 'powerUnit', vehicleSubType: 'TRKTRAC', + licensedGVW: 40000, saveVehicle: false, }, feeSummary: '30', startDate: '2024-04-18', expiryDate: '2024-05-17', + applicationNotes: 'Call for credit card payment', }, }; diff --git a/policy-engine/src/_test/policy-config/all-event-types.sample.ts b/policy-engine/src/_test/policy-config/all-event-types.sample.ts index 2b0d77664..f57f0ac74 100644 --- a/policy-engine/src/_test/policy-config/all-event-types.sample.ts +++ b/policy-engine/src/_test/policy-config/all-event-types.sample.ts @@ -23,7 +23,8 @@ export const allEventTypes: PolicyDefinition = { { conditions: { not: { - fact: 'permitData.permitDuration', + fact: 'permitData', + path: '$.permitDuration', operator: 'equal', value: 31, }, @@ -38,7 +39,8 @@ export const allEventTypes: PolicyDefinition = { { conditions: { not: { - fact: 'permitData.permitDuration', + fact: 'permitData', + path: '$.permitDuration', operator: 'equal', value: 32, }, @@ -53,7 +55,8 @@ export const allEventTypes: PolicyDefinition = { { conditions: { not: { - fact: 'permitData.permitDuration', + fact: 'permitData', + path: '$.permitDuration', operator: 'equal', value: 33, }, @@ -68,7 +71,8 @@ export const allEventTypes: PolicyDefinition = { { conditions: { not: { - fact: 'permitData.permitDuration', + fact: 'permitData', + path: '$.permitDuration', operator: 'equal', value: 34, }, @@ -83,7 +87,8 @@ export const allEventTypes: PolicyDefinition = { { conditions: { not: { - fact: 'permitData.permitDuration', + fact: 'permitData', + path: '$.permitDuration', operator: 'equal', value: 35, }, @@ -98,7 +103,8 @@ export const allEventTypes: PolicyDefinition = { { conditions: { not: { - fact: 'permitData.permitDuration', + fact: 'permitData', + path: '$.permitDuration', operator: 'equal', value: 35, }, @@ -110,7 +116,8 @@ export const allEventTypes: PolicyDefinition = { { conditions: { not: { - fact: 'permitData.permitDuration', + fact: 'permitData', + path: '$.permitDuration', operator: 'equal', value: 36, }, @@ -130,11 +137,11 @@ export const allEventTypes: PolicyDefinition = { trailers: [], }, globalSizeDefaults: { - frontProjection: 3, - rearProjection: 6.5, - width: 2.6, - height: 4.15, - length: 31, + fp: 3, + rp: 6.5, + w: 2.6, + h: 4.15, + l: 31, }, vehicleCategories: { trailerCategories: [], diff --git a/policy-engine/src/_test/policy-config/complete-in-progress.sample.ts b/policy-engine/src/_test/policy-config/complete-in-progress.sample.ts index f98254256..217721584 100644 --- a/policy-engine/src/_test/policy-config/complete-in-progress.sample.ts +++ b/policy-engine/src/_test/policy-config/complete-in-progress.sample.ts @@ -15,10 +15,6 @@ export const completePolicyConfig: PolicyDefinition = { id: 'PCE', name: 'Peace', }, - { - id: 'BCD', - name: 'BC Default', - }, ], rangeMatrices: [ { @@ -293,9 +289,10 @@ export const completePolicyConfig: PolicyDefinition = { { conditions: { not: { - fact: 'permitData.companyName', + fact: 'permitData', operator: 'stringMinimumLength', value: 1, + path: '$.companyName', }, }, event: { @@ -310,9 +307,10 @@ export const completePolicyConfig: PolicyDefinition = { { conditions: { not: { - fact: 'permitData.contactDetails.firstName', + fact: 'permitData', operator: 'stringMinimumLength', value: 1, + path: '$.contactDetails.firstName', }, }, event: { @@ -327,9 +325,10 @@ export const completePolicyConfig: PolicyDefinition = { { conditions: { not: { - fact: 'permitData.contactDetails.lastName', + fact: 'permitData', operator: 'stringMinimumLength', value: 1, + path: '$.contactDetails.lastName', }, }, event: { @@ -344,9 +343,10 @@ export const completePolicyConfig: PolicyDefinition = { { conditions: { not: { - fact: 'permitData.contactDetails.phone1', + fact: 'permitData', operator: 'stringMinimumLength', value: 1, + path: '$.contactDetails.phone1', }, }, event: { @@ -361,9 +361,10 @@ export const completePolicyConfig: PolicyDefinition = { { conditions: { not: { - fact: 'permitData.contactDetails.email', + fact: 'permitData', operator: 'stringMinimumLength', value: 1, + path: '$.contactDetails.email', }, }, event: { @@ -379,11 +380,12 @@ export const completePolicyConfig: PolicyDefinition = { conditions: { any: [ { - fact: 'permitData.startDate', + fact: 'permitData', operator: 'dateLessThan', value: { fact: 'validationDate', }, + path: '$.startDate', }, ], }, @@ -399,9 +401,10 @@ export const completePolicyConfig: PolicyDefinition = { { conditions: { not: { - fact: 'permitData.vehicleDetails.vin', + fact: 'permitData', operator: 'regex', value: '^[a-zA-Z0-9]{6}$', + path: '$.vehicleDetails.vin', }, }, event: { @@ -417,9 +420,10 @@ export const completePolicyConfig: PolicyDefinition = { { conditions: { not: { - fact: 'permitData.vehicleDetails.plate', + fact: 'permitData', operator: 'stringMinimumLength', value: 1, + path: '$.vehicleDetails.plate', }, }, event: { @@ -434,9 +438,10 @@ export const completePolicyConfig: PolicyDefinition = { { conditions: { not: { - fact: 'permitData.vehicleDetails.make', + fact: 'permitData', operator: 'stringMinimumLength', value: 1, + path: '$.vehicleDetails.make', }, }, event: { @@ -451,9 +456,10 @@ export const completePolicyConfig: PolicyDefinition = { { conditions: { not: { - fact: 'permitData.vehicleDetails.year', + fact: 'permitData', operator: 'greaterThan', value: 1900, + path: '$.vehicleDetails.year', }, }, event: { @@ -468,9 +474,10 @@ export const completePolicyConfig: PolicyDefinition = { { conditions: { not: { - fact: 'permitData.vehicleDetails.countryCode', + fact: 'permitData', operator: 'stringMinimumLength', value: 1, + path: '$.vehicleDetails.countryCode', }, }, event: { @@ -553,18 +560,20 @@ export const completePolicyConfig: PolicyDefinition = { all: [ { not: { - fact: 'permitData.permitDuration', + fact: 'permitData', operator: 'in', value: [30, 60, 90, 120, 150, 180, 210, 240, 270, 300, 330], + path: '$.permitDuration', }, }, { not: { - fact: 'permitData.permitDuration', + fact: 'permitData', operator: 'equal', value: { fact: 'daysInPermitYear', }, + path: '$.permitDuration', }, }, ], @@ -581,7 +590,8 @@ export const completePolicyConfig: PolicyDefinition = { { conditions: { not: { - fact: 'permitData.vehicleDetails.vehicleSubType', + fact: 'permitData', + path: '$.vehicleDetails.vehicleSubType', operator: 'in', value: { fact: 'allowedVehicles', @@ -640,14 +650,16 @@ export const completePolicyConfig: PolicyDefinition = { all: [ { not: { - fact: 'permitData.permitDuration', + fact: 'permitData', + path: '$.permitDuration', operator: 'in', value: [30, 60, 90, 120, 150, 180, 210, 240, 270, 300, 330], }, }, { not: { - fact: 'permitData.permitDuration', + fact: 'permitData', + path: '$.permitDuration', operator: 'equal', value: { fact: 'daysInPermitYear', @@ -668,7 +680,8 @@ export const completePolicyConfig: PolicyDefinition = { { conditions: { not: { - fact: 'permitData.vehicleDetails.vehicleSubType', + fact: 'permitData', + path: '$.vehicleDetails.vehicleSubType', operator: 'in', value: { fact: 'allowedVehicles', @@ -728,16 +741,18 @@ export const completePolicyConfig: PolicyDefinition = { any: [ { not: { - fact: 'permitData.permitDuration', + fact: 'permitData', operator: 'lessThanInclusive', value: 7, + path: '$.permitDuration', }, }, { not: { - fact: 'permitData.permitDuration', + fact: 'permitData', operator: 'greaterThan', value: 0, + path: '$.permitDuration', }, }, ], @@ -754,19 +769,18 @@ export const completePolicyConfig: PolicyDefinition = { { conditions: { not: { - fact: 'permitData.vehicleDetails.vehicleSubType', - operator: 'in', - value: { - fact: 'allowedVehicles', - }, + fact: 'configurationIsValid', + operator: 'equal', + value: true, }, }, event: { type: 'violation', params: { - message: 'Vehicle type not permittable for this permit type', + message: + 'Vehicle configuration is not permittable for this commodity', code: 'field-validation-error', - fieldReference: 'permitData.vehicleDetails.vehicleSubType', + fieldReference: 'permitData.vehicleConfiguration.trailers', }, }, }, @@ -816,7 +830,7 @@ export const completePolicyConfig: PolicyDefinition = { }, { id: 'BUSTRLR', - name: 'Intercity Buses (Pulling Pony Trailers)', + name: 'Inter-City Bus (Pulling Pony Trailer)', category: 'powerunit', }, { @@ -973,7 +987,12 @@ export const completePolicyConfig: PolicyDefinition = { }, { id: 'FECVYER', - name: 'Fixed Equipment - Conveyors', + name: 'Fixed Equipment - Conveyors (Semi-Trailers)', + category: 'trailer', + }, + { + id: 'FECVYPT', + name: 'Fixed Equipment - Conveyors (Pony Trailers)', category: 'trailer', }, { @@ -1026,9 +1045,14 @@ export const completePolicyConfig: PolicyDefinition = { name: 'Legacy Logging Trailer Combinations - Tandem Pole Trailers, Dogloggers', category: 'trailer', }, + { + id: 'LOGLGCY', + name: 'Legacy Logging Trailer Combinations', + category: 'trailer', + }, { id: 'LOGFULL', - name: 'Logging Trailers - Full Trailers, Tri Axle, Quad Axle', + name: 'Logging Trailer - Full Trailers, Tri Axle, Quad Axle', category: 'trailer', }, { @@ -1038,7 +1062,7 @@ export const completePolicyConfig: PolicyDefinition = { }, { id: 'LOGOWBK', - name: 'Logging Trailers - Overwidth Bunks', + name: 'Logging Trailer - Overwidth Bunks', category: 'trailer', }, { @@ -1188,709 +1212,4288 @@ export const completePolicyConfig: PolicyDefinition = { }, { id: 'NONEXXX', - name: 'No trailer', + name: 'None', category: 'pseudo', }, ], }, commodities: [ { - id: 'WODWIDB', - name: 'Wood on wide bunks', - }, - { - id: 'LEGALLO', - name: 'Legal loads', - }, - { - id: 'GRADERS', - name: 'Grader', - }, - { - id: 'HUSBAND', - name: 'Implements of husbandry', - }, - { - id: 'OILFILD', - name: 'Oil field equipment', - }, - { - id: 'ROKTRUK', - name: 'Rock truck', + id: 'NONEXXX', + name: 'None', + size: { + powerUnits: [ + { + type: 'CONCRET', + trailers: [ + { + type: 'NONEXXX', + jeep: false, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + rp: 6.5, + l: 15.5, + }, + ], + }, + ], + }, + { + type: 'CRAFTAT', + trailers: [ + { + type: 'DOLLIES', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + fp: 10, + rp: 6.5, + w: 3.8, + h: 4.3, + l: 25, + }, + ], + }, + { + type: 'NONEXXX', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + fp: 10, + rp: 6.5, + w: 3.8, + h: 4.3, + l: 14, + regions: [ + { + region: 'PCE', + l: 15, + }, + ], + }, + ], + }, + ], + }, + { + type: 'CRAFTMB', + trailers: [ + { + type: 'DOLLIES', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + fp: 10, + rp: 6.5, + w: 3.8, + h: 4.3, + l: 25, + }, + ], + }, + { + type: 'NONEXXX', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + fp: 10, + rp: 6.5, + w: 3.8, + h: 4.3, + l: 14, + regions: [ + { + region: 'PCE', + l: 15, + }, + ], + }, + ], + }, + ], + }, + { + type: 'DDCKBUS', + trailers: [ + { + type: 'NONEXXX', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + h: 4.42, + regions: [ + { + region: 'LMN', + h: 4.3, + }, + { + region: 'KTN', + h: 4.3, + }, + { + region: 'PCE', + h: 4.3, + }, + ], + }, + ], + }, + ], + }, + { + type: 'GRADERS', + trailers: [ + { + type: 'FEPNYTR', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + rp: 4, + w: 3.2, + h: 4.3, + l: 31, + }, + ], + }, + { + type: 'NONEXXX', + jeep: false, + booster: false, + selfIssue: false, + sizeDimensions: [ + { + w: 3.5, + h: 4.4, + l: 12.5, + regions: [ + { + region: 'LMN', + h: 4.3, + }, + { + region: 'KTN', + h: 4.3, + }, + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + ], + }, + { + type: 'BUSTRLR', + trailers: [ + { + type: 'PONYTRL', + jeep: false, + booster: false, + selfIssue: false, + sizeDimensions: [{}], + }, + ], + }, + { + type: 'LOGOFFH', + trailers: [ + { + type: 'STLOGNG', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + rp: 6.5, + w: 4.4, + }, + ], + }, + ], + }, + { + type: 'LCVRMDB', + trailers: [ + { + type: 'SEMITRL', + jeep: false, + booster: false, + selfIssue: false, + sizeDimensions: [ + { + l: 32, + regions: [ + { + region: 'PCE', + l: 31, + }, + ], + }, + ], + }, + ], + }, + { + type: 'LCVTPDB', + trailers: [ + { + type: 'SEMITRL', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + l: 41, + }, + ], + }, + ], + }, + { + type: 'LWBTRCT', + trailers: [ + { + type: 'SEMITRL', + jeep: true, + booster: true, + selfIssue: false, + sizeDimensions: [ + { + w: 2.6, + h: 4.15, + l: 23, + }, + ], + }, + ], + }, + { + type: 'PICKRTT', + trailers: [ + { + type: 'NONEXXX', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + w: 2.6, + h: 4.15, + l: 16, + }, + ], + }, + { + type: 'STCRANE', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + rp: 6.5, + w: 2.6, + h: 4.15, + l: 25, + }, + ], + }, + { + type: 'STROPRT', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + w: 5, + h: 4.88, + l: 40, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'STRSELF', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + w: 5, + h: 4.88, + l: 36, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + ], + }, + { + type: 'SCRAPER', + trailers: [ + { + type: 'NONEXXX', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + l: 12.5, + }, + ], + }, + ], + }, + { + type: 'TRKTRAC', + trailers: [ + { + type: 'FECVYER', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + fp: 4, + rp: 9.5, + w: 3.8, + h: 4.72, + l: 31, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'FEDRMMX', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + rp: 6.5, + w: 3.8, + h: 4.72, + l: 31, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'FEBGHSE', + jeep: true, + booster: true, + selfIssue: false, + sizeDimensions: [ + { + fp: 3, + rp: 6.5, + w: 4.26, + h: 4.72, + l: 31, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'FESEMTR', + jeep: true, + booster: true, + selfIssue: false, + sizeDimensions: [ + { + fp: 3, + rp: 6.5, + w: 3.8, + h: 4.72, + l: 31, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'FEWHELR', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + w: 5, + h: 4.88, + l: 31, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'ODTRLEX', + jeep: false, + booster: false, + selfIssue: false, + sizeDimensions: [ + { + w: 3.65, + }, + ], + }, + { + type: 'REDIMIX', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + rp: 6.5, + }, + ], + }, + { + type: 'HIBOFLT', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + rp: 6.5, + h: 4.3, + l: 31, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'STREEFR', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + h: 4.3, + }, + ], + }, + { + type: 'STNTSHC', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [{}], + }, + { + type: 'STSDBDK', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + rp: 6.5, + w: 3.2, + h: 4.3, + l: 27.5, + regions: [ + { + region: 'PCE', + l: 32, + }, + ], + }, + ], + }, + { + type: 'STROPRT', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + h: 4.15, + l: 40, + }, + ], + }, + { + type: 'STRSELF', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + l: 36, + }, + ], + }, + ], + }, + { + type: 'REGTRCK', + trailers: [ + { + type: 'FECVYPT', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + fp: 4, + rp: 9.5, + w: 3.2, + h: 4.3, + l: 31, + }, + ], + }, + { + type: 'FEPNYTR', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + rp: 4, + w: 3.2, + h: 4.3, + l: 31, + }, + ], + }, + { + type: 'FULLLTL', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + rp: 6.5, + w: 3.8, + h: 4.3, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'MHMBSHL', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + fp: 1, + rp: 6.9, + h: 4.88, + l: 31.5, + regions: [ + { + region: 'PCE', + h: 5.33, + l: 36, + }, + ], + }, + ], + }, + { + type: 'MHMBSHG', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + fp: 1, + rp: 6.9, + h: 4.88, + l: 31.5, + regions: [ + { + region: 'PCE', + h: 5.33, + l: 36, + }, + ], + }, + ], + }, + { + type: 'NONEXXX', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + fp: 1, + rp: 6.5, + w: 3.2, + h: 4.3, + l: 16, + regions: [ + { + region: 'PCE', + h: 4.4, + }, + ], + }, + ], + }, + { + type: 'ODTRLEX', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + w: 3.65, + }, + ], + }, + { + type: 'PMHWAAX', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + rp: 6.9, + w: 4.4, + h: 4.88, + l: 31.5, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'PONYTRL', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + rp: 6.5, + w: 3.2, + h: 4.3, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + ], + }, + { + type: 'PLOWBLD', + trailers: [ + { + type: 'NONEXXX', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + w: 3.2, + }, + ], + }, + ], + }, + ], + }, }, { - id: 'TIRESXX', - name: 'Tires', + id: 'DOGLOGG', + name: 'Doglogger/Sjostrum Trailers (decked)', + size: { + powerUnits: [ + { + type: 'TRKTRAC', + trailers: [ + { + type: 'NONEXXX', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + rp: 5, + l: 13.5, + }, + ], + }, + ], + }, + ], + }, }, { - id: 'SRVCRIG', - name: 'Service rig', + id: 'GRTBBUK', + name: 'Grader, Tractor Blades, Buckets', + size: { + powerUnits: [ + { + type: 'GRADERS', + trailers: [ + { + type: 'NONEXXX', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + w: 4.4, + }, + ], + }, + ], + }, + ], + }, }, { - id: 'BUNCHER', - name: 'Buncher', + id: 'HAYRACK', + name: 'Hayrack Semi-Trailer with a Folded Chassis/Empty Piggyback', + size: { + powerUnits: [ + { + type: 'TRKTRAC', + trailers: [ + { + type: 'STLOGNG', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + rp: 5, + h: 4.15, + }, + ], + }, + ], + }, + ], + }, }, { - id: 'CONVEYR', - name: 'Conveyor', + id: 'IMCONTN', + name: 'Intermodal Containers', + size: { + powerUnits: [ + { + type: 'TRKTRAC', + trailers: [ + { + type: 'STACTRN', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + h: 4.4, + l: 26, + }, + ], + }, + { + type: 'STBTRAN', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + h: 4.4, + l: 27.5, + }, + ], + }, + { + type: 'HIBOFLT', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + h: 4.4, + }, + ], + }, + ], + }, + { + type: 'REGTRCK', + trailers: [ + { + type: 'NONEXXX', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + h: 4.4, + }, + ], + }, + ], + }, + ], + }, }, { - id: 'SKIDUNT', - name: 'Oil field skid unit', + id: 'IMCONWS', + name: 'Intermodal Containers without Sides', + size: { + powerUnits: [ + { + type: 'TRKTRAC', + trailers: [ + { + type: 'STSDBDK', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + w: 4.4, + h: 4.72, + }, + ], + }, + ], + }, + ], + }, }, { - id: 'EMPTYXX', - name: 'Empty', - powerUnits: [ - { - type: 'TRKTRAC', - canFollow: [], - }, - { - type: 'PICKRTT', - canFollow: [], - }, - ], - trailers: [ - { - type: 'JEEPSRG', - canFollow: ['TRKTRAC', 'PICKRTT', 'JEEPSRG'], - }, - { - type: 'BOOSTER', - canFollow: [ - 'OGOSFDT', - 'PLATFRM', - 'HIBOEXP', - 'STWHELR', - 'STWIDWH', - 'STCRANE', - 'HIBOFLT', - 'STSDBDK', - 'BOOSTER', - ], - }, - { - type: 'LOGOWBK', - canFollow: ['TRKTRAC'], - sizeDimensions: [ - { - width: 3.2, - length: 23, - }, - ], - }, - { - type: 'OGOSFDT', - canFollow: ['PICKRTT', 'JEEPSRG'], - sizeDimensions: [ - { - width: 3.2, - height: 4.3, - length: 23, - }, - ], - }, - { - type: 'PLATFRM', - canFollow: ['TRKTRAC', 'PICKRTT', 'JEEPSRG'], - canSelfIssue: false, - sizeDimensions: [ - { - width: 3.2, - height: 4.88, - length: 27.5, - regions: [ - { - region: 'PCE', - height: 5.33, - }, - ], - }, - ], - }, - { - type: 'HIBOEXP', - canFollow: ['TRKTRAC', 'PICKRTT', 'JEEPSRG'], - sizeDimensions: [ - { - height: 4.4, - length: 25, - regions: [ - { - region: 'PCE', - height: 5.33, - length: 27.5, - }, - ], - modifiers: [ - { - position: 'first', - type: 'PICKRTT', - }, - ], - }, - { - height: 4.4, - length: 31, - regions: [ - { - region: 'PCE', - height: 5.33, - }, - ], - modifiers: [ - { - position: 'first', - type: 'TRKTRAC', - }, - ], - }, - ], - }, - { - type: 'STWHELR', - canFollow: ['TRKTRAC', 'PICKRTT', 'JEEPSRG'], - canSelfIssue: false, - sizeDimensions: [ - { - width: 3.2, - height: 4.88, - length: 27.5, - regions: [ - { - region: 'PCE', - height: 5.33, - }, - ], - }, - ], - }, - { - type: 'STWIDWH', - canFollow: ['TRKTRAC', 'PICKRTT', 'JEEPSRG'], - canSelfIssue: false, - sizeDimensions: [ - { - width: 3.2, - height: 4.88, - length: 27.5, - regions: [ - { - region: 'PCE', - height: 5.33, - }, - ], - }, - ], - }, - { - type: 'STCRANE', - canFollow: ['TRKTRAC', 'PICKRTT', 'JEEPSRG'], - sizeDimensions: [ - { - width: 3.2, - height: 4.88, - length: 27.5, - regions: [ - { - region: 'PCE', - height: 5.33, - }, - ], - }, - ], - }, - { - type: 'HIBOFLT', - canFollow: ['TRKTRAC', 'JEEPSRG'], - sizeDimensions: [ - { - height: 4.4, - length: 27.5, - regions: [ - { - region: 'PCE', - height: 5.33, - }, - ], - }, - ], - }, - { - type: 'STSDBDK', - canFollow: ['TRKTRAC', 'JEEPSRG'], - sizeDimensions: [ - { - width: 3.2, - height: 4.4, - length: 31, - regions: [ - { - region: 'PCE', - height: 5.33, - }, - ], - }, - ], - }, - ], - }, - { - id: 'GENERAL', - name: 'General commodities', - }, - { - id: 'CULVERT', - name: 'Culverts', - }, - { - id: 'RAMPSXX', - name: 'Ramps', - }, - { - id: 'REBARXX', - name: 'Rebar', - }, - { - id: 'RESTEEL', - name: 'Reinforcing steel', - }, - { - id: 'STSTEEL', - name: 'Structural steel', - }, - { - id: 'PIPEXXX', - name: 'Pipe', - }, - { - id: 'GRBBINS', - name: 'Garbage bins', - }, - { - id: 'BOATSXX', - name: 'Boats', - }, - { - id: 'BOOMSTK', - name: 'Boomsticks', - }, - { - id: 'CONTANR', - name: 'Containers', - }, - { - id: 'HAYROND', - name: 'Hay bales round', - }, - { - id: 'HAYLREC', - name: 'Hay bales large rectangular', - }, - { - id: 'HAYBALE', - name: 'Hay bales', - }, - { - id: 'HAYSREC', - name: 'Hay bales small rectangular', - }, - { - id: 'BUILDNG', - name: 'House or building', - }, - { - id: 'LONGLOG', - name: 'Long logs', - }, - { - id: 'PILINGS', - name: 'Piling', - }, - { - id: 'POLESXX', - name: 'Poles', - }, - { - id: 'RUGHLUM', - name: 'Rough cut lumber', - }, - { - id: 'VENEERX', - name: 'Veneer', - }, - { - id: 'MODULAR', - name: 'Modular building', - }, - { - id: 'MOBHOME', - name: 'Mobile home manufactured', - }, - { - id: 'PARKTRL', - name: 'Park model trailers', - }, - { - id: 'AIRCRFT', - name: 'Aircraft', - }, - { - id: 'BACKHOE', - name: 'Backhoes', - }, - { - id: 'BRIDGES', - name: 'Bridges', - }, - { - id: 'BRGBEAM', - name: 'Bridge beams', - powerUnits: [ - { - type: 'TRKTRAC', - canFollow: [], - }, - ], - trailers: [ - { - type: 'JEEPSRG', - canFollow: ['TRKTRAC', 'JEEPSRG'], - }, - { - type: 'BOOSTER', - canFollow: ['POLETRL', 'BOOSTER'], - }, - { - type: 'POLETRL', - canFollow: ['TRKTRAC', 'JEEPSRG'], - }, - ], - }, - { - id: 'BARGESX', - name: 'Barges', - }, - { - id: 'BLADESX', - name: 'Blades', - }, - { - id: 'BUCKETS', - name: 'Buckets', - }, - { - id: 'CATCRLR', - name: 'Cat or crawler', - }, - { - id: 'COALTRK', - name: 'Coal truck', - }, - { - id: 'CMPRSOR', - name: 'Compressor', - }, - { - id: 'CRANESX', - name: 'Cranes', - }, - { - id: 'CRAWLER', - name: 'Crawler', - }, - { - id: 'CRUSHER', - name: 'Crusher parts', - }, - { - id: 'EXCVATR', - name: 'Excavator', - }, - { - id: 'FORKLFT', - name: 'Fork lifts', - }, - { - id: 'GENRTOR', - name: 'Generator', - }, - { - id: 'LOADERX', - name: 'Loader', - }, - { - id: 'LOGGING', - name: 'Logging machinery', - }, - { - id: 'LOGLODR', - name: 'Log loader', - }, - { - id: 'MINEMAC', - name: 'Mine machinery', - }, - { - id: 'MILLMAC', - name: 'Mill machinery', + id: 'LPBOOMS', + name: 'Logs, Poles And Boomsticks (Up To 20.1)', + size: { + powerUnits: [ + { + type: 'TRKTRAC', + trailers: [ + { + type: 'FULLLTL', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + rp: 6.5, + w: 2.9, + l: 27.5, + }, + ], + }, + { + type: 'LOGLGCY', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + rp: 5, + w: 2.6, + l: 25, + }, + ], + }, + { + type: 'POLETRL', + jeep: true, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + rp: 6.5, + w: 2.9, + l: 27.5, + }, + ], + }, + { + type: 'STACTRN', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + rp: 6.5, + w: 2.9, + l: 26, + }, + ], + }, + { + type: 'STBTRAN', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + rp: 6.5, + w: 2.9, + l: 27.5, + }, + ], + }, + { + type: 'HIBOFLT', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + rp: 6.5, + w: 2.9, + l: 25, + }, + ], + }, + { + type: 'STLOGNG', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + rp: 6.5, + w: 2.9, + l: 25, + }, + ], + }, + ], + }, + ], + }, }, { - id: 'NONREDU', - name: 'Non reducible loads', + id: 'LPBOOML', + name: 'Logs, Poles And Boomsticks (Over 20.1)', + size: { + powerUnits: [ + { + type: 'TRKTRAC', + trailers: [ + { + type: 'LOGFULL', + jeep: false, + booster: false, + selfIssue: false, + sizeDimensions: [ + { + fp: 10, + rp: 10, + l: 40, + }, + ], + }, + { + type: 'POLETRL', + jeep: true, + booster: true, + selfIssue: false, + sizeDimensions: [ + { + fp: 8, + rp: 9, + l: 40, + }, + ], + }, + { + type: 'STROPRT', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + fp: 10, + rp: 10, + l: 40, + }, + ], + }, + { + type: 'STRSELF', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + fp: 10, + rp: 10, + l: 36, + }, + ], + }, + ], + }, + ], + }, }, { - id: 'OILDRRG', - name: 'Oil drill rig', + id: 'MFHOMES', + name: 'Manufactured Homes, Modular Buildings, Structures and Houseboats (<= 5.0 m OAW)', + size: { + powerUnits: [ + { + type: 'TRKTRAC', + trailers: [ + { + type: 'SEMITRL', + jeep: true, + booster: true, + selfIssue: false, + sizeDimensions: [ + { + fp: 3, + rp: 7.5, + h: 4.88, + l: 31.5, + regions: [ + { + region: 'PCE', + h: 5.33, + l: 36, + }, + ], + }, + ], + }, + { + type: 'STSDBDK', + jeep: true, + booster: true, + selfIssue: false, + sizeDimensions: [ + { + fp: 3, + rp: 7.5, + h: 4.88, + l: 31.5, + regions: [ + { + region: 'PCE', + h: 5.33, + l: 36, + }, + ], + }, + ], + }, + ], + }, + { + type: 'REGTRCK', + trailers: [ + { + type: 'DOLLIES', + jeep: false, + booster: false, + selfIssue: false, + sizeDimensions: [ + { + fp: 1, + rp: 6.9, + h: 4.88, + l: 31.5, + regions: [ + { + region: 'PCE', + h: 5.33, + l: 36, + }, + ], + }, + ], + }, + { + type: 'FLOATTR', + jeep: false, + booster: false, + selfIssue: false, + sizeDimensions: [ + { + fp: 1, + rp: 6.9, + h: 4.57, + l: 31.5, + regions: [ + { + region: 'PCE', + h: 5.33, + l: 36, + }, + ], + }, + ], + }, + { + type: 'PONYTRL', + jeep: false, + booster: false, + selfIssue: false, + sizeDimensions: [ + { + fp: 1, + rp: 6.9, + h: 4.88, + l: 31.5, + regions: [ + { + region: 'PCE', + h: 5.33, + l: 36, + }, + ], + }, + ], + }, + ], + }, + ], + }, }, { - id: 'OREBOXS', - name: 'Ore boxes', + id: 'MFHOMEL', + name: 'Manufactured Homes, Modular Buildings, Structures and Houseboats (> 5.0 m OAW)', + size: { + powerUnits: [ + { + type: 'TRKTRAC', + trailers: [ + { + type: 'SEMITRL', + jeep: true, + booster: true, + selfIssue: false, + sizeDimensions: [ + { + fp: 3, + rp: 7.5, + h: 4.88, + l: 31.5, + regions: [ + { + region: 'PCE', + h: 5.33, + l: 36, + }, + ], + }, + ], + }, + { + type: 'STSDBDK', + jeep: true, + booster: true, + selfIssue: false, + sizeDimensions: [ + { + fp: 3, + rp: 7.5, + h: 4.88, + l: 31.5, + regions: [ + { + region: 'PCE', + h: 5.33, + l: 36, + }, + ], + }, + ], + }, + ], + }, + { + type: 'REGTRCK', + trailers: [ + { + type: 'DOLLIES', + jeep: false, + booster: false, + selfIssue: false, + sizeDimensions: [ + { + fp: 1, + rp: 6.9, + h: 4.88, + l: 31.5, + regions: [ + { + region: 'PCE', + h: 5.33, + l: 36, + }, + ], + }, + ], + }, + { + type: 'FLOATTR', + jeep: false, + booster: false, + selfIssue: false, + sizeDimensions: [ + { + fp: 1, + rp: 6.9, + h: 4.57, + l: 31.5, + regions: [ + { + region: 'PCE', + h: 5.33, + l: 36, + }, + ], + }, + ], + }, + { + type: 'PONYTRL', + jeep: false, + booster: false, + selfIssue: false, + sizeDimensions: [ + { + fp: 1, + rp: 6.9, + h: 4.88, + l: 31.5, + regions: [ + { + region: 'PCE', + h: 5.33, + l: 36, + }, + ], + }, + ], + }, + ], + }, + ], + }, }, { - id: 'PLSTEEL', - name: 'Plate steel', + id: 'PARKMHS', + name: 'Park Model Homes', + size: { + powerUnits: [ + { + type: 'REGTRCK', + trailers: [ + { + type: 'DOLLIES', + jeep: false, + booster: false, + selfIssue: false, + sizeDimensions: [ + { + fp: 3, + rp: 6.9, + w: 4.4, + h: 4.88, + l: 31.5, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'FLOATTR', + jeep: false, + booster: false, + selfIssue: false, + sizeDimensions: [ + { + fp: 3, + rp: 6.9, + w: 4.4, + h: 4.88, + l: 31.5, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'PONYTRL', + jeep: false, + booster: false, + selfIssue: false, + sizeDimensions: [ + { + fp: 3, + rp: 6.9, + w: 4.4, + h: 4.88, + l: 31.5, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + ], + }, + ], + }, }, { - id: 'STBEAMS', - name: 'Steel beams', + id: 'PIPESTL', + name: 'Pipe And Steel Products (Rebar, Pilings, Reinforcing Steel, Etc.)', + size: { + powerUnits: [ + { + type: 'TRKTRAC', + trailers: [ + { + type: 'HIBOEXP', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + rp: 6.5, + w: 3.2, + h: 4.3, + l: 31, + }, + ], + }, + { + type: 'HIBOFLT', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + rp: 6.5, + w: 3.2, + h: 4.3, + l: 27.5, + }, + ], + }, + { + type: 'STSTEER', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + rp: 6.5, + w: 3.2, + h: 4.3, + l: 36, + }, + ], + }, + { + type: 'STROPRT', + jeep: true, + booster: true, + selfIssue: false, + sizeDimensions: [ + { + fp: 3, + rp: 6.5, + w: 3.2, + h: 4.3, + l: 40, + }, + ], + }, + ], + }, + ], + }, }, { - id: 'SHOVELS', - name: 'Shovels', + id: 'REDUCBL', + name: 'Reducible Loads', + size: { + powerUnits: [ + { + type: 'TRKTRAC', + trailers: [ + { + type: 'STLOGNG', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + w: 3.2, + h: 4.15, + l: 27.5, + }, + ], + }, + { + type: 'PLATFRM', + jeep: true, + booster: true, + selfIssue: false, + sizeDimensions: [ + { + w: 3.2, + h: 4.3, + l: 27.5, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'SEMITRL', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + w: 3.2, + h: 4.3, + l: 27.5, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'STACTRN', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + w: 3.2, + h: 4.3, + l: 26, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'STBTRAN', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + w: 3.2, + h: 4.3, + l: 27.5, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'HIBOEXP', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + w: 3.2, + h: 4.3, + l: 27.5, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'HIBOFLT', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + w: 3.2, + h: 4.3, + l: 27.5, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'STSDBDK', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + w: 3.2, + h: 4.3, + l: 27.5, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'STSTEER', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + w: 3.2, + h: 4.3, + l: 27.5, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'STWHELR', + jeep: true, + booster: true, + selfIssue: false, + sizeDimensions: [ + { + w: 3.2, + h: 4.3, + l: 27.5, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'STWIDWH', + jeep: true, + booster: true, + selfIssue: false, + sizeDimensions: [ + { + w: 3.2, + h: 4.3, + l: 27.5, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'STCRANE', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + w: 3.2, + h: 4.3, + l: 27.5, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'STROPRT', + jeep: true, + booster: true, + selfIssue: false, + sizeDimensions: [ + { + w: 3.2, + h: 4.3, + l: 40, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'STRSELF', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + w: 3.2, + h: 4.3, + l: 36, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + ], + }, + { + type: 'PICKRTT', + trailers: [ + { + type: 'SEMITRL', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + w: 3.2, + h: 4.3, + l: 27.5, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'HIBOEXP', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + w: 3.2, + h: 4.3, + l: 27.5, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'HIBOFLT', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + w: 3.2, + h: 4.3, + l: 27.5, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'STSDBDK', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + w: 3.2, + h: 4.3, + l: 27.5, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + ], + }, + { + type: 'STINGER', + trailers: [ + { + type: 'SEMITRL', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + fp: 1, + rp: 1.2, + h: 4.3, + l: 25, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'STSTNGR', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + fp: 1, + rp: 1.2, + h: 4.3, + l: 25, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + ], + }, + { + type: 'REGTRCK', + trailers: [ + { + type: 'DOLLIES', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + fp: 1, + rp: 6.5, + w: 3.2, + h: 4.3, + l: 25, + regions: [ + { + region: 'PCE', + h: 4.4, + }, + ], + }, + ], + }, + { + type: 'FULLLTL', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + fp: 1, + rp: 6.5, + w: 3.2, + h: 4.3, + l: 25, + regions: [ + { + region: 'PCE', + h: 4.4, + }, + ], + }, + ], + }, + { + type: 'NONEXXX', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + fp: 1, + rp: 6.5, + w: 3.2, + h: 4.3, + l: 16, + regions: [ + { + region: 'PCE', + h: 4.4, + }, + ], + }, + ], + }, + { + type: 'PONYTRL', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + fp: 1, + rp: 6.5, + w: 3.2, + h: 4.3, + l: 25, + regions: [ + { + region: 'PCE', + h: 4.4, + }, + ], + }, + ], + }, + ], + }, + ], + }, }, { - id: 'SKIDDER', - name: 'Skidder', + id: 'SCRAPER', + name: 'Scraper on Dollies', + size: { + powerUnits: [ + { + type: 'TRKTRAC', + trailers: [ + { + type: 'DOLLIES', + jeep: true, + booster: false, + selfIssue: false, + sizeDimensions: [ + { + w: 3.2, + h: 4.3, + l: 25, + regions: [ + { + region: 'PCE', + h: 4.4, + }, + ], + }, + ], + }, + ], + }, + ], + }, }, { - id: 'TRUSSES', - name: 'Trusses', + id: 'OILFILD', + name: 'Oil Field Equipment', + size: { + powerUnits: [ + { + type: 'OGBEDTK', + trailers: [ + { + type: 'EXPANDO', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + rp: 6.5, + h: 4.3, + l: 27.5, + }, + ], + }, + { + type: 'NONEXXX', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + rp: 5, + w: 3.3, + h: 4.3, + l: 14, + }, + ], + }, + { + type: 'OGOSFDT', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + rp: 6.5, + w: 3.3, + h: 4.3, + l: 23, + }, + ], + }, + ], + }, + { + type: 'OGOILSW', + trailers: [ + { + type: 'NONEXXX', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + rp: 5, + w: 3.2, + h: 4.3, + l: 15, + }, + ], + }, + { + type: 'HIBOFLT', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + rp: 6.5, + w: 3.2, + h: 4.3, + l: 25, + }, + ], + }, + ], + }, + { + type: 'OGSERVC', + trailers: [ + { + type: 'NONEXXX', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + fp: 10, + rp: 6.5, + w: 3.8, + h: 4.3, + l: 15, + }, + ], + }, + { + type: 'PONYTRL', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + fp: 10, + rp: 6.5, + w: 3.8, + h: 4.3, + l: 23, + }, + ], + }, + ], + }, + { + type: 'OGSRRAH', + trailers: [ + { + type: 'NONEXXX', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + fp: 10, + rp: 6.5, + w: 2.9, + h: 4.15, + l: 15.5, + }, + ], + }, + { + type: 'PONYTRL', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + fp: 10, + rp: 6.5, + w: 2.9, + h: 4.15, + l: 23, + }, + ], + }, + ], + }, + { + type: 'TRKTRAC', + trailers: [ + { + type: 'OGOSFDT', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + rp: 6.5, + w: 3.3, + h: 4.3, + l: 23, + }, + ], + }, + ], + }, + ], + }, }, { - id: 'TANKSXX', - name: 'Tanks', + id: 'JPTRLOG', + name: 'Tandem Jeep/Pole Trailer Loaded on Logging Truck', + size: { + powerUnits: [ + { + type: 'TRKTRAC', + trailers: [ + { + type: 'NONEXXX', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + rp: 5, + w: 2.9, + h: 4.3, + }, + ], + }, + ], + }, + { + type: 'REGTRCK', + trailers: [ + { + type: 'NONEXXX', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + rp: 5, + w: 2.9, + h: 4.3, + }, + ], + }, + ], + }, + ], + }, }, { - id: 'TRNSFRM', - name: 'Transformer', + id: 'TOWDISB', + name: 'Tow Trucks And Disabled Vehicles', + size: { + powerUnits: [ + { + type: 'TOWVEHC', + trailers: [ + { + type: 'NONEXXX', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + h: 4.3, + l: 27.5, + }, + ], + }, + ], + }, + ], + }, }, { - id: 'TWRTUBE', - name: 'Tower tube', + id: 'TRQDLOG', + name: 'Tri-Axle or Quad Axle Full Trailer Loaded on Logging Truck', + size: { + powerUnits: [ + { + type: 'TRKTRAC', + trailers: [ + { + type: 'NONEXXX', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + rp: 5, + h: 4.3, + l: 13.5, + }, + ], + }, + ], + }, + { + type: 'REGTRCK', + trailers: [ + { + type: 'NONEXXX', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + rp: 5, + h: 4.3, + l: 13.5, + }, + ], + }, + ], + }, + ], + }, }, { - id: 'VESSELS', - name: 'Vessels', + id: 'WOODCHP', + name: 'Wood Chips, Residuals', + size: { + powerUnits: [ + { + type: 'TRKTRAC', + trailers: [ + { + type: 'STBTRAN', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + h: 4.45, + l: 27.5, + }, + ], + }, + ], + }, + ], + }, }, { - id: 'LMBEAMS', - name: 'Laminated beams', + id: 'EMPTYXX', + name: 'Empty', + size: { + powerUnits: [ + { + type: 'TRKTRAC', + trailers: [ + { + type: 'LOGOWBK', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + fp: 0, + rp: 0, + w: 3.2, + }, + ], + }, + { + type: 'PLATFRM', + jeep: true, + booster: true, + selfIssue: false, + sizeDimensions: [ + { + w: 3.2, + h: 4.88, + l: 27.5, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'HIBOEXP', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + rp: 6.5, + l: 31, + }, + ], + }, + { + type: 'HIBOFLT', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + rp: 6.5, + l: 27.5, + }, + ], + }, + { + type: 'STSDBDK', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + rp: 6.5, + w: 3.2, + l: 31, + }, + ], + }, + { + type: 'STWHELR', + jeep: true, + booster: true, + selfIssue: false, + sizeDimensions: [ + { + w: 3.2, + h: 4.88, + l: 27.5, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'STWIDWH', + jeep: true, + booster: true, + selfIssue: false, + sizeDimensions: [ + { + w: 3.2, + h: 4.88, + l: 27.5, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'STCRANE', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + w: 3.2, + h: 4.88, + l: 27.5, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + ], + }, + { + type: 'PICKRTT', + trailers: [ + { + type: 'OGOSFDT', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + rp: 6.5, + w: 3.2, + h: 4.3, + l: 23, + }, + ], + }, + { + type: 'PLATFRM', + jeep: true, + booster: true, + selfIssue: false, + sizeDimensions: [ + { + w: 3.2, + h: 4.88, + l: 27.5, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'HIBOEXP', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + rp: 6.5, + l: 25, + regions: [ + { + region: 'PCE', + l: 27.5, + }, + ], + }, + ], + }, + { + type: 'STWHELR', + jeep: true, + booster: true, + selfIssue: false, + sizeDimensions: [ + { + w: 3.2, + h: 4.88, + l: 27.5, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'STWIDWH', + jeep: true, + booster: true, + selfIssue: false, + sizeDimensions: [ + { + w: 3.2, + h: 4.88, + l: 27.5, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'STCRANE', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + w: 3.2, + h: 4.88, + l: 27.5, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + ], + }, + ], + }, }, { - id: 'YARDERX', - name: 'Yarder', + id: 'GRBBINS', + name: 'Garbage Bins', + size: { + powerUnits: [ + { + type: 'REGTRCK', + trailers: [ + { + type: 'FULLLTL', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + rp: 6.5, + }, + ], + }, + { + type: 'NONEXXX', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + rp: 6.5, + }, + ], + }, + { + type: 'PONYTRL', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + rp: 6.5, + }, + ], + }, + ], + }, + ], + }, }, { - id: 'SKDSTAK', - name: 'Skid stack', + id: 'LAMBEAM', + name: 'Laminated Beams', + size: { + powerUnits: [ + { + type: 'TRKTRAC', + trailers: [ + { + type: 'POLETRL', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + rp: 6.5, + l: 40, + }, + ], + }, + { + type: 'HIBOEXP', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + rp: 6.5, + l: 31, + }, + ], + }, + ], + }, + ], + }, }, { - id: 'OTHERVE', - name: 'Other vehicle', + id: 'HAYLREC', + name: 'Hay Bales Large Rectangular', + size: { + powerUnits: [ + { + type: 'TRKTRAC', + trailers: [ + { + type: 'STACTRN', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + w: 3.05, + h: 4.3, + l: 26, + regions: [ + { + region: 'PCE', + h: 4.8, + }, + ], + }, + ], + }, + { + type: 'STBTRAN', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + w: 3.05, + h: 4.3, + l: 27.5, + regions: [ + { + region: 'PCE', + h: 4.8, + }, + ], + }, + ], + }, + { + type: 'HIBOFLT', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + rp: 6.5, + w: 3.05, + h: 4.4, + regions: [ + { + region: 'LMN', + h: 4.3, + }, + { + region: 'KTN', + h: 4.3, + }, + { + region: 'PCE', + h: 4.8, + }, + ], + }, + ], + }, + { + type: 'STSDBDK', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + rp: 6.5, + w: 3.05, + h: 4.3, + regions: [ + { + region: 'PCE', + h: 4.8, + }, + ], + }, + ], + }, + ], + }, + { + type: 'REGTRCK', + trailers: [ + { + type: 'FULLLTL', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + rp: 4, + w: 3.05, + h: 4.3, + regions: [ + { + region: 'PCE', + h: 4.8, + }, + ], + }, + ], + }, + { + type: 'NONEXXX', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + w: 3.05, + h: 4.3, + regions: [ + { + region: 'PCE', + h: 4.8, + }, + ], + }, + ], + }, + { + type: 'PONYTRL', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + rp: 4, + w: 3.05, + h: 4.3, + regions: [ + { + region: 'PCE', + h: 4.8, + }, + ], + }, + ], + }, + ], + }, + ], + }, }, { - id: 'SCRAPER', - name: 'Scrapers', + id: 'HAYROND', + name: 'Hay Bales Round', + size: { + powerUnits: [ + { + type: 'TRKTRAC', + trailers: [ + { + type: 'STACTRN', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + w: 3.5, + h: 4.3, + l: 26, + regions: [ + { + region: 'PCE', + w: 3.84, + h: 4.8, + }, + ], + }, + ], + }, + { + type: 'STBTRAN', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + w: 3.5, + h: 4.3, + l: 27.5, + regions: [ + { + region: 'PCE', + w: 3.84, + h: 4.8, + }, + ], + }, + ], + }, + { + type: 'HIBOFLT', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + rp: 6.5, + w: 3.5, + h: 4.3, + regions: [ + { + region: 'PCE', + w: 3.84, + h: 4.8, + }, + ], + }, + ], + }, + { + type: 'STSDBDK', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + rp: 6.5, + w: 3.5, + h: 4.3, + regions: [ + { + region: 'PCE', + w: 3.84, + h: 4.8, + }, + ], + }, + ], + }, + ], + }, + { + type: 'REGTRCK', + trailers: [ + { + type: 'FULLLTL', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + rp: 4, + w: 3.5, + h: 4.3, + regions: [ + { + region: 'PCE', + w: 3.84, + h: 4.8, + }, + ], + }, + ], + }, + { + type: 'NONEXXX', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + w: 3.5, + h: 4.3, + regions: [ + { + region: 'PCE', + w: 3.84, + h: 4.8, + }, + ], + }, + ], + }, + { + type: 'PONYTRL', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + rp: 4, + w: 3.5, + h: 4.3, + regions: [ + { + region: 'PCE', + w: 3.84, + h: 4.8, + }, + ], + }, + ], + }, + ], + }, + ], + }, }, { - id: 'BMCRANE', - name: 'Booms (cranes)', + id: 'HAYSREC', + name: 'Hay Bales Small Rectangular', + size: { + powerUnits: [ + { + type: 'TRKTRAC', + trailers: [ + { + type: 'STACTRN', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + w: 3.05, + h: 4.3, + l: 26, + regions: [ + { + region: 'PCE', + h: 4.8, + }, + ], + }, + ], + }, + { + type: 'STBTRAN', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + w: 3.05, + h: 4.3, + l: 27.5, + regions: [ + { + region: 'PCE', + h: 4.8, + }, + ], + }, + ], + }, + { + type: 'HIBOFLT', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + rp: 6.5, + w: 3.05, + h: 4.3, + regions: [ + { + region: 'PCE', + h: 4.8, + }, + ], + }, + ], + }, + { + type: 'STSDBDK', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + rp: 6.5, + w: 3.05, + h: 4.3, + regions: [ + { + region: 'PCE', + h: 4.8, + }, + ], + }, + ], + }, + ], + }, + { + type: 'REGTRCK', + trailers: [ + { + type: 'FULLLTL', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + rp: 4, + w: 3.05, + h: 4.3, + regions: [ + { + region: 'PCE', + h: 4.8, + }, + ], + }, + ], + }, + { + type: 'NONEXXX', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + w: 3.05, + h: 4.3, + regions: [ + { + region: 'PCE', + h: 4.8, + }, + ], + }, + ], + }, + { + type: 'PONYTRL', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + rp: 4, + w: 3.05, + h: 4.3, + regions: [ + { + region: 'PCE', + h: 4.8, + }, + ], + }, + ], + }, + ], + }, + ], + }, }, { - id: 'GENVEHC', - name: 'General - vehicle and loads', + id: 'BRGBEAM', + name: 'Bridge Beams', + size: { + powerUnits: [ + { + type: 'TRKTRAC', + trailers: [ + { + type: 'POLETRL', + jeep: true, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + rp: 6.5, + l: 31, + }, + ], + }, + ], + }, + ], + }, }, { - id: 'GENMOHO', - name: 'General - mobile homes', + id: 'NONREDU', + name: 'Non-Reducible Loads', + size: { + powerUnits: [ + { + type: 'TRKTRAC', + trailers: [ + { + type: 'STLOGNG', + jeep: false, + booster: false, + selfIssue: false, + sizeDimensions: [ + { + w: 3.8, + h: 4.15, + l: 27.5, + }, + ], + }, + { + type: 'PLATFRM', + jeep: true, + booster: true, + selfIssue: false, + sizeDimensions: [ + { + w: 5, + h: 4.88, + l: 27.5, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'SEMITRL', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + w: 5, + h: 4.88, + l: 27.5, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'STACTRN', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + w: 5, + h: 4.4, + l: 26, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'STBTRAN', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + w: 5, + h: 4.4, + l: 27.5, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'HIBOEXP', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + w: 5, + h: 4.4, + l: 27.5, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'HIBOFLT', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + w: 5, + h: 4.4, + l: 27.5, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'STSDBDK', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + w: 5, + h: 4.88, + l: 27.5, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'STSTEER', + jeep: true, + booster: true, + selfIssue: false, + sizeDimensions: [ + { + w: 5, + h: 4.88, + l: 27.5, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'STWHELR', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + w: 5, + h: 4.88, + l: 27.5, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'STWIDWH', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + w: 5, + h: 4.88, + l: 27.5, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'STCRANE', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + w: 5, + h: 4.88, + l: 27.5, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'STROPRT', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + w: 5, + h: 4.88, + l: 40, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'STRSELF', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + w: 5, + h: 4.88, + l: 36, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + ], + }, + { + type: 'PICKRTT', + trailers: [ + { + type: 'OGOSFDT', + jeep: true, + booster: true, + selfIssue: false, + sizeDimensions: [ + { + fp: 3, + rp: 6.5, + w: 3.3, + h: 4.3, + l: 23, + }, + ], + }, + { + type: 'SEMITRL', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + w: 5, + h: 4.88, + l: 25, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'HIBOEXP', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + w: 5, + h: 4.4, + l: 25, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'HIBOFLT', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + w: 5, + h: 4.4, + l: 25, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'STSDBDK', + jeep: true, + booster: true, + selfIssue: false, + sizeDimensions: [ + { + fp: 3, + w: 5, + h: 4.88, + l: 25, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'STSTEER', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + w: 5, + h: 4.88, + l: 27.5, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'STWHELR', + jeep: true, + booster: true, + selfIssue: false, + sizeDimensions: [ + { + w: 5, + h: 4.88, + l: 27.5, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'STWIDWH', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + w: 5, + h: 4.88, + l: 27.5, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'STCRANE', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + w: 5, + h: 4.88, + l: 27.5, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'STROPRT', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + w: 5, + h: 4.88, + l: 40, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'STRSELF', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + w: 5, + h: 4.88, + l: 36, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + ], + }, + { + type: 'STINGER', + trailers: [ + { + type: 'SEMITRL', + jeep: false, + booster: false, + selfIssue: false, + sizeDimensions: [ + { + fp: 1, + rp: 1.2, + h: 4.88, + l: 25, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'STSTNGR', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + fp: 1, + rp: 1.2, + h: 4.88, + l: 25, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + ], + }, + { + type: 'REGTRCK', + trailers: [ + { + type: 'DOLLIES', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + fp: 1, + rp: 6.5, + w: 5, + h: 4.88, + l: 25, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'FULLLTL', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + fp: 1, + rp: 6.5, + w: 5, + h: 4.88, + l: 25, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'NONEXXX', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + fp: 1, + rp: 6.5, + w: 5, + h: 4.88, + l: 16, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'PONYTRL', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + fp: 1, + rp: 6.5, + w: 5, + h: 4.88, + l: 25, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + ], + }, + ], + }, }, { id: 'AUTOCRR', - name: 'Auto carrier, campers and boats (stinger steered)', - powerUnits: [ - { - type: 'STINGER', - canFollow: [], - }, - ], - trailers: [ - { - type: 'STSTNGR', - canFollow: ['STINGER'], - sizeDimensions: [ - { - frontProjection: 1, - rearProjection: 1.2, - width: 2.6, - height: 4.4, - length: 25, - regions: [ - { - region: 'LMN', - height: 4.3, - }, - { - region: 'KTN', - height: 4.3, - }, - { - region: 'PCE', - height: 4.88, - }, - ], - }, - ], - }, - ], - }, - { - id: 'BMPOLES', - name: 'Boomsticks and poles', + name: 'Auto Carrier, Campers And Boats (Stinger Steered Transporters Only)', + size: { + powerUnits: [ + { + type: 'STINGER', + trailers: [ + { + type: 'STSTNGR', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + fp: 1, + rp: 1.2, + h: 4.4, + l: 25, + regions: [ + { + region: 'LMN', + h: 4.3, + }, + { + region: 'KTN', + h: 4.3, + }, + { + region: 'PCE', + h: 4.88, + }, + ], + }, + ], + }, + ], + }, + ], + }, }, { id: 'HAYRNPR', - name: 'Haybales (round) Peace River only', - }, - { - id: 'BUSPONY', - name: 'Inter-city bus with pony trailer', - }, - { - id: 'TOWTRCK', - name: 'Tow trucks and disabled vehicles', + name: 'Hay Bales (Round) Peace River Only', + size: { + powerUnits: [ + { + type: 'TRKTRAC', + trailers: [ + { + type: 'STACTRN', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + w: 3.5, + h: 4.3, + l: 26, + regions: [ + { + region: 'PCE', + w: 3.84, + h: 4.8, + }, + ], + }, + ], + }, + { + type: 'STBTRAN', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + w: 3.5, + h: 4.3, + regions: [ + { + region: 'PCE', + w: 3.84, + h: 4.8, + }, + ], + }, + ], + }, + { + type: 'HIBOFLT', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + rp: 6.5, + w: 3.5, + h: 4.3, + regions: [ + { + region: 'PCE', + w: 3.84, + h: 4.8, + }, + ], + }, + ], + }, + { + type: 'STSDBDK', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + rp: 6.5, + w: 3.5, + h: 4.3, + regions: [ + { + region: 'PCE', + w: 3.84, + h: 4.8, + }, + ], + }, + ], + }, + ], + }, + { + type: 'REGTRCK', + trailers: [ + { + type: 'FULLLTL', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + rp: 4, + w: 3.5, + h: 4.3, + regions: [ + { + region: 'PCE', + w: 3.84, + h: 4.8, + }, + ], + }, + ], + }, + { + type: 'NONEXXX', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + w: 3.5, + h: 4.3, + regions: [ + { + region: 'PCE', + w: 3.84, + h: 4.8, + }, + ], + }, + ], + }, + { + type: 'PONYTRL', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + rp: 4, + w: 3.5, + h: 4.3, + regions: [ + { + region: 'PCE', + w: 3.84, + h: 4.8, + }, + ], + }, + ], + }, + ], + }, + ], + }, }, { id: 'BRSHCUT', - name: 'Brushcutters (Peace only)', - powerUnits: [ - { - type: 'TRKTRAC', - canFollow: [], - }, - { - type: 'REGTRCK', - canFollow: [], - }, - ], - trailers: [ - { - type: 'JEEPSRG', - canFollow: ['TRKTRAC', 'JEEPSRG'], - }, - { - type: 'BOOSTER', - canFollow: ['STSDBDK', 'BOOSTER'], - }, - { - type: 'SEMITRL', - canFollow: ['TRKTRAC'], - sizeDimensions: [ - { - length: 23, - regions: [ - { - region: 'PCE', - width: 4.57, - height: 5.33, - }, - ], - }, - ], - }, - { - type: 'STSDBDK', - canFollow: ['TRKTRAC', 'JEEPSRG'], - sizeDimensions: [ - { - length: 23, - regions: [ - { - region: 'PCE', - width: 4.57, - height: 5.33, - }, - ], - }, - ], - }, - { - type: 'FULLLTL', - canFollow: ['REGTRCK'], - sizeDimensions: [ - { - frontProjection: 1, - rearProjection: 1, - length: 23, - regions: [ - { - region: 'PCE', - width: 4.57, - height: 5.33, - }, - ], - }, - ], - }, - { - type: 'NONEXXX', - canFollow: ['REGTRCK'], - sizeDimensions: [ - { - frontProjection: 1, - rearProjection: 1, - length: 12.5, - regions: [ - { - region: 'PCE', - width: 4.57, - height: 5.33, - }, - ], - }, - ], - }, - { - type: 'PONYTRL', - canFollow: ['REGTRCK'], - sizeDimensions: [ - { - frontProjection: 1, - rearProjection: 1, - length: 23, - regions: [ - { - region: 'PCE', - width: 4.57, - height: 5.33, - }, - ], - }, - ], - }, - ], + name: 'Brushcutters (Peace Only)', + size: { + powerUnits: [ + { + type: 'TRKTRAC', + trailers: [ + { + type: 'SEMITRL', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + rp: 6.5, + regions: [ + { + region: 'PCE', + w: 4.57, + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'STSDBDK', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + rp: 6.5, + regions: [ + { + region: 'PCE', + w: 4.57, + h: 5.33, + }, + ], + }, + ], + }, + ], + }, + { + type: 'REGTRCK', + trailers: [ + { + type: 'NONEXXX', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + regions: [ + { + region: 'PCE', + w: 4.57, + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'PONYTRL', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + regions: [ + { + region: 'PCE', + w: 3.8, + h: 5.33, + }, + ], + }, + ], + }, + ], + }, + ], + }, }, { id: 'FIXEDEQ', - name: 'Fixed equipment', + name: 'Fixed Equipment', + size: { + powerUnits: [ + { + type: 'TRKTRAC', + trailers: [ + { + type: 'FECVYER', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + fp: 4, + rp: 9.5, + w: 3.8, + h: 4.72, + l: 31, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'FEDRMMX', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + rp: 6.5, + w: 3.8, + h: 4.72, + l: 31, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'FEBGHSE', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + rp: 6.5, + w: 4.26, + h: 4.72, + l: 31, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'FESEMTR', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + rp: 6.5, + w: 3.8, + h: 4.72, + l: 31, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'FEWHELR', + jeep: true, + booster: true, + selfIssue: false, + sizeDimensions: [ + { + fp: 3, + rp: 6.5, + w: 3.8, + h: 4.72, + l: 31, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + ], + }, + { + type: 'REGTRCK', + trailers: [ + { + type: 'FECVYPT', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + fp: 4, + rp: 9.5, + w: 3.2, + h: 4.3, + l: 31, + }, + ], + }, + { + type: 'FEDRMMX', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + rp: 6.5, + w: 3.8, + h: 4.72, + l: 31, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'FEPNYTR', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + rp: 4, + w: 3.2, + h: 4.3, + l: 31, + }, + ], + }, + { + type: 'FEBGHSE', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + rp: 6.5, + w: 4.26, + h: 4.72, + l: 31, + }, + ], + }, + ], + }, + ], + }, }, ], globalSizeDefaults: { - frontProjection: 3, - rearProjection: 6.5, - width: 2.6, - height: 4.15, - length: 31, + fp: 3, + rp: 6.5, + w: 2.6, + h: 4.15, + l: 31, }, }; diff --git a/policy-engine/src/_test/policy-config/five-types.sample.ts b/policy-engine/src/_test/policy-config/five-types.sample.ts index 39c9a5096..3d35daa04 100644 --- a/policy-engine/src/_test/policy-config/five-types.sample.ts +++ b/policy-engine/src/_test/policy-config/five-types.sample.ts @@ -4,15 +4,15 @@ export const fiveTypes: PolicyDefinition = { version: '2024.03.18.001', geographicRegions: [ { - id: 'lm', + id: 'LMN', name: 'Lower Mainland', }, { - id: 'kootenay', + id: 'KTN', name: 'Kootenay', }, { - id: 'peace', + id: 'PCE', name: 'Peace', }, ], @@ -20,7 +20,8 @@ export const fiveTypes: PolicyDefinition = { { conditions: { not: { - fact: 'permitData.companyName', + fact: 'permitData', + path: '$.companyName', operator: 'stringMinimumLength', value: 1, }, @@ -36,7 +37,8 @@ export const fiveTypes: PolicyDefinition = { conditions: { any: [ { - fact: 'permitData.startDate', + fact: 'permitData', + path: '$.startDate', operator: 'dateLessThan', value: { fact: 'validationDate', @@ -54,7 +56,8 @@ export const fiveTypes: PolicyDefinition = { { conditions: { not: { - fact: 'permitData.vehicleDetails.vin', + fact: 'permitData', + path: '$.vehicleDetails.vin', operator: 'regex', value: '^[a-zA-Z0-9]{6}$', }, @@ -89,14 +92,16 @@ export const fiveTypes: PolicyDefinition = { all: [ { not: { - fact: 'permitData.permitDuration', + fact: 'permitData', + path: '$.permitDuration', operator: 'in', value: [30, 60, 90, 120, 150, 180, 210, 240, 270, 300, 330], }, }, { not: { - fact: 'permitData.permitDuration', + fact: 'permitData', + path: '$.permitDuration', operator: 'equal', value: { fact: 'daysInPermitYear', @@ -171,13 +176,7 @@ export const fiveTypes: PolicyDefinition = { 'poletrailer', 'hiboyexpando', ], - allowedCommodities: [ - 'bridgebeams', - 'empty', - 'fixed', - 'intermodalcontainers', - 'laminatedbeams', - ], + allowedCommodities: ['NONEXXX', 'DOGLOGG', 'GRTBBUK'], }, { id: 'STWS', @@ -262,11 +261,11 @@ export const fiveTypes: PolicyDefinition = { ], }, globalSizeDefaults: { - frontProjection: 3, - rearProjection: 6.5, - width: 2.6, - height: 4.15, - length: 31, + fp: 3, + rp: 6.5, + w: 2.6, + h: 4.15, + l: 31, }, vehicleCategories: { trailerCategories: [ @@ -363,558 +362,1291 @@ export const fiveTypes: PolicyDefinition = { vehicleTypes: { powerUnitTypes: [ { - id: 'trucktractor', - name: 'Truck Tractor', + id: 'BUSCRUM', + name: 'Buses/Crummies', category: 'powerunit', - defaultWeightDimensions: [ - { - axles: 11, - }, - { - axles: 12, - }, - { - axles: 13, - }, - { - axles: 22, - }, - { - axles: 23, - }, - ], }, { - id: 'pickertrucktractor', - name: 'Picker Truck Tractor', + id: 'BUSTRLR', + name: 'Inter-City Bus (Pulling Pony Trailer)', category: 'powerunit', - defaultWeightDimensions: [ - { - axles: 11, - saLegal: 9100, - saPermittable: 9100, - daLegal: 9100, - daPermittable: 9100, - }, - { - axles: 12, - saLegal: 9100, - saPermittable: 9100, - daLegal: 17000, - daPermittable: 17000, - }, - { - axles: 13, - saLegal: 9100, - saPermittable: 9100, - daLegal: 24000, - daPermittable: 24000, - }, - { - axles: 22, - saLegal: 17000, - saPermittable: 17000, - daLegal: 17000, - daPermittable: 17000, - }, - { - axles: 23, - saLegal: 15200, - saPermittable: 15200, - daLegal: 24000, - daPermittable: 24000, - }, - ], }, { - id: 'truck', - name: 'Truck', + id: 'CONCRET', + name: 'Concrete Pumper Trucks', + category: 'powerunit', + }, + { + id: 'CRAFTAT', + name: 'Cranes, Rubber-Tired Loaders, Firetrucks - All Terrain', + category: 'powerunit', + }, + { + id: 'CRAFTMB', + name: 'Cranes, Rubber-Tired Loaders, Firetrucks - Mobile', + category: 'powerunit', + }, + { + id: 'DDCKBUS', + name: 'Double Decker Buses', + category: 'powerunit', + }, + { + id: 'FARMVEH', + name: 'Farm Vehicles', + category: 'powerunit', + }, + { + id: 'GRADERS', + name: 'Fixed Equipment - Trucks/Graders etc.', + category: 'powerunit', + }, + { + id: 'LCVRMDB', + name: 'Long Combination Vehicles (LCV) - Rocky Mountain Doubles', + category: 'powerunit', + }, + { + id: 'LCVTPDB', + name: 'Long Combination Vehicles (LCV) - Turnpike Doubles', + category: 'powerunit', + }, + { + id: 'LOGGING', + name: 'Logging Trucks', + category: 'powerunit', + }, + { + id: 'LOGOFFH', + name: 'Logging Trucks - Off-Highway', + category: 'powerunit', + }, + { + id: 'LWBTRCT', + name: 'Long Wheelbase Truck Tractors Exceeding 6.2 m up to 7.25 m', + category: 'powerunit', + }, + { + id: 'MUNFITR', + name: 'Municipal Fire Trucks', + category: 'powerunit', + }, + { + id: 'OGBEDTK', + name: 'Oil and Gas - Bed Trucks', + category: 'powerunit', + }, + { + id: 'OGOILSW', + name: 'Oil and Gas - Oilfield Sows', + category: 'powerunit', + }, + { + id: 'OGSERVC', + name: 'Oil and Gas - Service Rigs', + category: 'powerunit', + }, + { + id: 'OGSRRAH', + name: 'Oil and Gas - Service Rigs and Rathole Augers Only Equipped with Heavy Front Projected Crane (must exceed 14,000 kg tare weight)', + category: 'powerunit', + }, + { + id: 'PICKRTT', + name: 'Picker Truck Tractors', + category: 'powerunit', + }, + { + id: 'PLOWBLD', + name: 'Trucks Equipped with Front or Underbody Plow Blades', + category: 'powerunit', + }, + { + id: 'PUTAXIS', + name: 'Taxis', + category: 'powerunit', + }, + { + id: 'REGTRCK', + name: 'Trucks', + category: 'powerunit', + }, + { + id: 'SCRAPER', + name: 'Scrapers', + category: 'powerunit', + }, + { + id: 'SPAUTHV', + name: 'Specially Authorized Vehicles', + category: 'powerunit', + }, + { + id: 'STINGER', + name: 'Truck Tractors - Stinger Steered', + category: 'powerunit', + }, + { + id: 'TOWVEHC', + name: 'Tow Vehicles', + category: 'powerunit', + }, + { + id: 'TRKTRAC', + name: 'Truck Tractors', category: 'powerunit', - defaultWeightDimensions: [ - { - axles: 11, - saLegal: 9100, - saPermittable: 9100, - daLegal: 9100, - daPermittable: 11000, - }, - { - axles: 12, - saLegal: 9100, - saPermittable: 9100, - daLegal: 17000, - daPermittable: 23000, - }, - { - axles: 13, - saLegal: 9100, - saPermittable: 9100, - daLegal: 24000, - daPermittable: 28000, - }, - { - axles: 22, - saLegal: 17000, - saPermittable: 17000, - daLegal: 17000, - daPermittable: 23000, - }, - { - axles: 23, - saLegal: 13600, - saPermittable: 15200, - daLegal: 24000, - daPermittable: 28000, - }, - ], }, ], trailerTypes: [ { - id: 'poletrailer', - name: 'Pole Trailer', - category: 'semitrailer', + id: 'BOOSTER', + name: 'Boosters', + category: 'accessory', }, { - id: 'expando', - name: 'Expando Semi-Trailer', - category: 'semitrailer', + id: 'DBTRBTR', + name: 'Tandem/Tridem Drive B-Train (Super B-Train)', + category: 'trailer', }, { - id: 'ogoilfieldsemi', - name: 'Oil and Gas - Oversize Oilfield Flat Deck Semi-Trailer', - category: 'semitrailer', + id: 'DOLLIES', + name: 'Dollies', + category: 'trailer', }, { - id: 'platform', - name: 'Platform Trailer', - category: 'semitrailer', + id: 'EXPANDO', + name: 'Expando Semi-Trailers', + category: 'trailer', }, { - id: 'semi', - name: 'Semi-Trailer', - category: 'semitrailer', + id: 'FEBGHSE', + name: 'Fixed Equipment - Portable Asphalt Baghouses', + category: 'trailer', }, { - id: 'hiboyexpando', - name: 'Semi-Trailer - Hiboy/Expando', - category: 'semitrailer', + id: 'FECVYER', + name: 'Fixed Equipment - Conveyors (Semi-Trailers)', + category: 'trailer', }, { - id: 'hiboyflatdeck', - name: 'Semi-Trailer - Hiboy/Flat Deck', - category: 'semitrailer', + id: 'FECVYPT', + name: 'Fixed Equipment - Conveyors (Pony Trailers)', + category: 'trailer', }, { - id: 'drop', - name: 'Semi-Trailer - Single Drop, Double Drop, Step Deck, Lowbed, Expando, etc.', - category: 'semitrailer', + id: 'FEDRMMX', + name: 'Fixed Equipment - Counter Flow Asphalt Drum Mixers', + category: 'trailer', }, { - id: 'steering', - name: 'Semi-Trailer - Steering Trailer', - category: 'semitrailer', + id: 'FEPNYTR', + name: 'Fixed Equipment - Pony Trailers', + category: 'trailer', }, { - id: 'wheeler', - name: 'Semi-Trailer - Wheeler', + id: 'FESEMTR', + name: 'Fixed Equipment - Semi-Trailers', + category: 'trailer', + }, + { + id: 'FEWHELR', + name: 'Fixed Equipment - Wheeler Semi-Trailers', category: 'wheeler', }, { - id: 'widewheeler', - name: 'Semi-Trailer - Wide Wheeler', + id: 'FLOATTR', + name: 'Float Trailers', category: 'wheeler', }, { - id: 'semicrane', - name: 'Semi-Trailer with Crane', - category: 'semitrailer', + id: 'FULLLTL', + name: 'Full Trailers', + category: 'trailer', }, { - id: 'widetandem', - name: 'Semi-Trailer - Widespread Tandem', - category: 'semitrailer', - defaultWeightDimensions: [ - { - axles: 2, - legal: 9100, - permittable: 18200, - }, - ], + id: 'HIBOEXP', + name: 'Semi-Trailers - Hiboys/Expandos', + category: 'trailer', }, { - id: 'pony', - name: 'Pony Trailer', - category: 'semitrailer', - defaultWeightDimensions: [ - { - axles: 1, - }, - { - axles: 2, - legal: 17000, - permittable: 21000, - }, - { - axles: 3, - legal: 21000, - permittable: 21000, - }, - ], + id: 'HIBOFLT', + name: 'Semi-Trailers - Hiboys/Flat Decks', + category: 'trailer', }, { - id: 'fixedwheeler', - name: 'Fixed Equipment - Wheeler Semi-Trailer', - category: 'semitrailer', - defaultWeightDimensions: [ - { - axles: 2, - legal: 17000, - permittable: 31000, - canSelfIssue: false, - }, - { - axles: 3, - legal: 24000, - permittable: 40000, - canSelfIssue: false, - }, - ], + id: 'JEEPSRG', + name: 'Jeeps', + category: 'accessory', }, { - id: 'booster', - name: 'Booster', - category: 'Booster', - defaultWeightDimensions: [ + id: 'LOGDGLG', + name: 'Legacy Logging Trailer Combinations - Tandem Pole Trailers, Dogloggers', + category: 'trailer', + }, + { + id: 'LOGLGCY', + name: 'Legacy Logging Trailer Combinations', + category: 'trailer', + }, + { + id: 'LOGFULL', + name: 'Logging Trailer - Full Trailers, Tri Axle, Quad Axle', + category: 'trailer', + }, + { + id: 'LOGNTAC', + name: 'Legacy Logging Trailer Combinations - Non-TAC B-Trains', + category: 'trailer', + }, + { + id: 'LOGOWBK', + name: 'Logging Trailer - Overwidth Bunks', + category: 'trailer', + }, + { + id: 'LOGSMEM', + name: 'Logging Semi-Trailer - Empty, 3.2 m Bunks', + category: 'trailer', + }, + { + id: 'LOGTNDM', + name: 'Legacy Logging Trailer Combinations - Single Axle Jeeps, Tandem Axle Pole Trailers, Dogloggers', + category: 'trailer', + }, + { + id: 'LOGTRIX', + name: 'Legacy Logging Trailer Combinations - Single Axle Jeeps, Tri Axle Trailers', + category: 'trailer', + }, + { + id: 'MHMBSHG', + name: 'Manufactured Homes, Modular Buildings, Structures and Houseboats (> 5.0 m OAW) with Attached Axles', + category: 'trailer', + }, + { + id: 'MHMBSHL', + name: 'Manufactured Homes, Modular Buildings, Structures and Houseboats (<= 5.0 m OAW) with Attached Axles', + category: 'trailer', + }, + { + id: 'ODTRLEX', + name: 'Overdimensional Trailers and Semi-Trailers (For Export)', + category: 'trailer', + }, + { + id: 'OGOSFDT', + name: 'Oil and Gas - Oversize Oilfield Flat Deck Semi-Trailers', + category: 'trailer', + }, + { + id: 'PLATFRM', + name: 'Platform Trailers', + category: 'trailer', + }, + { + id: 'PMHWAAX', + name: 'Park Model Homes with Attached Axles', + category: 'trailer', + }, + { + id: 'POLETRL', + name: 'Pole Trailers', + category: 'trailer', + }, + { + id: 'PONYTRL', + name: 'Pony Trailers', + category: 'trailer', + }, + { + id: 'REDIMIX', + name: 'Ready Mix Concrete Pump Semi-Trailers', + category: 'trailer', + }, + { + id: 'SEMITRL', + name: 'Semi-Trailers', + category: 'trailer', + }, + { + id: 'STACTRN', + name: 'Semi-Trailers - A-Trains and C-Trains', + category: 'trailer', + }, + { + id: 'STBTRAN', + name: 'Semi-Trailers - B-Trains', + category: 'trailer', + }, + { + id: 'STCHIPS', + name: 'Semi-Trailers - Walled B-Trains (Chip Trucks)', + category: 'trailer', + }, + { + id: 'STCRANE', + name: 'Semi-Trailers with Crane', + category: 'trailer', + }, + { + id: 'STINGAT', + name: 'Stinger Steered Automobile Transporters', + category: 'trailer', + }, + { + id: 'STLOGNG', + name: 'Semi-Trailers - Logging', + category: 'trailer', + }, + { + id: 'STNTSHC', + name: 'Semi-Trailers - Non-Tac Short Chassis', + category: 'trailer', + }, + { + id: 'STREEFR', + name: 'Semi-Trailers - Insulated Vans with Reefer/Refrigeration Units', + category: 'trailer', + }, + { + id: 'STROPRT', + name: 'Steering Trailers - Manned', + category: 'trailer', + }, + { + id: 'STRSELF', + name: 'Steering Trailers - Self/Remote', + category: 'trailer', + }, + { + id: 'STSDBDK', + name: 'Semi-Trailers - Single Drop, Double Drop, Step Decks, Lowbed, Expandos, etc.', + category: 'trailer', + }, + { + id: 'STSTEER', + name: 'Semi-Trailers - Steering Trailers', + category: 'trailer', + }, + { + id: 'STSTNGR', + name: 'Semi-Trailers - Stinger Steered Automobile Transporters', + category: 'trailer', + }, + { + id: 'STWDTAN', + name: 'Semi-Trailers - Spread Tandems', + category: 'trailer', + }, + { + id: 'STWHELR', + name: 'Semi-Trailers - Wheelers', + category: 'trailer', + }, + { + id: 'STWIDWH', + name: 'Semi-Trailers - Wide Wheelers', + category: 'trailer', + }, + { + id: 'NONEXXX', + name: 'None', + category: 'pseudo', + }, + ], + }, + commodities: [ + { + id: 'NONEXXX', + name: 'None', + size: { + powerUnits: [ { - axles: 1, + type: 'CONCRET', + trailers: [ + { + type: 'NONEXXX', + jeep: false, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + rp: 6.5, + l: 15.5, + }, + ], + }, + ], }, { - axles: 2, + type: 'CRAFTAT', + trailers: [ + { + type: 'DOLLIES', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + fp: 10, + rp: 6.5, + w: 3.8, + h: 4.3, + l: 25, + }, + ], + }, + { + type: 'NONEXXX', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + fp: 10, + rp: 6.5, + w: 3.8, + h: 4.3, + l: 14, + regions: [ + { + region: 'PCE', + l: 15, + }, + ], + }, + ], + }, + ], }, { - axles: 3, + type: 'CRAFTMB', + trailers: [ + { + type: 'DOLLIES', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + fp: 10, + rp: 6.5, + w: 3.8, + h: 4.3, + l: 25, + }, + ], + }, + { + type: 'NONEXXX', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + fp: 10, + rp: 6.5, + w: 3.8, + h: 4.3, + l: 14, + regions: [ + { + region: 'PCE', + l: 15, + }, + ], + }, + ], + }, + ], }, { - axles: 1, - modifiers: [ + type: 'DDCKBUS', + trailers: [ { - position: 'before', - category: 'semitrailer', - axles: 3, - minInterAxleSpacing: 0, - maxInterAxleSpacing: 419, + type: 'NONEXXX', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + h: 4.42, + regions: [ + { + region: 'LMN', + h: 4.3, + }, + { + region: 'KTN', + h: 4.3, + }, + { + region: 'PCE', + h: 4.3, + }, + ], + }, + ], }, ], - legal: 9100, - permittable: 9100, }, - ], - }, - { - id: 'jeep', - name: 'Jeep', - category: 'Jeep', - defaultWeightDimensions: [ { - axles: 1, + type: 'GRADERS', + trailers: [ + { + type: 'FEPNYTR', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + rp: 4, + w: 3.2, + h: 4.3, + l: 31, + }, + ], + }, + { + type: 'NONEXXX', + jeep: false, + booster: false, + selfIssue: false, + sizeDimensions: [ + { + w: 3.5, + h: 4.4, + l: 12.5, + regions: [ + { + region: 'LMN', + h: 4.3, + }, + { + region: 'KTN', + h: 4.3, + }, + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + ], }, { - axles: 2, + type: 'BUSTRLR', + trailers: [ + { + type: 'PONYTRL', + jeep: false, + booster: false, + selfIssue: false, + sizeDimensions: [{}], + }, + ], }, { - axles: 3, + type: 'LOGOFFH', + trailers: [ + { + type: 'STLOGNG', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + rp: 6.5, + w: 4.4, + }, + ], + }, + ], + }, + { + type: 'LCVRMDB', + trailers: [ + { + type: 'SEMITRL', + jeep: false, + booster: false, + selfIssue: false, + sizeDimensions: [ + { + l: 32, + regions: [ + { + region: 'PCE', + l: 31, + }, + ], + }, + ], + }, + ], + }, + { + type: 'LCVTPDB', + trailers: [ + { + type: 'SEMITRL', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + l: 41, + }, + ], + }, + ], + }, + { + type: 'LWBTRCT', + trailers: [ + { + type: 'SEMITRL', + jeep: true, + booster: true, + selfIssue: false, + sizeDimensions: [ + { + w: 2.6, + h: 4.15, + l: 23, + }, + ], + }, + ], + }, + { + type: 'PICKRTT', + trailers: [ + { + type: 'NONEXXX', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + w: 2.6, + h: 4.15, + l: 16, + }, + ], + }, + { + type: 'STCRANE', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + rp: 6.5, + w: 2.6, + h: 4.15, + l: 25, + }, + ], + }, + { + type: 'STROPRT', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + w: 5, + h: 4.88, + l: 40, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'STRSELF', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + w: 5, + h: 4.88, + l: 36, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + ], + }, + { + type: 'SCRAPER', + trailers: [ + { + type: 'NONEXXX', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + l: 12.5, + }, + ], + }, + ], + }, + { + type: 'TRKTRAC', + trailers: [ + { + type: 'FECVYER', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + fp: 4, + rp: 9.5, + w: 3.8, + h: 4.72, + l: 31, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'FEDRMMX', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + rp: 6.5, + w: 3.8, + h: 4.72, + l: 31, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'FEBGHSE', + jeep: true, + booster: true, + selfIssue: false, + sizeDimensions: [ + { + fp: 3, + rp: 6.5, + w: 4.26, + h: 4.72, + l: 31, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'FESEMTR', + jeep: true, + booster: true, + selfIssue: false, + sizeDimensions: [ + { + fp: 3, + rp: 6.5, + w: 3.8, + h: 4.72, + l: 31, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'FEWHELR', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + w: 5, + h: 4.88, + l: 31, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'ODTRLEX', + jeep: false, + booster: false, + selfIssue: false, + sizeDimensions: [ + { + w: 3.65, + }, + ], + }, + { + type: 'REDIMIX', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + rp: 6.5, + }, + ], + }, + { + type: 'HIBOFLT', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + rp: 6.5, + h: 4.3, + l: 31, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'STREEFR', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + h: 4.3, + }, + ], + }, + { + type: 'STNTSHC', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [{}], + }, + { + type: 'STSDBDK', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + rp: 6.5, + w: 3.2, + h: 4.3, + l: 27.5, + regions: [ + { + region: 'PCE', + l: 32, + }, + ], + }, + ], + }, + { + type: 'STROPRT', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + h: 4.15, + l: 40, + }, + ], + }, + { + type: 'STRSELF', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + l: 36, + }, + ], + }, + ], + }, + { + type: 'REGTRCK', + trailers: [ + { + type: 'FECVYPT', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + fp: 4, + rp: 9.5, + w: 3.2, + h: 4.3, + l: 31, + }, + ], + }, + { + type: 'FEPNYTR', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + rp: 4, + w: 3.2, + h: 4.3, + l: 31, + }, + ], + }, + { + type: 'FULLLTL', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + rp: 6.5, + w: 3.8, + h: 4.3, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'MHMBSHL', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + fp: 1, + rp: 6.9, + h: 4.88, + l: 31.5, + regions: [ + { + region: 'PCE', + h: 5.33, + l: 36, + }, + ], + }, + ], + }, + { + type: 'MHMBSHG', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + fp: 1, + rp: 6.9, + h: 4.88, + l: 31.5, + regions: [ + { + region: 'PCE', + h: 5.33, + l: 36, + }, + ], + }, + ], + }, + { + type: 'NONEXXX', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + fp: 1, + rp: 6.5, + w: 3.2, + h: 4.3, + l: 16, + regions: [ + { + region: 'PCE', + h: 4.4, + }, + ], + }, + ], + }, + { + type: 'ODTRLEX', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + w: 3.65, + }, + ], + }, + { + type: 'PMHWAAX', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + rp: 6.9, + w: 4.4, + h: 4.88, + l: 31.5, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'PONYTRL', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + rp: 6.5, + w: 3.2, + h: 4.3, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + ], + }, + { + type: 'PLOWBLD', + trailers: [ + { + type: 'NONEXXX', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + w: 3.2, + }, + ], + }, + ], }, ], }, - ], - }, - commodities: [ - { - id: 'bridgebeams', - name: 'Bridge Beams', - powerUnits: [ - { - type: 'trucktractor', - canFollow: [], - }, - ], - trailers: [ - { - type: 'jeep', - canFollow: ['trucktractor'], - }, - { - type: 'booster', - canFollow: ['poletrailer'], - }, - { - type: 'poletrailer', - canFollow: ['jeep', 'trucktractor'], - sizeDimensions: [ - { - frontProjection: 3, - rearProjection: 6.5, - width: 2.6, - height: 4.15, - length: 31, - }, - ], - }, - ], }, { - id: 'empty', - name: 'Empty', - powerUnits: [ - { - type: 'trucktractor', - canFollow: [], - }, - { - type: 'pickertrucktractor', - canFollow: [], - }, - { - type: 'truck', - canFollow: [], - }, - ], - trailers: [ - { - type: 'jeep', - canFollow: ['trucktractor', 'pickertrucktractor'], - }, - { - type: 'booster', - canFollow: [ - 'poletrailer', - 'expando', - 'ogoilfieldsemi', - 'semi', - 'hiboyexpando', - 'hiboyflatdeck', - 'drop', - 'steering', - 'wheeler', - 'widewheeler', - 'semicrane', - ], - }, - { - type: 'poletrailer', - canFollow: ['trucktractor', 'pickertrucktractor', 'jeep'], - }, - { - type: 'expando', - canFollow: ['trucktractor', 'pickertrucktractor', 'jeep'], - sizeDimensions: [ - { - frontProjection: 3, - rearProjection: 6.5, - width: 2.6, - height: 4.4, - length: 31, - regions: [ - { - region: 'peace', - height: 5.33, - }, - ], - modifiers: [ - { - position: 'first', - type: 'trucktractor', - }, - ], - }, - { - frontProjection: 3, - rearProjection: 6.5, - width: 2.6, - height: 4.4, - length: 25, - regions: [ - { - region: 'peace', - height: 5.33, - length: 27.5, - }, - ], - modifiers: [ - { - position: 'first', - type: 'pickertrucktractor', - }, - ], - }, - ], - }, - { - type: 'ogoilfieldsemi', - canFollow: ['trucktractor', 'pickertrucktractor', 'jeep'], - }, - { - type: 'platform', - canFollow: ['trucktractor', 'pickertrucktractor', 'jeep'], - }, - { - type: 'semi', - canFollow: ['trucktractor', 'pickertrucktractor', 'jeep'], - }, - { - type: 'hiboyexpando', - canFollow: ['trucktractor', 'pickertrucktractor', 'jeep'], - }, - { - type: 'hiboyflatdeck', - canFollow: ['trucktractor', 'pickertrucktractor', 'jeep'], - }, - { - type: 'drop', - canFollow: ['trucktractor', 'pickertrucktractor', 'jeep'], - }, - { - type: 'steering', - canFollow: ['trucktractor', 'pickertrucktractor', 'jeep'], - }, - { - type: 'wheeler', - canFollow: ['trucktractor', 'pickertrucktractor', 'jeep'], - }, - { - type: 'widewheeler', - canFollow: ['trucktractor', 'pickertrucktractor', 'jeep'], - }, - { - type: 'semicrane', - canFollow: ['trucktractor', 'pickertrucktractor', 'jeep'], - }, - ], - }, - { - id: 'fixed', - name: 'Fixed Equipment', - powerUnits: [ - { - type: 'trucktractor', - canFollow: [], - }, - { - type: 'truck', - canFollow: [], - }, - ], - trailers: [ - { - type: 'jeep', - canFollow: ['trucktractor'], - }, - { - type: 'booster', - canFollow: [ - 'fixedcounterasphalt', - 'fixedportableasphalt', - 'fixedsemi', - 'fixedwheeler', - ], - }, - { - type: 'fixedconveyor', - canFollow: ['trucktractor', 'truck', 'jeep'], - }, - { - type: 'fixedcounterasphalt', - canFollow: ['trucktractor', 'jeep'], - }, - { - type: 'fixedportableasphalt', - canFollow: ['trucktractor', 'jeep'], - }, - { - type: 'fixedsemi', - canFollow: ['trucktractor', 'jeep'], - }, - { - type: 'fixedwheeler', - canFollow: ['trucktractor', 'jeep'], - }, - { - type: 'widetandem', - canFollow: ['trucktractor', 'jeep'], - }, - { - type: 'fixedpony', - canFollow: ['truck'], - }, - { - type: 'pony', - canFollow: ['truck'], - }, - ], - }, - { - id: 'intermodalcontainers', - name: 'Intermodal Containers without Sides', - powerUnits: [ - { - type: 'trucktractor', - canFollow: [], - }, - ], - trailers: [ - { - type: 'jeep', - canFollow: ['trucktractor'], - }, - { - type: 'booster', - canFollow: ['drop'], - }, - { - type: 'drop', - canFollow: ['jeep', 'trucktractor'], - }, - ], - }, - { - id: 'laminatedbeams', - name: 'Laminated Beams', - powerUnits: [ - { - type: 'trucktractor', - canFollow: [], - }, - ], - trailers: [], - }, - { - id: 'manufacturedhomes', - name: 'Manufactured Homes, Modular Buildings, Structures and Houseboats (>5.0m OAW)', - }, - { - id: 'nonreducible', - name: 'Non-Reducible Loads', - }, - { - id: 'none', - name: 'None', - }, - { - id: 'oilfieldequipment', - name: 'Oil Field Equipment', + id: 'DOGLOGG', + name: 'Doglogger/Sjostrum Trailers (decked)', + size: { + powerUnits: [ + { + type: 'TRKTRAC', + trailers: [ + { + type: 'NONEXXX', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + rp: 5, + l: 13.5, + }, + ], + }, + ], + }, + ], + }, }, { - id: 'reducibleloads', - name: 'Reducible Loads', + id: 'GRTBBUK', + name: 'Grader, Tractor Blades, Buckets', + size: { + powerUnits: [ + { + type: 'GRADERS', + trailers: [ + { + type: 'NONEXXX', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + w: 4.4, + }, + ], + }, + ], + }, + ], + }, }, { - id: 'scrapers', - name: 'Scrapers on Dollies', + id: 'HAYRACK', + name: 'Hayrack Semi-Trailer with a Folded Chassis/Empty Piggyback', + size: { + powerUnits: [ + { + type: 'TRKTRAC', + trailers: [ + { + type: 'STLOGNG', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + rp: 5, + h: 4.15, + }, + ], + }, + ], + }, + ], + }, }, { - id: 'tow', - name: 'Tow Trucks and Disabled Vehicles', + id: 'IMCONTN', + name: 'Intermodal Containers', + size: { + powerUnits: [ + { + type: 'TRKTRAC', + trailers: [ + { + type: 'STACTRN', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + h: 4.4, + l: 26, + }, + ], + }, + { + type: 'STBTRAN', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + h: 4.4, + l: 27.5, + }, + ], + }, + { + type: 'HIBOFLT', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + h: 4.4, + }, + ], + }, + ], + }, + { + type: 'REGTRCK', + trailers: [ + { + type: 'NONEXXX', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + h: 4.4, + }, + ], + }, + ], + }, + ], + }, }, ], }; diff --git a/policy-engine/src/_test/policy-config/master.sample.ts b/policy-engine/src/_test/policy-config/master.sample.ts index cc5267c30..79de8f4a3 100644 --- a/policy-engine/src/_test/policy-config/master.sample.ts +++ b/policy-engine/src/_test/policy-config/master.sample.ts @@ -7,9 +7,10 @@ export const masterPolicyConfig: PolicyDefinition = { { conditions: { not: { - fact: 'permitData.companyName', + fact: 'permitData', operator: 'stringMinimumLength', value: 1, + path: '$.companyName', }, }, event: { @@ -24,9 +25,10 @@ export const masterPolicyConfig: PolicyDefinition = { { conditions: { not: { - fact: 'permitData.contactDetails.firstName', + fact: 'permitData', operator: 'stringMinimumLength', value: 1, + path: '$.contactDetails.firstName', }, }, event: { @@ -41,9 +43,10 @@ export const masterPolicyConfig: PolicyDefinition = { { conditions: { not: { - fact: 'permitData.contactDetails.lastName', + fact: 'permitData', operator: 'stringMinimumLength', value: 1, + path: '$.contactDetails.lastName', }, }, event: { @@ -58,9 +61,10 @@ export const masterPolicyConfig: PolicyDefinition = { { conditions: { not: { - fact: 'permitData.contactDetails.phone1', + fact: 'permitData', operator: 'stringMinimumLength', value: 1, + path: '$.contactDetails.phone1', }, }, event: { @@ -75,9 +79,10 @@ export const masterPolicyConfig: PolicyDefinition = { { conditions: { not: { - fact: 'permitData.contactDetails.email', + fact: 'permitData', operator: 'stringMinimumLength', value: 1, + path: '$.contactDetails.email', }, }, event: { @@ -93,11 +98,12 @@ export const masterPolicyConfig: PolicyDefinition = { conditions: { any: [ { - fact: 'permitData.startDate', + fact: 'permitData', operator: 'dateLessThan', value: { fact: 'validationDate', }, + path: '$.startDate', }, ], }, @@ -113,9 +119,10 @@ export const masterPolicyConfig: PolicyDefinition = { { conditions: { not: { - fact: 'permitData.vehicleDetails.vin', + fact: 'permitData', operator: 'regex', value: '^[a-zA-Z0-9]{6}$', + path: '$.vehicleDetails.vin', }, }, event: { @@ -131,9 +138,10 @@ export const masterPolicyConfig: PolicyDefinition = { { conditions: { not: { - fact: 'permitData.vehicleDetails.plate', + fact: 'permitData', operator: 'stringMinimumLength', value: 1, + path: '$.vehicleDetails.plate', }, }, event: { @@ -148,9 +156,10 @@ export const masterPolicyConfig: PolicyDefinition = { { conditions: { not: { - fact: 'permitData.vehicleDetails.make', + fact: 'permitData', operator: 'stringMinimumLength', value: 1, + path: '$.vehicleDetails.make', }, }, event: { @@ -165,9 +174,10 @@ export const masterPolicyConfig: PolicyDefinition = { { conditions: { not: { - fact: 'permitData.vehicleDetails.year', + fact: 'permitData', operator: 'greaterThan', value: 1900, + path: '$.vehicleDetails.year', }, }, event: { @@ -182,9 +192,10 @@ export const masterPolicyConfig: PolicyDefinition = { { conditions: { not: { - fact: 'permitData.vehicleDetails.countryCode', + fact: 'permitData', operator: 'stringMinimumLength', value: 1, + path: '$.vehicleDetails.countryCode', }, }, event: { @@ -267,18 +278,20 @@ export const masterPolicyConfig: PolicyDefinition = { all: [ { not: { - fact: 'permitData.permitDuration', + fact: 'permitData', operator: 'in', value: [30, 60, 90, 120, 150, 180, 210, 240, 270, 300, 330], + path: '$.permitDuration', }, }, { not: { - fact: 'permitData.permitDuration', + fact: 'permitData', operator: 'equal', value: { fact: 'daysInPermitYear', }, + path: '$.permitDuration', }, }, ], @@ -295,11 +308,12 @@ export const masterPolicyConfig: PolicyDefinition = { { conditions: { not: { - fact: 'permitData.vehicleDetails.vehicleSubType', + fact: 'permitData', operator: 'in', value: { fact: 'allowedVehicles', }, + path: '$.vehicleDetails.vehicleSubType', }, }, event: { @@ -354,18 +368,20 @@ export const masterPolicyConfig: PolicyDefinition = { all: [ { not: { - fact: 'permitData.permitDuration', + fact: 'permitData', operator: 'in', value: [30, 60, 90, 120, 150, 180, 210, 240, 270, 300, 330], + path: '$.permitDuration', }, }, { not: { - fact: 'permitData.permitDuration', + fact: 'permitData', operator: 'equal', value: { fact: 'daysInPermitYear', }, + path: '$.permitDuration', }, }, ], @@ -382,11 +398,12 @@ export const masterPolicyConfig: PolicyDefinition = { { conditions: { not: { - fact: 'permitData.vehicleDetails.vehicleSubType', + fact: 'permitData', operator: 'in', value: { fact: 'allowedVehicles', }, + path: '$.vehicleDetails.vehicleSubType', }, }, event: { @@ -414,11 +431,11 @@ export const masterPolicyConfig: PolicyDefinition = { trailers: [], }, globalSizeDefaults: { - frontProjection: 3, - rearProjection: 6.5, - width: 2.6, - height: 4.15, - length: 31, + fp: 3, + rp: 6.5, + w: 2.6, + h: 4.15, + l: 31, }, vehicleCategories: { trailerCategories: [], diff --git a/policy-engine/src/_test/policy-config/mimimal.sample.ts b/policy-engine/src/_test/policy-config/mimimal.sample.ts index 7b882d939..e59c577ea 100644 --- a/policy-engine/src/_test/policy-config/mimimal.sample.ts +++ b/policy-engine/src/_test/policy-config/mimimal.sample.ts @@ -21,11 +21,11 @@ export const minimalPolicyDef: PolicyDefinition = { trailers: [], }, globalSizeDefaults: { - frontProjection: 3, - rearProjection: 6.5, - width: 2.6, - height: 4.15, - length: 31, + fp: 3, + rp: 6.5, + w: 2.6, + h: 4.15, + l: 31, }, vehicleCategories: { trailerCategories: [], diff --git a/policy-engine/src/_test/policy-config/stos-vehicle-config.sample.ts b/policy-engine/src/_test/policy-config/stos-vehicle-config.sample.ts index bf9302464..8218335d5 100644 --- a/policy-engine/src/_test/policy-config/stos-vehicle-config.sample.ts +++ b/policy-engine/src/_test/policy-config/stos-vehicle-config.sample.ts @@ -56,14 +56,16 @@ export const stosPolicyConfig: PolicyDefinition = { any: [ { not: { - fact: 'permitData.permitDuration', + fact: 'permitData', + path: '$.permitDuration', operator: 'lessThanInclusive', value: 7, }, }, { not: { - fact: 'permitData.permitDuration', + fact: 'permitData', + path: '$.permitDuration', operator: 'greaterThan', value: 0, }, @@ -82,7 +84,8 @@ export const stosPolicyConfig: PolicyDefinition = { { conditions: { not: { - fact: 'permitData.vehicleDetails.vehicleSubType', + fact: 'permitData', + path: '$.vehicleDetails.vehicleSubType', operator: 'in', value: { fact: 'allowedVehicles', @@ -118,7 +121,7 @@ export const stosPolicyConfig: PolicyDefinition = { allowedVehicles: ['TRKTRAC'], rules: [], }, -], + ], globalWeightDefaults: { powerUnits: [], trailers: [], @@ -154,7 +157,7 @@ export const stosPolicyConfig: PolicyDefinition = { }, { id: 'BUSTRLR', - name: 'Intercity Buses (Pulling Pony Trailers)', + name: 'Inter-City Bus (Pulling Pony Trailer)', category: 'powerunit', }, { @@ -288,7 +291,6 @@ export const stosPolicyConfig: PolicyDefinition = { id: 'BOOSTER', name: 'Boosters', category: 'accessory', - ignoreForSizeDimensions: true, }, { id: 'DBTRBTR', @@ -312,7 +314,12 @@ export const stosPolicyConfig: PolicyDefinition = { }, { id: 'FECVYER', - name: 'Fixed Equipment - Conveyors', + name: 'Fixed Equipment - Conveyors (Semi-Trailers)', + category: 'trailer', + }, + { + id: 'FECVYPT', + name: 'Fixed Equipment - Conveyors (Pony Trailers)', category: 'trailer', }, { @@ -359,16 +366,20 @@ export const stosPolicyConfig: PolicyDefinition = { id: 'JEEPSRG', name: 'Jeeps', category: 'accessory', - ignoreForSizeDimensions: true, }, { id: 'LOGDGLG', name: 'Legacy Logging Trailer Combinations - Tandem Pole Trailers, Dogloggers', category: 'trailer', }, + { + id: 'LOGLGCY', + name: 'Legacy Logging Trailer Combinations', + category: 'trailer', + }, { id: 'LOGFULL', - name: 'Logging Trailers - Full Trailers, Tri Axle, Quad Axle', + name: 'Logging Trailer - Full Trailers, Tri Axle, Quad Axle', category: 'trailer', }, { @@ -378,7 +389,7 @@ export const stosPolicyConfig: PolicyDefinition = { }, { id: 'LOGOWBK', - name: 'Logging Trailers - Overwidth Bunks', + name: 'Logging Trailer - Overwidth Bunks', category: 'trailer', }, { @@ -528,715 +539,4288 @@ export const stosPolicyConfig: PolicyDefinition = { }, { id: 'NONEXXX', - name: 'No trailer', + name: 'None', category: 'pseudo', }, ], }, commodities: [ { - id: 'WODWIDB', - name: 'Wood on wide bunks', + id: 'NONEXXX', + name: 'None', + size: { + powerUnits: [ + { + type: 'CONCRET', + trailers: [ + { + type: 'NONEXXX', + jeep: false, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + rp: 6.5, + l: 15.5, + }, + ], + }, + ], + }, + { + type: 'CRAFTAT', + trailers: [ + { + type: 'DOLLIES', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + fp: 10, + rp: 6.5, + w: 3.8, + h: 4.3, + l: 25, + }, + ], + }, + { + type: 'NONEXXX', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + fp: 10, + rp: 6.5, + w: 3.8, + h: 4.3, + l: 14, + regions: [ + { + region: 'PCE', + l: 15, + }, + ], + }, + ], + }, + ], + }, + { + type: 'CRAFTMB', + trailers: [ + { + type: 'DOLLIES', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + fp: 10, + rp: 6.5, + w: 3.8, + h: 4.3, + l: 25, + }, + ], + }, + { + type: 'NONEXXX', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + fp: 10, + rp: 6.5, + w: 3.8, + h: 4.3, + l: 14, + regions: [ + { + region: 'PCE', + l: 15, + }, + ], + }, + ], + }, + ], + }, + { + type: 'DDCKBUS', + trailers: [ + { + type: 'NONEXXX', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + h: 4.42, + regions: [ + { + region: 'LMN', + h: 4.3, + }, + { + region: 'KTN', + h: 4.3, + }, + { + region: 'PCE', + h: 4.3, + }, + ], + }, + ], + }, + ], + }, + { + type: 'GRADERS', + trailers: [ + { + type: 'FEPNYTR', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + rp: 4, + w: 3.2, + h: 4.3, + l: 31, + }, + ], + }, + { + type: 'NONEXXX', + jeep: false, + booster: false, + selfIssue: false, + sizeDimensions: [ + { + w: 3.5, + h: 4.4, + l: 12.5, + regions: [ + { + region: 'LMN', + h: 4.3, + }, + { + region: 'KTN', + h: 4.3, + }, + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + ], + }, + { + type: 'BUSTRLR', + trailers: [ + { + type: 'PONYTRL', + jeep: false, + booster: false, + selfIssue: false, + sizeDimensions: [{}], + }, + ], + }, + { + type: 'LOGOFFH', + trailers: [ + { + type: 'STLOGNG', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + rp: 6.5, + w: 4.4, + }, + ], + }, + ], + }, + { + type: 'LCVRMDB', + trailers: [ + { + type: 'SEMITRL', + jeep: false, + booster: false, + selfIssue: false, + sizeDimensions: [ + { + l: 32, + regions: [ + { + region: 'PCE', + l: 31, + }, + ], + }, + ], + }, + ], + }, + { + type: 'LCVTPDB', + trailers: [ + { + type: 'SEMITRL', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + l: 41, + }, + ], + }, + ], + }, + { + type: 'LWBTRCT', + trailers: [ + { + type: 'SEMITRL', + jeep: true, + booster: true, + selfIssue: false, + sizeDimensions: [ + { + w: 2.6, + h: 4.15, + l: 23, + }, + ], + }, + ], + }, + { + type: 'PICKRTT', + trailers: [ + { + type: 'NONEXXX', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + w: 2.6, + h: 4.15, + l: 16, + }, + ], + }, + { + type: 'STCRANE', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + rp: 6.5, + w: 2.6, + h: 4.15, + l: 25, + }, + ], + }, + { + type: 'STROPRT', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + w: 5, + h: 4.88, + l: 40, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'STRSELF', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + w: 5, + h: 4.88, + l: 36, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + ], + }, + { + type: 'SCRAPER', + trailers: [ + { + type: 'NONEXXX', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + l: 12.5, + }, + ], + }, + ], + }, + { + type: 'TRKTRAC', + trailers: [ + { + type: 'FECVYER', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + fp: 4, + rp: 9.5, + w: 3.8, + h: 4.72, + l: 31, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'FEDRMMX', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + rp: 6.5, + w: 3.8, + h: 4.72, + l: 31, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'FEBGHSE', + jeep: true, + booster: true, + selfIssue: false, + sizeDimensions: [ + { + fp: 3, + rp: 6.5, + w: 4.26, + h: 4.72, + l: 31, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'FESEMTR', + jeep: true, + booster: true, + selfIssue: false, + sizeDimensions: [ + { + fp: 3, + rp: 6.5, + w: 3.8, + h: 4.72, + l: 31, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'FEWHELR', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + w: 5, + h: 4.88, + l: 31, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'ODTRLEX', + jeep: false, + booster: false, + selfIssue: false, + sizeDimensions: [ + { + w: 3.65, + }, + ], + }, + { + type: 'REDIMIX', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + rp: 6.5, + }, + ], + }, + { + type: 'HIBOFLT', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + rp: 6.5, + h: 4.3, + l: 31, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'STREEFR', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + h: 4.3, + }, + ], + }, + { + type: 'STNTSHC', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [{}], + }, + { + type: 'STSDBDK', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + rp: 6.5, + w: 3.2, + h: 4.3, + l: 27.5, + regions: [ + { + region: 'PCE', + l: 32, + }, + ], + }, + ], + }, + { + type: 'STROPRT', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + h: 4.15, + l: 40, + }, + ], + }, + { + type: 'STRSELF', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + l: 36, + }, + ], + }, + ], + }, + { + type: 'REGTRCK', + trailers: [ + { + type: 'FECVYPT', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + fp: 4, + rp: 9.5, + w: 3.2, + h: 4.3, + l: 31, + }, + ], + }, + { + type: 'FEPNYTR', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + rp: 4, + w: 3.2, + h: 4.3, + l: 31, + }, + ], + }, + { + type: 'FULLLTL', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + rp: 6.5, + w: 3.8, + h: 4.3, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'MHMBSHL', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + fp: 1, + rp: 6.9, + h: 4.88, + l: 31.5, + regions: [ + { + region: 'PCE', + h: 5.33, + l: 36, + }, + ], + }, + ], + }, + { + type: 'MHMBSHG', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + fp: 1, + rp: 6.9, + h: 4.88, + l: 31.5, + regions: [ + { + region: 'PCE', + h: 5.33, + l: 36, + }, + ], + }, + ], + }, + { + type: 'NONEXXX', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + fp: 1, + rp: 6.5, + w: 3.2, + h: 4.3, + l: 16, + regions: [ + { + region: 'PCE', + h: 4.4, + }, + ], + }, + ], + }, + { + type: 'ODTRLEX', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + w: 3.65, + }, + ], + }, + { + type: 'PMHWAAX', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + rp: 6.9, + w: 4.4, + h: 4.88, + l: 31.5, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'PONYTRL', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + rp: 6.5, + w: 3.2, + h: 4.3, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + ], + }, + { + type: 'PLOWBLD', + trailers: [ + { + type: 'NONEXXX', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + w: 3.2, + }, + ], + }, + ], + }, + ], + }, }, { - id: 'LEGALLO', - name: 'Legal loads', + id: 'DOGLOGG', + name: 'Doglogger/Sjostrum Trailers (decked)', + size: { + powerUnits: [ + { + type: 'TRKTRAC', + trailers: [ + { + type: 'NONEXXX', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + rp: 5, + l: 13.5, + }, + ], + }, + ], + }, + ], + }, }, { - id: 'GRADERS', - name: 'Grader', + id: 'GRTBBUK', + name: 'Grader, Tractor Blades, Buckets', + size: { + powerUnits: [ + { + type: 'GRADERS', + trailers: [ + { + type: 'NONEXXX', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + w: 4.4, + }, + ], + }, + ], + }, + ], + }, }, { - id: 'HUSBAND', - name: 'Implements of husbandry', + id: 'HAYRACK', + name: 'Hayrack Semi-Trailer with a Folded Chassis/Empty Piggyback', + size: { + powerUnits: [ + { + type: 'TRKTRAC', + trailers: [ + { + type: 'STLOGNG', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + rp: 5, + h: 4.15, + }, + ], + }, + ], + }, + ], + }, }, { - id: 'OILFILD', - name: 'Oil field equipment', + id: 'IMCONTN', + name: 'Intermodal Containers', + size: { + powerUnits: [ + { + type: 'TRKTRAC', + trailers: [ + { + type: 'STACTRN', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + h: 4.4, + l: 26, + }, + ], + }, + { + type: 'STBTRAN', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + h: 4.4, + l: 27.5, + }, + ], + }, + { + type: 'HIBOFLT', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + h: 4.4, + }, + ], + }, + ], + }, + { + type: 'REGTRCK', + trailers: [ + { + type: 'NONEXXX', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + h: 4.4, + }, + ], + }, + ], + }, + ], + }, }, { - id: 'ROKTRUK', - name: 'Rock truck', + id: 'IMCONWS', + name: 'Intermodal Containers without Sides', + size: { + powerUnits: [ + { + type: 'TRKTRAC', + trailers: [ + { + type: 'STSDBDK', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + w: 4.4, + h: 4.72, + }, + ], + }, + ], + }, + ], + }, }, { - id: 'TIRESXX', - name: 'Tires', + id: 'LPBOOMS', + name: 'Logs, Poles And Boomsticks (Up To 20.1)', + size: { + powerUnits: [ + { + type: 'TRKTRAC', + trailers: [ + { + type: 'FULLLTL', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + rp: 6.5, + w: 2.9, + l: 27.5, + }, + ], + }, + { + type: 'LOGLGCY', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + rp: 5, + w: 2.6, + l: 25, + }, + ], + }, + { + type: 'POLETRL', + jeep: true, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + rp: 6.5, + w: 2.9, + l: 27.5, + }, + ], + }, + { + type: 'STACTRN', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + rp: 6.5, + w: 2.9, + l: 26, + }, + ], + }, + { + type: 'STBTRAN', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + rp: 6.5, + w: 2.9, + l: 27.5, + }, + ], + }, + { + type: 'HIBOFLT', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + rp: 6.5, + w: 2.9, + l: 25, + }, + ], + }, + { + type: 'STLOGNG', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + rp: 6.5, + w: 2.9, + l: 25, + }, + ], + }, + ], + }, + ], + }, }, { - id: 'SRVCRIG', - name: 'Service rig', + id: 'LPBOOML', + name: 'Logs, Poles And Boomsticks (Over 20.1)', + size: { + powerUnits: [ + { + type: 'TRKTRAC', + trailers: [ + { + type: 'LOGFULL', + jeep: false, + booster: false, + selfIssue: false, + sizeDimensions: [ + { + fp: 10, + rp: 10, + l: 40, + }, + ], + }, + { + type: 'POLETRL', + jeep: true, + booster: true, + selfIssue: false, + sizeDimensions: [ + { + fp: 8, + rp: 9, + l: 40, + }, + ], + }, + { + type: 'STROPRT', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + fp: 10, + rp: 10, + l: 40, + }, + ], + }, + { + type: 'STRSELF', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + fp: 10, + rp: 10, + l: 36, + }, + ], + }, + ], + }, + ], + }, }, { - id: 'BUNCHER', - name: 'Buncher', + id: 'MFHOMES', + name: 'Manufactured Homes, Modular Buildings, Structures and Houseboats (<= 5.0 m OAW)', + size: { + powerUnits: [ + { + type: 'TRKTRAC', + trailers: [ + { + type: 'SEMITRL', + jeep: true, + booster: true, + selfIssue: false, + sizeDimensions: [ + { + fp: 3, + rp: 7.5, + h: 4.88, + l: 31.5, + regions: [ + { + region: 'PCE', + h: 5.33, + l: 36, + }, + ], + }, + ], + }, + { + type: 'STSDBDK', + jeep: true, + booster: true, + selfIssue: false, + sizeDimensions: [ + { + fp: 3, + rp: 7.5, + h: 4.88, + l: 31.5, + regions: [ + { + region: 'PCE', + h: 5.33, + l: 36, + }, + ], + }, + ], + }, + ], + }, + { + type: 'REGTRCK', + trailers: [ + { + type: 'DOLLIES', + jeep: false, + booster: false, + selfIssue: false, + sizeDimensions: [ + { + fp: 1, + rp: 6.9, + h: 4.88, + l: 31.5, + regions: [ + { + region: 'PCE', + h: 5.33, + l: 36, + }, + ], + }, + ], + }, + { + type: 'FLOATTR', + jeep: false, + booster: false, + selfIssue: false, + sizeDimensions: [ + { + fp: 1, + rp: 6.9, + h: 4.57, + l: 31.5, + regions: [ + { + region: 'PCE', + h: 5.33, + l: 36, + }, + ], + }, + ], + }, + { + type: 'PONYTRL', + jeep: false, + booster: false, + selfIssue: false, + sizeDimensions: [ + { + fp: 1, + rp: 6.9, + h: 4.88, + l: 31.5, + regions: [ + { + region: 'PCE', + h: 5.33, + l: 36, + }, + ], + }, + ], + }, + ], + }, + ], + }, }, { - id: 'CONVEYR', - name: 'Conveyor', + id: 'MFHOMEL', + name: 'Manufactured Homes, Modular Buildings, Structures and Houseboats (> 5.0 m OAW)', + size: { + powerUnits: [ + { + type: 'TRKTRAC', + trailers: [ + { + type: 'SEMITRL', + jeep: true, + booster: true, + selfIssue: false, + sizeDimensions: [ + { + fp: 3, + rp: 7.5, + h: 4.88, + l: 31.5, + regions: [ + { + region: 'PCE', + h: 5.33, + l: 36, + }, + ], + }, + ], + }, + { + type: 'STSDBDK', + jeep: true, + booster: true, + selfIssue: false, + sizeDimensions: [ + { + fp: 3, + rp: 7.5, + h: 4.88, + l: 31.5, + regions: [ + { + region: 'PCE', + h: 5.33, + l: 36, + }, + ], + }, + ], + }, + ], + }, + { + type: 'REGTRCK', + trailers: [ + { + type: 'DOLLIES', + jeep: false, + booster: false, + selfIssue: false, + sizeDimensions: [ + { + fp: 1, + rp: 6.9, + h: 4.88, + l: 31.5, + regions: [ + { + region: 'PCE', + h: 5.33, + l: 36, + }, + ], + }, + ], + }, + { + type: 'FLOATTR', + jeep: false, + booster: false, + selfIssue: false, + sizeDimensions: [ + { + fp: 1, + rp: 6.9, + h: 4.57, + l: 31.5, + regions: [ + { + region: 'PCE', + h: 5.33, + l: 36, + }, + ], + }, + ], + }, + { + type: 'PONYTRL', + jeep: false, + booster: false, + selfIssue: false, + sizeDimensions: [ + { + fp: 1, + rp: 6.9, + h: 4.88, + l: 31.5, + regions: [ + { + region: 'PCE', + h: 5.33, + l: 36, + }, + ], + }, + ], + }, + ], + }, + ], + }, }, { - id: 'SKIDUNT', - name: 'Oil field skid unit', + id: 'PARKMHS', + name: 'Park Model Homes', + size: { + powerUnits: [ + { + type: 'REGTRCK', + trailers: [ + { + type: 'DOLLIES', + jeep: false, + booster: false, + selfIssue: false, + sizeDimensions: [ + { + fp: 3, + rp: 6.9, + w: 4.4, + h: 4.88, + l: 31.5, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'FLOATTR', + jeep: false, + booster: false, + selfIssue: false, + sizeDimensions: [ + { + fp: 3, + rp: 6.9, + w: 4.4, + h: 4.88, + l: 31.5, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'PONYTRL', + jeep: false, + booster: false, + selfIssue: false, + sizeDimensions: [ + { + fp: 3, + rp: 6.9, + w: 4.4, + h: 4.88, + l: 31.5, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + ], + }, + ], + }, }, { - id: 'EMPTYXX', - name: 'Empty', - powerUnits: [ - { - type: 'TRKTRAC', - canFollow: [], - }, - { - type: 'PICKRTT', - canFollow: [], - }, - ], - trailers: [ - { - type: 'JEEPSRG', - canFollow: ['TRKTRAC', 'PICKRTT', 'JEEPSRG'], - }, - { - type: 'BOOSTER', - canFollow: [ - 'OGOSFDT', - 'PLATFRM', - 'HIBOEXP', - 'STWHELR', - 'STWIDWH', - 'STCRANE', - 'HIBOFLT', - 'STSDBDK', - 'BOOSTER', - ], - }, - { - type: 'LOGOWBK', - canFollow: ['TRKTRAC'], - }, - { - type: 'OGOSFDT', - canFollow: ['PICKRTT', 'JEEPSRG'], - sizeDimensions: [ - { - width: 3.2, - height: 4.3, - length: 23, - }, - ], - }, - { - type: 'PLATFRM', - canFollow: ['TRKTRAC', 'PICKRTT', 'JEEPSRG'], - canSelfIssue: false, - sizeDimensions: [ - { - width: 3.2, - height: 4.88, - length: 27.5, - regions: [ - { - region: 'PCE', - height: 5.33, - }, - ], - }, - ], - }, - { - type: 'HIBOEXP', - canFollow: ['TRKTRAC', 'PICKRTT', 'JEEPSRG'], - sizeDimensions: [ - { - height: 4.4, - length: 25, - width: 2.5, - regions: [ - { - region: 'PCE', - height: 5.33, - length: 27.5, - width: 2.8 - }, - { - region: 'KTN', - height: 4.0, - length: 30, - }, - { - region: 'LMN', - height: 4.5, - length: 24, - } - ], - modifiers: [ - { - position: 'first', - type: 'PICKRTT', - }, - ], - }, - { - height: 4.4, - length: 31, - regions: [ - { - region: 'PCE', - height: 5.33, - }, - ], - modifiers: [ - { - position: 'first', - type: 'TRKTRAC', - }, - ], - }, - ], - }, - { - type: 'STWHELR', - canFollow: ['TRKTRAC', 'PICKRTT', 'JEEPSRG'], - canSelfIssue: false, - sizeDimensions: [ - { - width: 3.2, - height: 4.88, - length: 27.5, - regions: [ - { - region: 'PCE', - height: 5.33, - }, - ], - }, - ], - }, - { - type: 'STWIDWH', - canFollow: ['TRKTRAC', 'PICKRTT', 'JEEPSRG'], - canSelfIssue: false, - sizeDimensions: [ - { - width: 3.2, - height: 4.88, - length: 27.5, - regions: [ - { - region: 'PCE', - height: 5.33, - }, - ], - }, - ], - }, - { - type: 'STCRANE', - canFollow: ['TRKTRAC', 'PICKRTT', 'JEEPSRG'], - sizeDimensions: [ - { - width: 3.2, - height: 4.88, - length: 27.5, - regions: [ - { - region: 'PCE', - height: 5.33, - }, - ], - }, - ], - }, - { - type: 'HIBOFLT', - canFollow: ['TRKTRAC', 'JEEPSRG'], - sizeDimensions: [ - { - height: 4.4, - length: 27.5, - regions: [ - { - region: 'PCE', - height: 5.33, - }, - ], - }, - ], - }, - { - type: 'STSDBDK', - canFollow: ['TRKTRAC', 'JEEPSRG'], - sizeDimensions: [ - { - width: 3.2, - height: 4.4, - length: 31, - regions: [ - { - region: 'PCE', - height: 5.33, - }, - ], - }, - ], - }, - ], - }, - { - id: 'GENERAL', - name: 'General commodities', - }, - { - id: 'CULVERT', - name: 'Culverts', + id: 'PIPESTL', + name: 'Pipe And Steel Products (Rebar, Pilings, Reinforcing Steel, Etc.)', + size: { + powerUnits: [ + { + type: 'TRKTRAC', + trailers: [ + { + type: 'HIBOEXP', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + rp: 6.5, + w: 3.2, + h: 4.3, + l: 31, + }, + ], + }, + { + type: 'HIBOFLT', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + rp: 6.5, + w: 3.2, + h: 4.3, + l: 27.5, + }, + ], + }, + { + type: 'STSTEER', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + rp: 6.5, + w: 3.2, + h: 4.3, + l: 36, + }, + ], + }, + { + type: 'STROPRT', + jeep: true, + booster: true, + selfIssue: false, + sizeDimensions: [ + { + fp: 3, + rp: 6.5, + w: 3.2, + h: 4.3, + l: 40, + }, + ], + }, + ], + }, + ], + }, }, { - id: 'RAMPSXX', - name: 'Ramps', + id: 'REDUCBL', + name: 'Reducible Loads', + size: { + powerUnits: [ + { + type: 'TRKTRAC', + trailers: [ + { + type: 'STLOGNG', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + w: 3.2, + h: 4.15, + l: 27.5, + }, + ], + }, + { + type: 'PLATFRM', + jeep: true, + booster: true, + selfIssue: false, + sizeDimensions: [ + { + w: 3.2, + h: 4.3, + l: 27.5, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'SEMITRL', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + w: 3.2, + h: 4.3, + l: 27.5, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'STACTRN', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + w: 3.2, + h: 4.3, + l: 26, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'STBTRAN', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + w: 3.2, + h: 4.3, + l: 27.5, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'HIBOEXP', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + w: 3.2, + h: 4.3, + l: 27.5, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'HIBOFLT', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + w: 3.2, + h: 4.3, + l: 27.5, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'STSDBDK', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + w: 3.2, + h: 4.3, + l: 27.5, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'STSTEER', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + w: 3.2, + h: 4.3, + l: 27.5, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'STWHELR', + jeep: true, + booster: true, + selfIssue: false, + sizeDimensions: [ + { + w: 3.2, + h: 4.3, + l: 27.5, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'STWIDWH', + jeep: true, + booster: true, + selfIssue: false, + sizeDimensions: [ + { + w: 3.2, + h: 4.3, + l: 27.5, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'STCRANE', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + w: 3.2, + h: 4.3, + l: 27.5, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'STROPRT', + jeep: true, + booster: true, + selfIssue: false, + sizeDimensions: [ + { + w: 3.2, + h: 4.3, + l: 40, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'STRSELF', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + w: 3.2, + h: 4.3, + l: 36, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + ], + }, + { + type: 'PICKRTT', + trailers: [ + { + type: 'SEMITRL', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + w: 3.2, + h: 4.3, + l: 27.5, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'HIBOEXP', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + w: 3.2, + h: 4.3, + l: 27.5, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'HIBOFLT', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + w: 3.2, + h: 4.3, + l: 27.5, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'STSDBDK', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + w: 3.2, + h: 4.3, + l: 27.5, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + ], + }, + { + type: 'STINGER', + trailers: [ + { + type: 'SEMITRL', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + fp: 1, + rp: 1.2, + h: 4.3, + l: 25, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'STSTNGR', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + fp: 1, + rp: 1.2, + h: 4.3, + l: 25, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + ], + }, + { + type: 'REGTRCK', + trailers: [ + { + type: 'DOLLIES', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + fp: 1, + rp: 6.5, + w: 3.2, + h: 4.3, + l: 25, + regions: [ + { + region: 'PCE', + h: 4.4, + }, + ], + }, + ], + }, + { + type: 'FULLLTL', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + fp: 1, + rp: 6.5, + w: 3.2, + h: 4.3, + l: 25, + regions: [ + { + region: 'PCE', + h: 4.4, + }, + ], + }, + ], + }, + { + type: 'NONEXXX', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + fp: 1, + rp: 6.5, + w: 3.2, + h: 4.3, + l: 16, + regions: [ + { + region: 'PCE', + h: 4.4, + }, + ], + }, + ], + }, + { + type: 'PONYTRL', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + fp: 1, + rp: 6.5, + w: 3.2, + h: 4.3, + l: 25, + regions: [ + { + region: 'PCE', + h: 4.4, + }, + ], + }, + ], + }, + ], + }, + ], + }, }, { - id: 'REBARXX', - name: 'Rebar', + id: 'SCRAPER', + name: 'Scraper on Dollies', + size: { + powerUnits: [ + { + type: 'TRKTRAC', + trailers: [ + { + type: 'DOLLIES', + jeep: true, + booster: false, + selfIssue: false, + sizeDimensions: [ + { + w: 3.2, + h: 4.3, + l: 25, + regions: [ + { + region: 'PCE', + h: 4.4, + }, + ], + }, + ], + }, + ], + }, + ], + }, }, { - id: 'RESTEEL', - name: 'Reinforcing steel', + id: 'OILFILD', + name: 'Oil Field Equipment', + size: { + powerUnits: [ + { + type: 'OGBEDTK', + trailers: [ + { + type: 'EXPANDO', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + rp: 6.5, + h: 4.3, + l: 27.5, + }, + ], + }, + { + type: 'NONEXXX', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + rp: 5, + w: 3.3, + h: 4.3, + l: 14, + }, + ], + }, + { + type: 'OGOSFDT', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + rp: 6.5, + w: 3.3, + h: 4.3, + l: 23, + }, + ], + }, + ], + }, + { + type: 'OGOILSW', + trailers: [ + { + type: 'NONEXXX', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + rp: 5, + w: 3.2, + h: 4.3, + l: 15, + }, + ], + }, + { + type: 'HIBOFLT', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + rp: 6.5, + w: 3.2, + h: 4.3, + l: 25, + }, + ], + }, + ], + }, + { + type: 'OGSERVC', + trailers: [ + { + type: 'NONEXXX', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + fp: 10, + rp: 6.5, + w: 3.8, + h: 4.3, + l: 15, + }, + ], + }, + { + type: 'PONYTRL', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + fp: 10, + rp: 6.5, + w: 3.8, + h: 4.3, + l: 23, + }, + ], + }, + ], + }, + { + type: 'OGSRRAH', + trailers: [ + { + type: 'NONEXXX', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + fp: 10, + rp: 6.5, + w: 2.9, + h: 4.15, + l: 15.5, + }, + ], + }, + { + type: 'PONYTRL', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + fp: 10, + rp: 6.5, + w: 2.9, + h: 4.15, + l: 23, + }, + ], + }, + ], + }, + { + type: 'TRKTRAC', + trailers: [ + { + type: 'OGOSFDT', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + rp: 6.5, + w: 3.3, + h: 4.3, + l: 23, + }, + ], + }, + ], + }, + ], + }, }, { - id: 'STSTEEL', - name: 'Structural steel', + id: 'JPTRLOG', + name: 'Tandem Jeep/Pole Trailer Loaded on Logging Truck', + size: { + powerUnits: [ + { + type: 'TRKTRAC', + trailers: [ + { + type: 'NONEXXX', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + rp: 5, + w: 2.9, + h: 4.3, + }, + ], + }, + ], + }, + { + type: 'REGTRCK', + trailers: [ + { + type: 'NONEXXX', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + rp: 5, + w: 2.9, + h: 4.3, + }, + ], + }, + ], + }, + ], + }, }, { - id: 'PIPEXXX', - name: 'Pipe', + id: 'TOWDISB', + name: 'Tow Trucks And Disabled Vehicles', + size: { + powerUnits: [ + { + type: 'TOWVEHC', + trailers: [ + { + type: 'NONEXXX', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + h: 4.3, + l: 27.5, + }, + ], + }, + ], + }, + ], + }, }, { - id: 'GRBBINS', - name: 'Garbage bins', + id: 'TRQDLOG', + name: 'Tri-Axle or Quad Axle Full Trailer Loaded on Logging Truck', + size: { + powerUnits: [ + { + type: 'TRKTRAC', + trailers: [ + { + type: 'NONEXXX', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + rp: 5, + h: 4.3, + l: 13.5, + }, + ], + }, + ], + }, + { + type: 'REGTRCK', + trailers: [ + { + type: 'NONEXXX', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + rp: 5, + h: 4.3, + l: 13.5, + }, + ], + }, + ], + }, + ], + }, }, { - id: 'BOATSXX', - name: 'Boats', + id: 'WOODCHP', + name: 'Wood Chips, Residuals', + size: { + powerUnits: [ + { + type: 'TRKTRAC', + trailers: [ + { + type: 'STBTRAN', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + h: 4.45, + l: 27.5, + }, + ], + }, + ], + }, + ], + }, }, { - id: 'BOOMSTK', - name: 'Boomsticks', + id: 'EMPTYXX', + name: 'Empty', + size: { + powerUnits: [ + { + type: 'TRKTRAC', + trailers: [ + { + type: 'LOGOWBK', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + fp: 0, + rp: 0, + w: 3.2, + }, + ], + }, + { + type: 'PLATFRM', + jeep: true, + booster: true, + selfIssue: false, + sizeDimensions: [ + { + w: 3.2, + h: 4.88, + l: 27.5, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'HIBOEXP', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + rp: 6.5, + l: 31, + }, + ], + }, + { + type: 'HIBOFLT', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + rp: 6.5, + l: 27.5, + }, + ], + }, + { + type: 'STSDBDK', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + rp: 6.5, + w: 3.2, + l: 31, + }, + ], + }, + { + type: 'STWHELR', + jeep: true, + booster: true, + selfIssue: false, + sizeDimensions: [ + { + w: 3.2, + h: 4.88, + l: 27.5, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'STWIDWH', + jeep: true, + booster: true, + selfIssue: false, + sizeDimensions: [ + { + w: 3.2, + h: 4.88, + l: 27.5, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'STCRANE', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + w: 3.2, + h: 4.88, + l: 27.5, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + ], + }, + { + type: 'PICKRTT', + trailers: [ + { + type: 'OGOSFDT', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + rp: 6.5, + w: 3.2, + h: 4.3, + l: 23, + }, + ], + }, + { + type: 'PLATFRM', + jeep: true, + booster: true, + selfIssue: false, + sizeDimensions: [ + { + w: 3.2, + h: 4.88, + l: 27.5, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'HIBOEXP', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + rp: 6.5, + l: 25, + regions: [ + { + region: 'PCE', + l: 27.5, + }, + ], + }, + ], + }, + { + type: 'STWHELR', + jeep: true, + booster: true, + selfIssue: false, + sizeDimensions: [ + { + w: 3.2, + h: 4.88, + l: 27.5, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'STWIDWH', + jeep: true, + booster: true, + selfIssue: false, + sizeDimensions: [ + { + w: 3.2, + h: 4.88, + l: 27.5, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'STCRANE', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + w: 3.2, + h: 4.88, + l: 27.5, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + ], + }, + ], + }, }, { - id: 'CONTANR', - name: 'Containers', + id: 'GRBBINS', + name: 'Garbage Bins', + size: { + powerUnits: [ + { + type: 'REGTRCK', + trailers: [ + { + type: 'FULLLTL', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + rp: 6.5, + }, + ], + }, + { + type: 'NONEXXX', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + rp: 6.5, + }, + ], + }, + { + type: 'PONYTRL', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + rp: 6.5, + }, + ], + }, + ], + }, + ], + }, }, { - id: 'HAYROND', - name: 'Hay bales round', + id: 'LAMBEAM', + name: 'Laminated Beams', + size: { + powerUnits: [ + { + type: 'TRKTRAC', + trailers: [ + { + type: 'POLETRL', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + rp: 6.5, + l: 40, + }, + ], + }, + { + type: 'HIBOEXP', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + rp: 6.5, + l: 31, + }, + ], + }, + ], + }, + ], + }, }, { id: 'HAYLREC', - name: 'Hay bales large rectangular', + name: 'Hay Bales Large Rectangular', + size: { + powerUnits: [ + { + type: 'TRKTRAC', + trailers: [ + { + type: 'STACTRN', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + w: 3.05, + h: 4.3, + l: 26, + regions: [ + { + region: 'PCE', + h: 4.8, + }, + ], + }, + ], + }, + { + type: 'STBTRAN', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + w: 3.05, + h: 4.3, + l: 27.5, + regions: [ + { + region: 'PCE', + h: 4.8, + }, + ], + }, + ], + }, + { + type: 'HIBOFLT', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + rp: 6.5, + w: 3.05, + h: 4.4, + regions: [ + { + region: 'LMN', + h: 4.3, + }, + { + region: 'KTN', + h: 4.3, + }, + { + region: 'PCE', + h: 4.8, + }, + ], + }, + ], + }, + { + type: 'STSDBDK', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + rp: 6.5, + w: 3.05, + h: 4.3, + regions: [ + { + region: 'PCE', + h: 4.8, + }, + ], + }, + ], + }, + ], + }, + { + type: 'REGTRCK', + trailers: [ + { + type: 'FULLLTL', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + rp: 4, + w: 3.05, + h: 4.3, + regions: [ + { + region: 'PCE', + h: 4.8, + }, + ], + }, + ], + }, + { + type: 'NONEXXX', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + w: 3.05, + h: 4.3, + regions: [ + { + region: 'PCE', + h: 4.8, + }, + ], + }, + ], + }, + { + type: 'PONYTRL', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + rp: 4, + w: 3.05, + h: 4.3, + regions: [ + { + region: 'PCE', + h: 4.8, + }, + ], + }, + ], + }, + ], + }, + ], + }, }, { - id: 'HAYBALE', - name: 'Hay bales', + id: 'HAYROND', + name: 'Hay Bales Round', + size: { + powerUnits: [ + { + type: 'TRKTRAC', + trailers: [ + { + type: 'STACTRN', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + w: 3.5, + h: 4.3, + l: 26, + regions: [ + { + region: 'PCE', + w: 3.84, + h: 4.8, + }, + ], + }, + ], + }, + { + type: 'STBTRAN', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + w: 3.5, + h: 4.3, + l: 27.5, + regions: [ + { + region: 'PCE', + w: 3.84, + h: 4.8, + }, + ], + }, + ], + }, + { + type: 'HIBOFLT', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + rp: 6.5, + w: 3.5, + h: 4.3, + regions: [ + { + region: 'PCE', + w: 3.84, + h: 4.8, + }, + ], + }, + ], + }, + { + type: 'STSDBDK', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + rp: 6.5, + w: 3.5, + h: 4.3, + regions: [ + { + region: 'PCE', + w: 3.84, + h: 4.8, + }, + ], + }, + ], + }, + ], + }, + { + type: 'REGTRCK', + trailers: [ + { + type: 'FULLLTL', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + rp: 4, + w: 3.5, + h: 4.3, + regions: [ + { + region: 'PCE', + w: 3.84, + h: 4.8, + }, + ], + }, + ], + }, + { + type: 'NONEXXX', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + w: 3.5, + h: 4.3, + regions: [ + { + region: 'PCE', + w: 3.84, + h: 4.8, + }, + ], + }, + ], + }, + { + type: 'PONYTRL', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + rp: 4, + w: 3.5, + h: 4.3, + regions: [ + { + region: 'PCE', + w: 3.84, + h: 4.8, + }, + ], + }, + ], + }, + ], + }, + ], + }, }, { id: 'HAYSREC', - name: 'Hay bales small rectangular', - }, - { - id: 'BUILDNG', - name: 'House or building', - }, - { - id: 'LONGLOG', - name: 'Long logs', - }, - { - id: 'PILINGS', - name: 'Piling', - }, - { - id: 'POLESXX', - name: 'Poles', - }, - { - id: 'RUGHLUM', - name: 'Rough cut lumber', - }, - { - id: 'VENEERX', - name: 'Veneer', - }, - { - id: 'MODULAR', - name: 'Modular building', - }, - { - id: 'MOBHOME', - name: 'Mobile home manufactured', - }, - { - id: 'PARKTRL', - name: 'Park model trailers', - }, - { - id: 'AIRCRFT', - name: 'Aircraft', - }, - { - id: 'BACKHOE', - name: 'Backhoes', - }, - { - id: 'BRIDGES', - name: 'Bridges', + name: 'Hay Bales Small Rectangular', + size: { + powerUnits: [ + { + type: 'TRKTRAC', + trailers: [ + { + type: 'STACTRN', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + w: 3.05, + h: 4.3, + l: 26, + regions: [ + { + region: 'PCE', + h: 4.8, + }, + ], + }, + ], + }, + { + type: 'STBTRAN', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + w: 3.05, + h: 4.3, + l: 27.5, + regions: [ + { + region: 'PCE', + h: 4.8, + }, + ], + }, + ], + }, + { + type: 'HIBOFLT', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + rp: 6.5, + w: 3.05, + h: 4.3, + regions: [ + { + region: 'PCE', + h: 4.8, + }, + ], + }, + ], + }, + { + type: 'STSDBDK', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + rp: 6.5, + w: 3.05, + h: 4.3, + regions: [ + { + region: 'PCE', + h: 4.8, + }, + ], + }, + ], + }, + ], + }, + { + type: 'REGTRCK', + trailers: [ + { + type: 'FULLLTL', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + rp: 4, + w: 3.05, + h: 4.3, + regions: [ + { + region: 'PCE', + h: 4.8, + }, + ], + }, + ], + }, + { + type: 'NONEXXX', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + w: 3.05, + h: 4.3, + regions: [ + { + region: 'PCE', + h: 4.8, + }, + ], + }, + ], + }, + { + type: 'PONYTRL', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + rp: 4, + w: 3.05, + h: 4.3, + regions: [ + { + region: 'PCE', + h: 4.8, + }, + ], + }, + ], + }, + ], + }, + ], + }, }, { id: 'BRGBEAM', - name: 'Bridge beams', - powerUnits: [ - { - type: 'TRKTRAC', - canFollow: [], - }, - ], - trailers: [ - { - type: 'JEEPSRG', - canFollow: ['TRKTRAC', 'JEEPSRG'], - }, - { - type: 'BOOSTER', - canFollow: ['POLETRL', 'BOOSTER'], - }, - { - type: 'POLETRL', - canFollow: ['TRKTRAC', 'JEEPSRG'], - }, - ], - }, - { - id: 'BARGESX', - name: 'Barges', - }, - { - id: 'BLADESX', - name: 'Blades', - }, - { - id: 'BUCKETS', - name: 'Buckets', - }, - { - id: 'CATCRLR', - name: 'Cat or crawler', - }, - { - id: 'COALTRK', - name: 'Coal truck', - }, - { - id: 'CMPRSOR', - name: 'Compressor', - }, - { - id: 'CRANESX', - name: 'Cranes', - }, - { - id: 'CRAWLER', - name: 'Crawler', - }, - { - id: 'CRUSHER', - name: 'Crusher parts', - }, - { - id: 'EXCVATR', - name: 'Excavator', - }, - { - id: 'FORKLFT', - name: 'Fork lifts', - }, - { - id: 'GENRTOR', - name: 'Generator', - }, - { - id: 'LOADERX', - name: 'Loader', - }, - { - id: 'LOGGING', - name: 'Logging machinery', - }, - { - id: 'LOGLODR', - name: 'Log loader', - }, - { - id: 'MINEMAC', - name: 'Mine machinery', - }, - { - id: 'MILLMAC', - name: 'Mill machinery', + name: 'Bridge Beams', + size: { + powerUnits: [ + { + type: 'TRKTRAC', + trailers: [ + { + type: 'POLETRL', + jeep: true, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + rp: 6.5, + l: 31, + }, + ], + }, + ], + }, + ], + }, }, { id: 'NONREDU', - name: 'Non reducible loads', - }, - { - id: 'OILDRRG', - name: 'Oil drill rig', - }, - { - id: 'OREBOXS', - name: 'Ore boxes', - }, - { - id: 'PLSTEEL', - name: 'Plate steel', - }, - { - id: 'STBEAMS', - name: 'Steel beams', - }, - { - id: 'SHOVELS', - name: 'Shovels', - }, - { - id: 'SKIDDER', - name: 'Skidder', - }, - { - id: 'TRUSSES', - name: 'Trusses', - }, - { - id: 'TANKSXX', - name: 'Tanks', - }, - { - id: 'TRNSFRM', - name: 'Transformer', - }, - { - id: 'TWRTUBE', - name: 'Tower tube', - }, - { - id: 'VESSELS', - name: 'Vessels', - }, - { - id: 'LMBEAMS', - name: 'Laminated beams', - }, - { - id: 'YARDERX', - name: 'Yarder', - }, - { - id: 'SKDSTAK', - name: 'Skid stack', - }, - { - id: 'OTHERVE', - name: 'Other vehicle', - }, - { - id: 'SCRAPER', - name: 'Scrapers', - }, - { - id: 'BMCRANE', - name: 'Booms (cranes)', - }, - { - id: 'GENVEHC', - name: 'General - vehicle and loads', - }, - { - id: 'GENMOHO', - name: 'General - mobile homes', + name: 'Non-Reducible Loads', + size: { + powerUnits: [ + { + type: 'TRKTRAC', + trailers: [ + { + type: 'STLOGNG', + jeep: false, + booster: false, + selfIssue: false, + sizeDimensions: [ + { + w: 3.8, + h: 4.15, + l: 27.5, + }, + ], + }, + { + type: 'PLATFRM', + jeep: true, + booster: true, + selfIssue: false, + sizeDimensions: [ + { + w: 5, + h: 4.88, + l: 27.5, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'SEMITRL', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + w: 5, + h: 4.88, + l: 27.5, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'STACTRN', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + w: 5, + h: 4.4, + l: 26, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'STBTRAN', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + w: 5, + h: 4.4, + l: 27.5, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'HIBOEXP', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + w: 5, + h: 4.4, + l: 27.5, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'HIBOFLT', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + w: 5, + h: 4.4, + l: 27.5, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'STSDBDK', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + w: 5, + h: 4.88, + l: 27.5, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'STSTEER', + jeep: true, + booster: true, + selfIssue: false, + sizeDimensions: [ + { + w: 5, + h: 4.88, + l: 27.5, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'STWHELR', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + w: 5, + h: 4.88, + l: 27.5, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'STWIDWH', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + w: 5, + h: 4.88, + l: 27.5, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'STCRANE', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + w: 5, + h: 4.88, + l: 27.5, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'STROPRT', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + w: 5, + h: 4.88, + l: 40, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'STRSELF', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + w: 5, + h: 4.88, + l: 36, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + ], + }, + { + type: 'PICKRTT', + trailers: [ + { + type: 'OGOSFDT', + jeep: true, + booster: true, + selfIssue: false, + sizeDimensions: [ + { + fp: 3, + rp: 6.5, + w: 3.3, + h: 4.3, + l: 23, + }, + ], + }, + { + type: 'SEMITRL', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + w: 5, + h: 4.88, + l: 25, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'HIBOEXP', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + w: 5, + h: 4.4, + l: 25, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'HIBOFLT', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + w: 5, + h: 4.4, + l: 25, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'STSDBDK', + jeep: true, + booster: true, + selfIssue: false, + sizeDimensions: [ + { + fp: 3, + w: 5, + h: 4.88, + l: 25, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'STSTEER', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + w: 5, + h: 4.88, + l: 27.5, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'STWHELR', + jeep: true, + booster: true, + selfIssue: false, + sizeDimensions: [ + { + w: 5, + h: 4.88, + l: 27.5, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'STWIDWH', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + w: 5, + h: 4.88, + l: 27.5, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'STCRANE', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + w: 5, + h: 4.88, + l: 27.5, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'STROPRT', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + w: 5, + h: 4.88, + l: 40, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'STRSELF', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + w: 5, + h: 4.88, + l: 36, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + ], + }, + { + type: 'STINGER', + trailers: [ + { + type: 'SEMITRL', + jeep: false, + booster: false, + selfIssue: false, + sizeDimensions: [ + { + fp: 1, + rp: 1.2, + h: 4.88, + l: 25, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'STSTNGR', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + fp: 1, + rp: 1.2, + h: 4.88, + l: 25, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + ], + }, + { + type: 'REGTRCK', + trailers: [ + { + type: 'DOLLIES', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + fp: 1, + rp: 6.5, + w: 5, + h: 4.88, + l: 25, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'FULLLTL', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + fp: 1, + rp: 6.5, + w: 5, + h: 4.88, + l: 25, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'NONEXXX', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + fp: 1, + rp: 6.5, + w: 5, + h: 4.88, + l: 16, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'PONYTRL', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + fp: 1, + rp: 6.5, + w: 5, + h: 4.88, + l: 25, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + ], + }, + ], + }, }, { id: 'AUTOCRR', - name: 'Auto carrier, campers and boats (stinger steered)', - powerUnits: [ - { - type: 'STINGER', - canFollow: [], - }, - ], - trailers: [ - { - type: 'STSTNGR', - canFollow: ['STINGER'], - sizeDimensions: [ - { - frontProjection: 1, - rearProjection: 1.2, - width: 2.6, - height: 4.4, - length: 25, - regions: [ - { - region: 'LMN', - height: 4.3, - }, - { - region: 'KTN', - height: 4.3, - }, - { - region: 'PCE', - height: 4.88, - }, - ], - }, - ], - }, - ], - }, - { - id: 'BMPOLES', - name: 'Boomsticks and poles', + name: 'Auto Carrier, Campers And Boats (Stinger Steered Transporters Only)', + size: { + powerUnits: [ + { + type: 'STINGER', + trailers: [ + { + type: 'STSTNGR', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + fp: 1, + rp: 1.2, + h: 4.4, + l: 25, + regions: [ + { + region: 'LMN', + h: 4.3, + }, + { + region: 'KTN', + h: 4.3, + }, + { + region: 'PCE', + h: 4.88, + }, + ], + }, + ], + }, + ], + }, + ], + }, }, { id: 'HAYRNPR', - name: 'Haybales (round) Peace River only', - }, - { - id: 'BUSPONY', - name: 'Inter-city bus with pony trailer', - }, - { - id: 'TOWTRCK', - name: 'Tow trucks and disabled vehicles', + name: 'Hay Bales (Round) Peace River Only', + size: { + powerUnits: [ + { + type: 'TRKTRAC', + trailers: [ + { + type: 'STACTRN', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + w: 3.5, + h: 4.3, + l: 26, + regions: [ + { + region: 'PCE', + w: 3.84, + h: 4.8, + }, + ], + }, + ], + }, + { + type: 'STBTRAN', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + w: 3.5, + h: 4.3, + regions: [ + { + region: 'PCE', + w: 3.84, + h: 4.8, + }, + ], + }, + ], + }, + { + type: 'HIBOFLT', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + rp: 6.5, + w: 3.5, + h: 4.3, + regions: [ + { + region: 'PCE', + w: 3.84, + h: 4.8, + }, + ], + }, + ], + }, + { + type: 'STSDBDK', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + rp: 6.5, + w: 3.5, + h: 4.3, + regions: [ + { + region: 'PCE', + w: 3.84, + h: 4.8, + }, + ], + }, + ], + }, + ], + }, + { + type: 'REGTRCK', + trailers: [ + { + type: 'FULLLTL', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + rp: 4, + w: 3.5, + h: 4.3, + regions: [ + { + region: 'PCE', + w: 3.84, + h: 4.8, + }, + ], + }, + ], + }, + { + type: 'NONEXXX', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + w: 3.5, + h: 4.3, + regions: [ + { + region: 'PCE', + w: 3.84, + h: 4.8, + }, + ], + }, + ], + }, + { + type: 'PONYTRL', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + rp: 4, + w: 3.5, + h: 4.3, + regions: [ + { + region: 'PCE', + w: 3.84, + h: 4.8, + }, + ], + }, + ], + }, + ], + }, + ], + }, }, { id: 'BRSHCUT', - name: 'Brushcutters (Peace only)', - powerUnits: [ - { - type: 'TRKTRAC', - canFollow: [], - }, - { - type: 'REGTRCK', - canFollow: [], - }, - ], - trailers: [ - { - type: 'JEEPSRG', - canFollow: ['TRKTRAC', 'JEEPSRG'], - }, - { - type: 'BOOSTER', - canFollow: ['STSDBDK', 'BOOSTER'], - }, - { - type: 'SEMITRL', - canFollow: ['TRKTRAC'], - sizeDimensions: [ - { - length: 23, - regions: [ - { - region: 'PCE', - width: 4.57, - height: 5.33, - }, - ], - }, - ], - }, - { - type: 'STSDBDK', - canFollow: ['TRKTRAC', 'JEEPSRG'], - sizeDimensions: [ - { - length: 23, - regions: [ - { - region: 'PCE', - width: 4.57, - height: 5.33, - }, - ], - }, - ], - }, - { - type: 'FULLLTL', - canFollow: ['REGTRCK'], - sizeDimensions: [ - { - frontProjection: 1, - rearProjection: 1, - length: 23, - regions: [ - { - region: 'PCE', - width: 4.57, - height: 5.33, - }, - ], - }, - ], - }, - { - type: 'NONEXXX', - canFollow: ['REGTRCK'], - sizeDimensions: [ - { - frontProjection: 1, - rearProjection: 1, - length: 12.5, - regions: [ - { - region: 'PCE', - width: 4.57, - height: 5.33, - }, - ], - }, - ], - }, - { - type: 'PONYTRL', - canFollow: ['REGTRCK'], - sizeDimensions: [ - { - frontProjection: 1, - rearProjection: 1, - length: 23, - regions: [ - { - region: 'PCE', - width: 4.57, - height: 5.33, - }, - ], - }, - ], - }, - ], + name: 'Brushcutters (Peace Only)', + size: { + powerUnits: [ + { + type: 'TRKTRAC', + trailers: [ + { + type: 'SEMITRL', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + rp: 6.5, + regions: [ + { + region: 'PCE', + w: 4.57, + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'STSDBDK', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + rp: 6.5, + regions: [ + { + region: 'PCE', + w: 4.57, + h: 5.33, + }, + ], + }, + ], + }, + ], + }, + { + type: 'REGTRCK', + trailers: [ + { + type: 'NONEXXX', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + regions: [ + { + region: 'PCE', + w: 4.57, + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'PONYTRL', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + regions: [ + { + region: 'PCE', + w: 3.8, + h: 5.33, + }, + ], + }, + ], + }, + ], + }, + ], + }, }, { id: 'FIXEDEQ', - name: 'Fixed equipment', + name: 'Fixed Equipment', + size: { + powerUnits: [ + { + type: 'TRKTRAC', + trailers: [ + { + type: 'FECVYER', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + fp: 4, + rp: 9.5, + w: 3.8, + h: 4.72, + l: 31, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'FEDRMMX', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + rp: 6.5, + w: 3.8, + h: 4.72, + l: 31, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'FEBGHSE', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + rp: 6.5, + w: 4.26, + h: 4.72, + l: 31, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'FESEMTR', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + rp: 6.5, + w: 3.8, + h: 4.72, + l: 31, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'FEWHELR', + jeep: true, + booster: true, + selfIssue: false, + sizeDimensions: [ + { + fp: 3, + rp: 6.5, + w: 3.8, + h: 4.72, + l: 31, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + ], + }, + { + type: 'REGTRCK', + trailers: [ + { + type: 'FECVYPT', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + fp: 4, + rp: 9.5, + w: 3.2, + h: 4.3, + l: 31, + }, + ], + }, + { + type: 'FEDRMMX', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + rp: 6.5, + w: 3.8, + h: 4.72, + l: 31, + regions: [ + { + region: 'PCE', + h: 5.33, + }, + ], + }, + ], + }, + { + type: 'FEPNYTR', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + rp: 4, + w: 3.2, + h: 4.3, + l: 31, + }, + ], + }, + { + type: 'FEBGHSE', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + rp: 6.5, + w: 4.26, + h: 4.72, + l: 31, + }, + ], + }, + ], + }, + ], + }, }, ], globalSizeDefaults: { - frontProjection: 3, - rearProjection: 6.5, - width: 2.6, - height: 4.15, - length: 31, + fp: 3, + rp: 6.5, + w: 2.6, + h: 4.15, + l: 31, }, }; diff --git a/policy-engine/src/_test/policy-config/tros-multiple-cost-rules.sample.ts b/policy-engine/src/_test/policy-config/tros-multiple-cost-rules.sample.ts index cd53d7bea..0fadd0709 100644 --- a/policy-engine/src/_test/policy-config/tros-multiple-cost-rules.sample.ts +++ b/policy-engine/src/_test/policy-config/tros-multiple-cost-rules.sample.ts @@ -44,10 +44,10 @@ export const multipleCostRules: PolicyDefinition = { }, commodities: [], globalSizeDefaults: { - frontProjection: 3, - rearProjection: 6.5, - width: 2.6, - height: 4.15, - length: 31, + fp: 3, + rp: 6.5, + w: 2.6, + h: 4.15, + l: 31, }, }; diff --git a/policy-engine/src/_test/policy-config/tros-no-allowed-vehicles.sample.ts b/policy-engine/src/_test/policy-config/tros-no-allowed-vehicles.sample.ts index d8a5f5e49..762e7a43d 100644 --- a/policy-engine/src/_test/policy-config/tros-no-allowed-vehicles.sample.ts +++ b/policy-engine/src/_test/policy-config/tros-no-allowed-vehicles.sample.ts @@ -17,7 +17,8 @@ export const trosNoAllowedVehicles: PolicyDefinition = { { conditions: { not: { - fact: 'permitData.vehicleDetails.vehicleSubType', + fact: 'permitData', + path: '$.vehicleDetails.vehicleSubType', operator: 'in', value: { fact: 'allowedVehicles', @@ -41,11 +42,11 @@ export const trosNoAllowedVehicles: PolicyDefinition = { trailers: [], }, globalSizeDefaults: { - frontProjection: 3, - rearProjection: 6.5, - width: 2.6, - height: 4.15, - length: 31, + fp: 3, + rp: 6.5, + w: 2.6, + h: 4.15, + l: 31, }, vehicleCategories: { trailerCategories: [], diff --git a/policy-engine/src/_test/policy-config/tros-no-params.sample.ts b/policy-engine/src/_test/policy-config/tros-no-params.sample.ts index 48756b077..252901b81 100644 --- a/policy-engine/src/_test/policy-config/tros-no-params.sample.ts +++ b/policy-engine/src/_test/policy-config/tros-no-params.sample.ts @@ -17,7 +17,8 @@ export const trosNoParamsSample: PolicyDefinition = { { conditions: { not: { - fact: 'permitData.vehicleDetails.vehicleSubType', + fact: 'permitData', + path: '$.vehicleDetails.vehicleSubType', operator: 'in', value: { fact: 'allowedVehicles', @@ -36,11 +37,11 @@ export const trosNoParamsSample: PolicyDefinition = { trailers: [], }, globalSizeDefaults: { - frontProjection: 3, - rearProjection: 6.5, - width: 2.6, - height: 4.15, - length: 31, + fp: 3, + rp: 6.5, + w: 2.6, + h: 4.15, + l: 31, }, vehicleCategories: { trailerCategories: [], diff --git a/policy-engine/src/_test/policy-config/tros-only.sample.ts b/policy-engine/src/_test/policy-config/tros-only.sample.ts index d013b9e8e..f64cfc16e 100644 --- a/policy-engine/src/_test/policy-config/tros-only.sample.ts +++ b/policy-engine/src/_test/policy-config/tros-only.sample.ts @@ -7,7 +7,8 @@ export const trosOnly: PolicyDefinition = { { conditions: { not: { - fact: 'permitData.companyName', + fact: 'permitData', + path: '$.companyName', operator: 'stringMinimumLength', value: 1, }, @@ -24,7 +25,8 @@ export const trosOnly: PolicyDefinition = { { conditions: { not: { - fact: 'permitData.contactDetails.firstName', + fact: 'permitData', + path: '$.contactDetails.firstName', operator: 'stringMinimumLength', value: 1, }, @@ -42,7 +44,8 @@ export const trosOnly: PolicyDefinition = { conditions: { any: [ { - fact: 'permitData.startDate', + fact: 'permitData', + path: '$.startDate', operator: 'dateLessThan', value: { fact: 'validationDate', @@ -62,7 +65,8 @@ export const trosOnly: PolicyDefinition = { { conditions: { not: { - fact: 'permitData.vehicleDetails.vin', + fact: 'permitData', + path: '$.vehicleDetails.vin', operator: 'regex', value: '^[a-zA-Z0-9]{6}$', }, @@ -93,14 +97,16 @@ export const trosOnly: PolicyDefinition = { all: [ { not: { - fact: 'permitData.permitDuration', + fact: 'permitData', + path: '$.permitDuration', operator: 'in', value: [30, 60, 90, 120, 150, 180, 210, 240, 270, 300, 330], }, }, { not: { - fact: 'permitData.permitDuration', + fact: 'permitData', + path: '$.permitDuration', operator: 'equal', value: { fact: 'daysInPermitYear', @@ -121,7 +127,8 @@ export const trosOnly: PolicyDefinition = { { conditions: { not: { - fact: 'permitData.vehicleDetails.vehicleSubType', + fact: 'permitData', + path: '$.vehicleDetails.vehicleSubType', operator: 'in', value: { fact: 'allowedVehicles', @@ -145,11 +152,11 @@ export const trosOnly: PolicyDefinition = { trailers: [], }, globalSizeDefaults: { - frontProjection: 3, - rearProjection: 6.5, - width: 2.6, - height: 4.15, - length: 31, + fp: 3, + rp: 6.5, + w: 2.6, + h: 4.15, + l: 31, }, vehicleCategories: { trailerCategories: [], diff --git a/policy-engine/src/_test/unit/configuration.spec.ts b/policy-engine/src/_test/unit/configuration.spec.ts index 2565158d0..25bb33c61 100644 --- a/policy-engine/src/_test/unit/configuration.spec.ts +++ b/policy-engine/src/_test/unit/configuration.spec.ts @@ -1,5 +1,5 @@ -import { Policy } from "../../policy-engine"; -import { stosPolicyConfig } from "../policy-config/stos-vehicle-config.sample"; +import { Policy } from '../../policy-engine'; +import { stosPolicyConfig } from '../policy-config/stos-vehicle-config.sample'; describe('Permit Engine Oversize Configuration Functions', () => { const policy: Policy = new Policy(stosPolicyConfig); @@ -11,21 +11,15 @@ describe('Permit Engine Oversize Configuration Functions', () => { expect(puTypes.keys()).toContain('PICKRTT'); }); - it('should return an empty map for invalid permit type', async () => { - const puTypes = policy.getPermittablePowerUnitTypes('_INVALID', 'EMPTYXX'); - expect(puTypes.size).toBe(0) + it('should throw an error for invalid permit type', async () => { + expect(() => { + policy.getPermittablePowerUnitTypes('_INVALID', 'EMPTYXX'); + }).toThrow(); }); it('should return an empty map for invalid commodity', async () => { const puTypes = policy.getPermittablePowerUnitTypes('STOS', '_INVALID'); - expect(puTypes.size).toBe(0) - }); - - it('should get all correct vehicles for a given commodity', async () => { - const vehicles = policy.getAllVehiclesForCommodity('STOS', 'BRGBEAM'); - expect(vehicles.length).toBe(4); - expect(vehicles.map((v) => v.type)).toContain('TRKTRAC'); - expect(vehicles.map((v) => v.type)).toContain('POLETRL'); + expect(puTypes.size).toBe(0); }); }); @@ -33,33 +27,46 @@ describe('Permit Engine Get Next Permittable Vehicles', () => { const policy: Policy = new Policy(stosPolicyConfig); it('should return permittable power units with empty current configuration', async () => { - const vehicles = policy.getNextPermittableVehicles('STOS', 'BRGBEAM', []); + const vehicles = policy.getNextPermittableVehicles('STOS', 'LAMBEAM', []); expect(vehicles.size).toBe(1); expect(vehicles.keys()).toContain('TRKTRAC'); }); it('should return jeep and a trailer when current config is just power unit', async () => { - const vehicles = policy.getNextPermittableVehicles('STOS', 'BRGBEAM', ['TRKTRAC']); - expect(vehicles.size).toBe(2); + const vehicles = policy.getNextPermittableVehicles('STOS', 'LAMBEAM', [ + 'TRKTRAC', + ]); + expect(vehicles.size).toBe(3); expect(vehicles.keys()).toContain('JEEPSRG'); expect(vehicles.keys()).toContain('POLETRL'); + expect(vehicles.keys()).toContain('HIBOEXP'); }); it('should return jeep and a trailer when current config is power unit and jeep', async () => { - const vehicles = policy.getNextPermittableVehicles('STOS', 'BRGBEAM', ['TRKTRAC', 'JEEPSRG']); - expect(vehicles.size).toBe(2); + const vehicles = policy.getNextPermittableVehicles('STOS', 'LAMBEAM', [ + 'TRKTRAC', + 'JEEPSRG', + ]); + expect(vehicles.size).toBe(3); expect(vehicles.keys()).toContain('JEEPSRG'); expect(vehicles.keys()).toContain('POLETRL'); + expect(vehicles.keys()).toContain('HIBOEXP'); }); it('should return booster when current config is power unit and trailer', async () => { - const vehicles = policy.getNextPermittableVehicles('STOS', 'BRGBEAM', ['TRKTRAC', 'POLETRL']); + const vehicles = policy.getNextPermittableVehicles('STOS', 'LAMBEAM', [ + 'TRKTRAC', + 'POLETRL', + ]); expect(vehicles.size).toBe(1); expect(vehicles.keys()).toContain('BOOSTER'); }); it('should return empty map when current configuration is invalid', async () => { - const vehicles = policy.getNextPermittableVehicles('STOS', 'BRGBEAM', ['TRKTRAC', '_INVALID']); + const vehicles = policy.getNextPermittableVehicles('STOS', 'LAMBEAM', [ + 'TRKTRAC', + '_INVALID', + ]); expect(vehicles.size).toBe(0); }); }); @@ -68,37 +75,69 @@ describe('Permit Engine Configuration Validation', () => { const policy: Policy = new Policy(stosPolicyConfig); it('should return true for a valid configuration with power unit and trailer', async () => { - const isValid = policy.isConfigurationValid('STOS', 'BRGBEAM', ['TRKTRAC', 'POLETRL']); + const isValid = policy.isConfigurationValid('STOS', 'LAMBEAM', [ + 'TRKTRAC', + 'POLETRL', + ]); expect(isValid).toBe(true); }); it('should return true for a valid configuration with power unit and trailer and jeep and booster', async () => { - const isValid = policy.isConfigurationValid('STOS', 'BRGBEAM', ['TRKTRAC', 'JEEPSRG', 'POLETRL', 'BOOSTER']); + const isValid = policy.isConfigurationValid('STOS', 'LAMBEAM', [ + 'TRKTRAC', + 'JEEPSRG', + 'POLETRL', + 'BOOSTER', + ]); expect(isValid).toBe(true); }); it('should return false for a configuration out of order', async () => { - const isValid = policy.isConfigurationValid('STOS', 'BRGBEAM', ['TRKTRAC', 'POLETRL', 'JEEPSRG', 'BOOSTER']); + const isValid = policy.isConfigurationValid('STOS', 'LAMBEAM', [ + 'TRKTRAC', + 'POLETRL', + 'JEEPSRG', + 'BOOSTER', + ]); expect(isValid).toBe(false); }); - it('should return false for an invalid permit type', async () => { - const isValid = policy.isConfigurationValid('_INVALID', 'BRGBEAM', ['TRKTRAC', 'POLETRL']); - expect(isValid).toBe(false); + it('should throw an error for an invalid permit type', async () => { + expect(() => { + policy.isConfigurationValid('_INVALID', 'LAMBEAM', [ + 'TRKTRAC', + 'POLETRL', + ]); + }).toThrow(); }); - it('should return false for an invalid commodity', async () => { - const isValid = policy.isConfigurationValid('STOS', '_INVALID', ['TRKTRAC', 'POLETRL']); - expect(isValid).toBe(false); + it('should throw an error for an invalid commodity', async () => { + expect(() => { + policy.isConfigurationValid('STOS', '_INVALID', ['TRKTRAC', 'POLETRL']); + }).toThrow(); }); it('should return false for a configuration missing a trailer', async () => { - const isValid = policy.isConfigurationValid('STOS', 'BRGBEAM', ['TRKTRAC', 'JEEPSRG']); + const isValid = policy.isConfigurationValid('STOS', 'LAMBEAM', [ + 'TRKTRAC', + 'JEEPSRG', + ]); expect(isValid).toBe(false); }); - it('should return false for a permit type not requiring commodity', async () => { - const isValid = policy.isConfigurationValid('TROS', 'BRGBEAM', ['TRKTRAC']); - expect(isValid).toBe(false); + it('should return true for a partial configuration missing a trailer', async () => { + const isValid = policy.isConfigurationValid( + 'STOS', + 'LAMBEAM', + ['TRKTRAC', 'JEEPSRG'], + true, + ); + expect(isValid).toBe(true); + }); + + it('should throw an error for a permit type not requiring commodity', async () => { + expect(() => { + policy.isConfigurationValid('TROS', 'LAMBEAM', ['TRKTRAC']); + }).toThrow(); }); -}); \ No newline at end of file +}); diff --git a/policy-engine/src/_test/unit/size-dimension.spec.ts b/policy-engine/src/_test/unit/size-dimension.spec.ts index ae9648657..6dbd0438e 100644 --- a/policy-engine/src/_test/unit/size-dimension.spec.ts +++ b/policy-engine/src/_test/unit/size-dimension.spec.ts @@ -1,71 +1,67 @@ -import { Policy } from "../../policy-engine"; -import { stosPolicyConfig } from "../policy-config/stos-vehicle-config.sample"; +import { Policy } from '../../policy-engine'; +import { stosPolicyConfig } from '../policy-config/stos-vehicle-config.sample'; describe('Permit Engine Size Dimension Functions', () => { const policy: Policy = new Policy(stosPolicyConfig); it('should assume all regions if none are supplied', async () => { // This configuration has minimum values pulled from multiple regions - const sizeDimension = policy.getSizeDimension('STOS', 'EMPTYXX', ['PICKRTT', 'JEEPSRG', 'HIBOEXP']); - expect(sizeDimension?.height).toBe(4.0); - expect(sizeDimension?.width).toBe(2.5); - expect(sizeDimension?.length).toBe(24); + const sizeDimension = policy.getSizeDimension('STOS', 'EMPTYXX', [ + 'TRKTRAC', + 'JEEPSRG', + 'HIBOEXP', + ]); + expect(sizeDimension?.fp).toBe(3); + expect(sizeDimension?.rp).toBe(6.5); + expect(sizeDimension?.l).toBe(31); + expect(sizeDimension?.h).toBeUndefined(); + expect(sizeDimension?.w).toBeUndefined(); }); it('should retrieve correct values for a single specified region', async () => { - const sizeDimension = policy.getSizeDimension('STOS', 'EMPTYXX', ['PICKRTT', 'JEEPSRG', 'HIBOEXP'], ['PCE']); - expect(sizeDimension?.height).toBe(5.33); - expect(sizeDimension?.width).toBe(2.8); - expect(sizeDimension?.length).toBe(27.5); + const sizeDimension = policy.getSizeDimension( + 'STOS', + 'EMPTYXX', + ['TRKTRAC', 'JEEPSRG', 'PLATFRM'], + ['PCE'], + ); + expect(sizeDimension?.fp).toBeUndefined(); + expect(sizeDimension?.rp).toBeUndefined(); + expect(sizeDimension?.l).toBe(27.5); + expect(sizeDimension?.h).toBe(5.33); + expect(sizeDimension?.w).toBe(3.2); }); - it('should retrieve correct values for a configuration with modifier', async () => { - const sizeDimension = policy.getSizeDimension('STOS', 'EMPTYXX', ['TRKTRAC', 'JEEPSRG', 'HIBOEXP']); - expect(sizeDimension?.height).toBe(4.4); - expect(sizeDimension?.width).toBe(2.6); - expect(sizeDimension?.length).toBe(31); - }); - - it('should revert to global defaults if no specific values configured', async () => { - const sizeDimension = policy.getSizeDimension('STOS', 'EMPTYXX', ['TRKTRAC', 'LOGOWBK']); - expect(sizeDimension?.frontProjection).toBe(3); - expect(sizeDimension?.rearProjection).toBe(6.5); - expect(sizeDimension?.height).toBe(4.15); - expect(sizeDimension?.width).toBe(2.6); - expect(sizeDimension?.length).toBe(31); - }); - - it('should return default values if an unconfigured region is specified', async () => { - const sizeDimension = policy.getSizeDimension('STOS', 'EMPTYXX', ['TRKTRAC', 'JEEPSRG', 'STWHELR'], ['LMN']); - expect(sizeDimension?.height).toBe(4.88); - expect(sizeDimension?.width).toBe(3.2); - expect(sizeDimension?.length).toBe(27.5); - }); - - it('should return default values if an invalid region is specified', async () => { - const sizeDimension = policy.getSizeDimension('STOS', 'EMPTYXX', ['TRKTRAC', 'JEEPSRG', 'STWHELR'], ['_INVALID']); - expect(sizeDimension?.height).toBe(4.88); - expect(sizeDimension?.width).toBe(3.2); - expect(sizeDimension?.length).toBe(27.5); - }); - - it('should return null if an invalid permit type is specified', async () => { - const sizeDimension = policy.getSizeDimension('_INVALID', 'EMPTYXX', ['TRKTRAC', 'JEEPSRG', 'STWHELR']); - expect(sizeDimension).toBeNull(); + it('should throw an error if an invalid permit type is specified', async () => { + expect(() => { + policy.getSizeDimension('_INVALID', 'EMPTYXX', [ + 'TRKTRAC', + 'JEEPSRG', + 'STWHELR', + ]); + }).toThrow(); }); it('should return null if an invalid configuration is specified', async () => { - const sizeDimension = policy.getSizeDimension('STOS', 'EMPTYXX', ['_INVALID', 'JEEPSRG', 'STWHELR']); + const sizeDimension = policy.getSizeDimension('STOS', 'EMPTYXX', [ + '_INVALID', + 'JEEPSRG', + 'STWHELR', + ]); expect(sizeDimension).toBeNull(); }); it('should return null if no dimensionable trailer is specified', async () => { - const sizeDimension = policy.getSizeDimension('STOS', 'EMPTYXX', ['TRKTRAC', 'JEEPSRG']); + const sizeDimension = policy.getSizeDimension('STOS', 'EMPTYXX', [ + 'TRKTRAC', + 'JEEPSRG', + ]); expect(sizeDimension).toBeNull(); }); - it('should return null if an invalid commodity is specified', async () => { - const sizeDimension = policy.getSizeDimension('STOS', '_INVALID', ['TRKTRAC', 'JEEPSRG']); - expect(sizeDimension).toBeNull(); + it('should throw an error if an invalid commodity is specified', async () => { + expect(() => { + policy.getSizeDimension('STOS', '_INVALID', ['TRKTRAC', 'JEEPSRG']); + }).toThrow(); }); -}); \ No newline at end of file +}); diff --git a/policy-engine/src/_test/unit/utility.spec.ts b/policy-engine/src/_test/unit/utility.spec.ts index 148ea6cab..fc1e0a73e 100644 --- a/policy-engine/src/_test/unit/utility.spec.ts +++ b/policy-engine/src/_test/unit/utility.spec.ts @@ -18,22 +18,22 @@ describe('Permit Engine Utility Functions', () => { it('should return the correct number of commodities', async () => { const commodities: Map = policy.getCommodities(); - expect(commodities.size).toBe(12); + expect(commodities.size).toBe(5); }); it('should return the correct number of commodities for a single permit type', async () => { const commodities: Map = policy.getCommodities('STOS'); - expect(commodities.size).toBe(5); + expect(commodities.size).toBe(3); }); it('should return the correct number of power unit types', async () => { const powerUnitTypes: Map = policy.getPowerUnitTypes(); - expect(powerUnitTypes.size).toBe(3); + expect(powerUnitTypes.size).toBe(27); }); it('should return the correct number of trailer types', async () => { const trailerTypes: Map = policy.getTrailerTypes(); - expect(trailerTypes.size).toBe(17); + expect(trailerTypes.size).toBe(51); }); it('should return a TROS permit type', async () => { @@ -48,7 +48,3 @@ describe('Permit Engine Utility Functions', () => { expect(permitType).toBeNull(); }); }); - -describe('Permit Engine Utility Functions', () => { - const policy: Policy = new Policy(fiveTypes); -}); diff --git a/policy-engine/src/_test/unit/validation.spec.ts b/policy-engine/src/_test/unit/validation.spec.ts index ab5ca9435..c4ab0653f 100644 --- a/policy-engine/src/_test/unit/validation.spec.ts +++ b/policy-engine/src/_test/unit/validation.spec.ts @@ -1,14 +1,13 @@ import { Policy } from 'onroute-policy-engine'; import { trosOnly } from '../policy-config/tros-only.sample'; import { trosNoAllowedVehicles } from '../policy-config/tros-no-allowed-vehicles.sample'; -import { masterPolicyConfig } from '../policy-config/master.sample'; +import { completePolicyConfig } from '../policy-config/complete-in-progress.sample'; import { trosNoParamsSample } from '../policy-config/tros-no-params.sample'; +import { testStos } from '../permit-app/test-stos'; import { validTros30Day } from '../permit-app/valid-tros-30day'; import { validTrow120Day } from '../permit-app/valid-trow-120day'; import { allEventTypes } from '../policy-config/all-event-types.sample'; -import { transformPermitFacts } from '../../helper/facts.helper'; import dayjs from 'dayjs'; -import PermitApplication from '../permit-app/permit-application.type'; import { PermitAppInfo } from '../../enum/permit-app-info'; import { ValidationResultCode } from '../../enum/validation-result-code'; @@ -109,13 +108,13 @@ describe('Policy Engine Validator', () => { const validationResult = await policy.validate(permit); expect(validationResult.violations).toHaveLength(1); expect(validationResult.violations[0].fieldReference).toBe( - PermitAppInfo.CompanyName.toString(), + 'permitData.companyName', ); }); }); describe('Master Policy Configuration Validator', () => { - const policy: Policy = new Policy(masterPolicyConfig); + const policy: Policy = new Policy(completePolicyConfig); it('should validate TROS successfully', async () => { const permit = JSON.parse(JSON.stringify(validTros30Day)); @@ -138,6 +137,32 @@ describe('Master Policy Configuration Validator', () => { const validationResult = await policy.validate(permit); expect(validationResult.violations).toHaveLength(0); }); + + it('should validate STOS successfully', async () => { + const permit = JSON.parse(JSON.stringify(testStos)); + // Set startDate to today + permit.permitData.startDate = dayjs().format( + PermitAppInfo.PermitDateFormat.toString(), + ); + + const validationResult = await policy.validate(permit); + expect(validationResult.violations).toHaveLength(0); + }); + + it('should fail validation for STOS with invalid configuration', async () => { + const permit = JSON.parse(JSON.stringify(testStos)); + // Set startDate to today + permit.permitData.startDate = dayjs().format( + PermitAppInfo.PermitDateFormat.toString(), + ); + // Add an invalid trailer to the configuration list + permit.permitData.vehicleConfiguration.trailers.push({ + vehicleSubType: '_INVALID', + }); + + const validationResult = await policy.validate(permit); + expect(validationResult.violations).toHaveLength(1); + }); }); describe('Policy Configuration Missing Elements', () => { @@ -157,14 +182,6 @@ describe('Policy Configuration Missing Elements', () => { }); }); -describe('Permit Application Transformer', () => { - it('should return empty facts for null application', () => { - const nullApp: PermitApplication = JSON.parse('null'); - const permitFacts = transformPermitFacts(nullApp); - expect(permitFacts.companyName).toBeFalsy(); - }); -}); - describe('Permit Engine Validation Results Aggregator', () => { const policy: Policy = new Policy(allEventTypes); diff --git a/policy-engine/src/enum/accessory-vehicle-type.ts b/policy-engine/src/enum/accessory-vehicle-type.ts new file mode 100644 index 000000000..4ec6151a1 --- /dev/null +++ b/policy-engine/src/enum/accessory-vehicle-type.ts @@ -0,0 +1,4 @@ +export enum AccessoryVehicleType { + Booster = 'BOOSTER', + Jeep = 'JEEPSRG', +} diff --git a/policy-engine/src/enum/facts.ts b/policy-engine/src/enum/facts.ts index 0172e4e41..7b3765632 100644 --- a/policy-engine/src/enum/facts.ts +++ b/policy-engine/src/enum/facts.ts @@ -5,4 +5,5 @@ export enum PolicyFacts { FixedCost = 'fixedCost', CostPerMonth = 'costPerMonth', RangeMatrixCostLookup = 'rangeMatrixCostLookup', + ConfigurationIsValid = 'configurationIsValid', } diff --git a/policy-engine/src/enum/index.ts b/policy-engine/src/enum/index.ts index e4c5453d9..ce8278efd 100644 --- a/policy-engine/src/enum/index.ts +++ b/policy-engine/src/enum/index.ts @@ -1,5 +1,7 @@ +export { AccessoryVehicleType } from './accessory-vehicle-type'; export { PolicyFacts } from './facts'; export { PermitAppInfo } from './permit-app-info'; export { RelativePosition } from './relative-position'; export { ValidationResultCode } from './validation-result-code'; export { ValidationResultType } from './validation-result-type'; +export { VehicleTypes } from './vehicle-types'; diff --git a/policy-engine/src/enum/permit-app-info.ts b/policy-engine/src/enum/permit-app-info.ts index cf6d33691..bcea9a542 100644 --- a/policy-engine/src/enum/permit-app-info.ts +++ b/policy-engine/src/enum/permit-app-info.ts @@ -4,8 +4,13 @@ * referenced from within source code. */ export enum PermitAppInfo { - PermitStartDate = 'permitData.startDate', + PermitType = 'permitType', + PermitData = 'permitData', + PermitStartDate = '$.startDate', PermitDateFormat = 'YYYY-MM-DD', - CompanyName = 'permitData.companyName', - PermitDuration = 'permitData.permitDuration', + CompanyName = '$.companyName', + PermitDuration = '$.permitDuration', + PowerUnitType = '$.vehicleDetails.vehicleSubType', + TrailerList = '$.vehicleConfiguration.trailers', + Commodity = '$.permittedCommodity', } diff --git a/policy-engine/src/enum/vehicle-types.ts b/policy-engine/src/enum/vehicle-types.ts new file mode 100644 index 000000000..1a87b0800 --- /dev/null +++ b/policy-engine/src/enum/vehicle-types.ts @@ -0,0 +1,4 @@ +export enum VehicleTypes { + PowerUnits = 'powerUnits', + Trailers = 'trailers', +} diff --git a/policy-engine/src/helper/facts.helper.ts b/policy-engine/src/helper/facts.helper.ts index ab9c3f260..352dddbec 100644 --- a/policy-engine/src/helper/facts.helper.ts +++ b/policy-engine/src/helper/facts.helper.ts @@ -1,19 +1,16 @@ import dayjs from 'dayjs'; import { Engine } from 'json-rules-engine'; -import { flattie } from 'flattie'; -import { PermitFacts } from 'onroute-policy-engine/types'; import { PermitAppInfo, PolicyFacts } from 'onroute-policy-engine/enum'; +import { Policy } from '../policy-engine'; /** * Adds runtime facts for the validation. For example, adds the * validation date for comparison against startDate of the permit. * @param engine json-rules-engine Engine instance to add facts to. */ -export function addRuntimeFacts(engine: Engine): void { - const today: string = dayjs().format( - PermitAppInfo.PermitDateFormat.toString(), - ); - engine.addFact(PolicyFacts.ValidationDate.toString(), today); +export function addRuntimeFacts(engine: Engine, policy: Policy): void { + const today: string = dayjs().format(PermitAppInfo.PermitDateFormat); + engine.addFact(PolicyFacts.ValidationDate, today); /** * Add runtime fact for number of days in the permit year. @@ -21,31 +18,74 @@ export function addRuntimeFacts(engine: Engine): void { * duration for 1 year permits. */ engine.addFact( - PolicyFacts.DaysInPermitYear.toString(), + PolicyFacts.DaysInPermitYear, async function (params, almanac) { const startDate: string = await almanac.factValue( - PermitAppInfo.PermitStartDate.toString(), - ); - const dateFrom = dayjs( - startDate, - PermitAppInfo.PermitDateFormat.toString(), + PermitAppInfo.PermitData, + {}, + PermitAppInfo.PermitStartDate, ); + const dateFrom = dayjs(startDate, PermitAppInfo.PermitDateFormat); const daysInPermitYear = dateFrom.add(1, 'year').diff(dateFrom, 'day'); return daysInPermitYear; }, ); /** - * Add runtime fact for a fixed permit cost, the cost supplied - * as a parameter. + * Adds a runtime fact specifying whether the vehicle configuration + * in the permit application is valid for the permit type and + * commodity. Will return true or false. */ engine.addFact( - PolicyFacts.FixedCost.toString(), + PolicyFacts.ConfigurationIsValid.toString(), async function (params, almanac) { - return params.cost; + const powerUnit: string = await almanac.factValue( + PermitAppInfo.PermitData, + {}, + PermitAppInfo.PowerUnitType, + ); + const trailerList: Array = await almanac.factValue( + PermitAppInfo.PermitData, + {}, + PermitAppInfo.TrailerList, + ); + let fullVehicleConfiguration = []; + fullVehicleConfiguration.push(powerUnit); + fullVehicleConfiguration = fullVehicleConfiguration.concat( + trailerList.map((t) => t.vehicleSubType), + ); + + const permitType: string = await almanac.factValue( + PermitAppInfo.PermitType, + ); + const commodity: string = await almanac.factValue( + PermitAppInfo.PermitData, + {}, + PermitAppInfo.Commodity, + ); + let isValid: boolean; + try { + isValid = policy.isConfigurationValid( + permitType, + commodity, + fullVehicleConfiguration, + ); + } catch (e) { + console.log(`Error validating vehicle configuration: '{e.message}'`); + isValid = false; + } + return isValid; }, ); + /** + * Add runtime fact for a fixed permit cost, the cost supplied + * as a parameter. + */ + engine.addFact(PolicyFacts.FixedCost.toString(), async function (params) { + return params.cost; + }); + /** * Add runtime fact for cost per month, where month is defined by * policy as a 30 day period or portion thereof, except in the @@ -55,7 +95,9 @@ export function addRuntimeFacts(engine: Engine): void { PolicyFacts.CostPerMonth.toString(), async function (params, almanac) { const duration: number = await almanac.factValue( - PermitAppInfo.PermitDuration.toString(), + PermitAppInfo.PermitData, + {}, + PermitAppInfo.PermitDuration, ); const daysInPermitYear: number = await almanac.factValue( PolicyFacts.DaysInPermitYear.toString(), @@ -76,20 +118,3 @@ export function addRuntimeFacts(engine: Engine): void { }, ); } - -/** - * Flattens the permit application, using keys taken from the PermitFacts enum so - * the facts can be used more easily within validation rules. - * @param permitApplication Permit application object to flatten. - * @returns Flattened permit application object for validation. - */ -export function transformPermitFacts(permitApplication: any): PermitFacts { - // Flatten the permit application so all properties can be accessed - // by key - const permitFacts: PermitFacts = flattie(permitApplication); - - // Add the app itself as a fact to be used by more complex rules - permitFacts.app = permitApplication; - - return permitFacts; -} diff --git a/policy-engine/src/helper/lists.helper.ts b/policy-engine/src/helper/lists.helper.ts index 381e583e5..aa927850c 100644 --- a/policy-engine/src/helper/lists.helper.ts +++ b/policy-engine/src/helper/lists.helper.ts @@ -21,3 +21,41 @@ export function extractIdentifiedObjects( }); return objectMap; } + +/** + * Intersects two maps containing string id and string description to + * return a new map containing those entries common to both. + * This only checks that the keys are common, not the values. If the + * values are different, this returns the value from the first map. + * If any values in the first map are null or undefined, these will + * be replaced with empty string. + * @param first The first map + * @param second The second map + * @returns New map containing entries common to both input maps + */ +export function intersectIdMaps( + first: Map, + second: Map, +): Map { + const combinedMap = new Map(); + for (const key in first.keys()) { + if (second.has(key)) { + combinedMap.set(key, first.get(key) ?? ''); + } + } + return combinedMap; +} + +export function getIdFromName( + list: Array, + name: string, +): string | null { + let id: string | null = null; + + const identifiedObject = list.find((i) => i.name == name); + if (identifiedObject) { + id = identifiedObject.id; + } + + return id; +} diff --git a/policy-engine/src/helper/rules-engine.helper.ts b/policy-engine/src/helper/rules-engine.helper.ts index dcfdf683c..951964732 100644 --- a/policy-engine/src/helper/rules-engine.helper.ts +++ b/policy-engine/src/helper/rules-engine.helper.ts @@ -11,7 +11,10 @@ import { PolicyFacts } from 'onroute-policy-engine/enum'; * @returns json-rules-engine Engine instance. */ function getEngine(policyDefinition: PolicyDefinition): Engine { - const engine = new Engine([], { replaceFactsInEventParams: true }); + const engine = new Engine([], { + replaceFactsInEventParams: true, + allowUndefinedFacts: true, + }); CustomOperators.forEach((o) => engine.addOperator(o)); policyDefinition.commonRules.forEach((r) => engine.addRule(r)); return engine; diff --git a/policy-engine/src/policy-engine.ts b/policy-engine/src/policy-engine.ts index 662b753b5..98ed82270 100644 --- a/policy-engine/src/policy-engine.ts +++ b/policy-engine/src/policy-engine.ts @@ -2,22 +2,26 @@ import { PolicyDefinition, PermitType, Commodity, - Vehicle, VehicleType, SizeDimension, - Trailer, RegionSizeOverride, + TrailerSize, } from 'onroute-policy-engine/types'; -import { extractIdentifiedObjects } from './helper/lists.helper'; +import { + extractIdentifiedObjects, + intersectIdMaps, +} from './helper/lists.helper'; import { Engine, EngineResult } from 'json-rules-engine'; import { getRulesEngines } from './helper/rules-engine.helper'; import { ValidationResults } from './validation-results'; import { ValidationResult } from './validation-result'; -import { addRuntimeFacts, transformPermitFacts } from './helper/facts.helper'; +import { addRuntimeFacts } from './helper/facts.helper'; import { + AccessoryVehicleType, ValidationResultType, ValidationResultCode, RelativePosition, + VehicleTypes, } from 'onroute-policy-engine/enum'; /** Class representing commercial vehicle policy. */ @@ -65,12 +69,10 @@ export class Policy { } else { // Add facts specific to this run of the validation (e.g. validation // date for comparison against start date of the permit). - addRuntimeFacts(engine); - - const permitFacts = transformPermitFacts(permit); + addRuntimeFacts(engine, this); // Run the json-rules-engine against the permit facts - const engineResult: EngineResult = await engine.run(permitFacts); + const engineResult: EngineResult = await engine.run(permit); // Wrap the json-rules-engine result in a ValidationResult object return new ValidationResults(engineResult); @@ -103,92 +105,188 @@ export class Policy { * Gets a list of all configured commodities in the policy definition. * @param permitTypeId Return only commodities valid for this permit type. * If not supplied, return all commodities configured in policy. If permit - * type does not require commodity (e.g. 'TROS'), return all commodities. + * type does not require commodity (e.g. 'TROS'), return empty map. * @returns Map of commodity IDs to commodity names. */ getCommodities(permitTypeId?: string): Map { const permitType = this.getPermitTypeDefinition(permitTypeId); - const commodities = extractIdentifiedObjects( - this.policyDefinition.commodities, - permitType?.allowedCommodities, - ); - return commodities; - } - - /** - * Gets a list of all allowable power unit types for the given permit type - * and commodity. - * @param permitTypeId ID of the permit type to get power units for - * @param commodityId ID of the commodity to get power units for - * @returns Map of power unit IDs to power unit names. - */ - getPermittablePowerUnitTypes( - permitTypeId: string, - commodityId: string, - ): Map { - let puTypes = new Map(); - if (permitTypeId && commodityId) { - const permitType = this.getPermitTypeDefinition(permitTypeId); - if (permitType) { - if (permitType.commodityRequired) { - // If commodity is not required, this method cannot calculate the - // permittable power unit types since they will not be configured. - const allowableCommodities = this.getCommodities(permitTypeId); - if (allowableCommodities.has(commodityId)) { - // If the commodity is not allowed for the permit type, no power - // units are allowed. - const commodity = this.getCommodityDefinition(commodityId); - if (commodity) { - // If commodity is null, this indicates a configuration error. - const puTypeIds: Array | undefined = - commodity.powerUnits?.map((p) => p.type); - puTypes = extractIdentifiedObjects( - this.policyDefinition.vehicleTypes.powerUnitTypes, - puTypeIds, - ); + if (!permitTypeId) { + // Permit type not supplied, return all commodities + return extractIdentifiedObjects(this.policyDefinition.commodities); + } else if (!permitType) { + // Permit type invalid, throw error + throw new Error(`Invalid permit type supplied: '${permitTypeId}'`); + } else if (!permitType.commodityRequired) { + return new Map(); + } else { + // Commodities for oversize permits are those which have at least one + // power unit defined in the size dimension object of the commodity. + const commoditiesForOS = extractIdentifiedObjects( + this.policyDefinition.commodities.filter((c) => { + if (c.size) { + if (c.size.powerUnits) { + if (c.size.powerUnits.length > 0) { + return true; + } } } - } + return false; + }), + permitType.allowedCommodities, + ); + + // TODO when implementing overweight. Stub for now. + const commoditiesForOW: Map = new Map(); + + if ( + permitType.sizeDimensionRequired && + permitType.weightDimensionRequired + ) { + return intersectIdMaps(commoditiesForOS, commoditiesForOW); + } else if (permitType.sizeDimensionRequired) { + return commoditiesForOS; + } else if (permitType.weightDimensionRequired) { + return commoditiesForOW; + } else { + // This permit type requires commodity selection, but does not + // require size or weight dimensions. For these permit types, the + // allowedCommodities must be configured in policy. Return these. + const commodities = extractIdentifiedObjects( + this.policyDefinition.commodities, + permitType.allowedCommodities, + ); + return commodities; } } - return puTypes; } /** - * Gets a list of all configured vehicles for the given permit type and commodity. - * Includes both power units and trailers in a single return value. + * Gets a list of all allowable vehicle types for the given permit type + * and commodity. Includes all power units and trailers. * @param permitTypeId ID of the permit type to get vehicles for * @param commodityId ID of the commodity to get vehicles for - * @returns Array of vehicle objects for the permit type and commodityId + * @returns Map of two separate maps, one keyed on 'powerUnits' and the + * other keyed on 'trailers'. Each map consists of a string id for the + * vehicle, and a string common name for the vehicle. */ - getAllVehiclesForCommodity( + getPermittableVehicleTypes( permitTypeId: string, commodityId: string, - ): Array { - let vehicles: Array = new Array(); - if (permitTypeId && commodityId) { - const permitType = this.getPermitTypeDefinition(permitTypeId); - if (permitType) { - if (permitType.commodityRequired) { - const allowableCommodities = this.getCommodities(permitTypeId); - if (allowableCommodities.has(commodityId)) { - const commodity = this.getCommodityDefinition(commodityId); - if (commodity) { - let pu: Array | undefined = commodity.powerUnits; - if (!pu) { - pu = new Array(); - } - let tr: Array | undefined = commodity.trailers; - if (!tr) { - tr = new Array(); - } - vehicles = pu.concat(tr); - } - } - } + ): Map> { + if (!permitTypeId || !commodityId) { + throw new Error('Missing permitTypeId and/or commodityId'); + } + + const permitType = this.getPermitTypeDefinition(permitTypeId); + if (!permitType) { + throw new Error(`Invalid permit type: '${permitTypeId}'`); + } + + if (!permitType.commodityRequired) { + // If commodity is not required, this method cannot calculate the + // permittable vehicle types since they will not be configured. + throw new Error( + `Permit type '${permitTypeId}' does not require a commodity`, + ); + } + + let puTypes: Map; + let trTypes: Map; + const allowableCommodities = this.getCommodities(permitTypeId); + + if (!allowableCommodities.has(commodityId)) { + // If the commodity is not allowed for the permit type, no power + // units or trailers are allowed. + puTypes = new Map(); + trTypes = new Map(); + } else { + const commodity = this.getCommodityDefinition(commodityId); + if (!commodity) { + throw new Error( + `Commodity id '${commodityId}' is not correctly configured in the policy definition`, + ); + } + + const puTypeIdsOS: Array | undefined = + commodity.size?.powerUnits?.map((p) => p.type); + const trTypeIdsOS: Array | undefined = []; + commodity.size?.powerUnits?.forEach((pu) => { + const trForPu = pu.trailers.map((t) => t.type); + if (trForPu) trTypeIdsOS.concat(trForPu); + }); + // TODO: implement along with overweight permits. Stub for now. + const puTypeIdsOW: Array = []; + const trTypeIdsOW: Array = []; + + const puTypesOS = extractIdentifiedObjects( + this.policyDefinition.vehicleTypes.powerUnitTypes, + puTypeIdsOS, + ); + const trTypesOS = extractIdentifiedObjects( + this.policyDefinition.vehicleTypes.trailerTypes, + trTypeIdsOS, + ); + const puTypesOW = extractIdentifiedObjects( + this.policyDefinition.vehicleTypes.powerUnitTypes, + puTypeIdsOW, + ); + const trTypesOW = extractIdentifiedObjects( + this.policyDefinition.vehicleTypes.trailerTypes, + trTypeIdsOW, + ); + + if ( + permitType.sizeDimensionRequired && + permitType.weightDimensionRequired + ) { + puTypes = intersectIdMaps(puTypesOS, puTypesOW); + trTypes = intersectIdMaps(trTypesOS, trTypesOW); + } else if (permitType.sizeDimensionRequired) { + puTypes = puTypesOS; + trTypes = trTypesOS; + } else if (permitType.weightDimensionRequired) { + puTypes = puTypesOW; + trTypes = trTypesOW; + } else { + // This permit type requires commodity selection, but does not + // require size or weight dimensions. For these permit types, the + // allowedVehicles must be configured in policy. Return all power + // units and trailers from this list. + puTypes = extractIdentifiedObjects( + this.policyDefinition.vehicleTypes.powerUnitTypes, + permitType.allowedVehicles, + ); + trTypes = extractIdentifiedObjects( + this.policyDefinition.vehicleTypes.trailerTypes, + permitType.allowedVehicles, + ); } } - return vehicles; + + const vehicleTypes = new Map>(); + vehicleTypes.set(VehicleTypes.PowerUnits, puTypes); + vehicleTypes.set(VehicleTypes.Trailers, trTypes); + + return vehicleTypes; + } + + /** + * Gets a list of all allowable power unit types for the given permit type + * and commodity. + * @param permitTypeId ID of the permit type to get power units for + * @param commodityId ID of the commodity to get power units for + * @returns Map of power unit IDs to power unit names. + */ + getPermittablePowerUnitTypes( + permitTypeId: string, + commodityId: string, + ): Map { + const vehicleTypes = this.getPermittableVehicleTypes( + permitTypeId, + commodityId, + ); + const puTypes = vehicleTypes.get(VehicleTypes.PowerUnits); + return puTypes ?? new Map(); } /** @@ -209,32 +307,100 @@ export class Policy { commodityId: string, currentConfiguration: Array, ): Map { + if (!permitTypeId || !commodityId || !currentConfiguration) { + throw new Error( + 'Missing permitTypeId and/or commodityId and/or currentConfiguration', + ); + } + + const permitType = this.getPermitTypeDefinition(permitTypeId); + if (!permitType) { + throw new Error(`Invalid permit type: '${permitTypeId}'`); + } + + if (!permitType.commodityRequired) { + // If commodity is not required, this method cannot calculate the + // permittable vehicle types since they will not be configured. + throw new Error( + `Permit type '${permitTypeId}' does not require a commodity`, + ); + } + + const commodity = this.getCommodityDefinition(commodityId); + if (!commodity) { + throw new Error(`Invalid commodity type: '${commodityId}'`); + } + + if ( + !this.isConfigurationValid( + permitTypeId, + commodityId, + currentConfiguration, + true, + ) + ) { + // Invalid configuration, no vehicles permitted + return new Map(); + } + let vehicleTypes = new Map(); - if (permitTypeId && commodityId && currentConfiguration) { - const allVehiclesForCommodity: Array = - this.getAllVehiclesForCommodity(permitTypeId, commodityId); - if (allVehiclesForCommodity.length > 0) { - let vehicleTypeIds: Array; - if (currentConfiguration.length == 0) { - // If the current configuration has no vehicles, return only those vehicles - // that have an empty canFollow array (typically power units). - vehicleTypeIds = allVehiclesForCommodity - .filter((v) => v.canFollow.length == 0) - .map((v) => v.type); - } else { - const lastVehicleType = - currentConfiguration[currentConfiguration.length - 1]; - vehicleTypeIds = allVehiclesForCommodity - .filter((v) => v.canFollow.includes(lastVehicleType)) - .map((v) => v.type); + let vehicleTypeIds: Array | undefined; + const allVehicles: Array = + this.policyDefinition.vehicleTypes.powerUnitTypes.concat( + this.policyDefinition.vehicleTypes.trailerTypes, + ); + + if (currentConfiguration.length == 0) { + // The current configuration is empty, so return only the + // allowable power units. + vehicleTypeIds = commodity.size?.powerUnits?.map((p) => p.type); + } else { + const powerUnit = commodity.size?.powerUnits?.find( + (p) => p.type == currentConfiguration[0], + ); + const trailerIds = powerUnit?.trailers.map((t) => t.type); + if (currentConfiguration.length == 1) { + // Just a power unit, return the list of trailerIds for the + // power unit, plus jeep if any of the trailer Ids allow + // a jeep. + if ( + powerUnit?.trailers && + powerUnit?.trailers.filter((t) => t.jeep).length > 0 + ) { + trailerIds?.push(AccessoryVehicleType.Jeep); + } + vehicleTypeIds = trailerIds; + } else { + const lastVehicleId = + currentConfiguration[currentConfiguration.length - 1]; + switch (lastVehicleId) { + case AccessoryVehicleType.Jeep: + // If there is one jeep, there can be more + trailerIds?.push(AccessoryVehicleType.Jeep); + vehicleTypeIds = trailerIds; + break; + case AccessoryVehicleType.Booster: + // If there is one booster, there can be more + vehicleTypeIds = [AccessoryVehicleType.Booster]; + break; + default: + { + const trailer = powerUnit?.trailers.find( + (t) => t.type == lastVehicleId, + ); + if (trailer && trailer.booster) { + vehicleTypeIds = [AccessoryVehicleType.Booster]; + } else { + vehicleTypeIds = new Array(); + } + } + break; } - const allVehicles: Array = - this.policyDefinition.vehicleTypes.powerUnitTypes.concat( - this.policyDefinition.vehicleTypes.trailerTypes, - ); - vehicleTypes = extractIdentifiedObjects(allVehicles, vehicleTypeIds); } } + + vehicleTypes = extractIdentifiedObjects(allVehicles, vehicleTypeIds); + return vehicleTypes; } @@ -249,53 +415,99 @@ export class Policy { * @param permitTypeId ID of the permit type to validate the configuration against * @param commodityId ID of the commodity used for the configuration * @param currentConfiguration Current vehicle configuration to validate + * @param validatePartial Whether to validate a partial configuration (e.g. one + * that does not include a trailer). This will just return whether or not there + * are any invalid vehicles in the configuration. If true, an empty current + * configuration will return true from this method. */ isConfigurationValid( permitTypeId: string, commodityId: string, currentConfiguration: Array, + validatePartial: boolean = false, ): boolean { - let isValid: boolean = false; + if (!permitTypeId || !commodityId || !currentConfiguration) { + throw new Error( + 'Missing permitTypeId and/or commodityId and/or currentConfiguration', + ); + } - const runningConfig: Array = new Array(); - for (let i = 0; i < currentConfiguration.length; i++) { - // Note getNextPermittableVehicles will always return an empty map if either the - // permit type or commodity is invalid - const nextVehicles: Map = this.getNextPermittableVehicles( - permitTypeId, - commodityId, - runningConfig, + const permitType = this.getPermitTypeDefinition(permitTypeId); + if (!permitType) { + throw new Error(`Invalid permit type: '${permitTypeId}'`); + } + + if (!permitType.commodityRequired) { + // If commodity is not required, this method cannot calculate the + // permittable vehicle types since they will not be configured. + throw new Error( + `Permit type '${permitTypeId}' does not require a commodity`, ); - if (nextVehicles.has(currentConfiguration[i])) { - // The next vehicle in the configuration is permittable as per policy - runningConfig.push(currentConfiguration[i]); - const permitType = this.getPermitTypeDefinition(permitTypeId); - if (permitType?.sizeDimensionRequired) { - // Size dimension is required for this permit type, so we need to - // flip the isValid flag only if we find a trailer that counts - // for size dimensions - const vehicleType = - this.policyDefinition.vehicleTypes.trailerTypes?.find( - (v) => v.id == currentConfiguration[i], + } + + const commodity = this.getCommodityDefinition(commodityId); + if (!commodity) { + throw new Error(`Invalid commodity type: '${commodityId}'`); + } + + if (currentConfiguration.length == 0) { + // The current configuration is empty. Fine for partial, but + // invalid as a complete configuration. + return validatePartial; + } + + const powerUnit = commodity.size?.powerUnits?.find( + (p) => p.type == currentConfiguration[0], + ); + if (!powerUnit) { + // The power unit is not allowed for the commodity + return false; + } + + let trailerIds = powerUnit.trailers.map((t) => t.type); + let jeepAllowed: boolean = true; + let trailerAllowed: boolean = true; + let boosterAllowed: boolean = false; + + for (let i = 1; i < currentConfiguration.length; i++) { + switch (currentConfiguration[i]) { + case AccessoryVehicleType.Jeep: + if (!jeepAllowed) { + return false; + } + // Filter allowed trailers to only those that allow jeeps + trailerIds = powerUnit.trailers + .filter((t) => t.jeep) + .map((t) => t.type); + break; + case AccessoryVehicleType.Booster: + if (!boosterAllowed) { + return false; + } + break; + default: + if (!trailerAllowed) { + return false; + } + { + const trailer = powerUnit.trailers.find( + (t) => t.type == currentConfiguration[i], ); - if (vehicleType) { - if (!vehicleType.ignoreForSizeDimensions) { - isValid = true; + if (!trailer || !trailerIds.includes(currentConfiguration[i])) { + // This trailer is not permitted for this power unit + return false; } + jeepAllowed = false; + trailerAllowed = false; + boosterAllowed = trailer.booster; } - } else { - // Size dimensions are not required for this permit type, so there are - // no requirements with respect to what trailers are permitted. - isValid = true; - } - } else { - // The next vehicle in the list is not permittable, or there are no - // permittable vehicles at all in the list. - isValid = false; - break; + break; } } - return isValid; + // We are still here, so configuration is valid. If there is a trailer + // it is a valid final configuration, otherwise it is a valid partial + // configuration. + return !trailerAllowed || validatePartial; } /** @@ -324,9 +536,18 @@ export class Policy { let sizeDimension: SizeDimension | null = null; // Validate that the configuration is permittable - if ( - this.isConfigurationValid(permitTypeId, commodityId, configuration) - ) { + if (this.isConfigurationValid(permitTypeId, commodityId, configuration)) { + // Get the power unit that has the size configuration + const commodity = this.getCommodityDefinition(commodityId); + const powerUnit = commodity?.size?.powerUnits?.find( + (pu) => pu.type == configuration[0], + ); + if (!powerUnit) { + throw new Error( + `Configuration error: could not find power unit '${configuration[0]}'`, + ); + } + // Get the last trailer in the configuration that can be used for size calculations const sizeTrailer: string | undefined = Array.from(configuration) .reverse() @@ -340,11 +561,12 @@ export class Policy { if (sizeTrailer) { // Get the trailer size dimension array for the commodity - const commodity = this.getCommodityDefinition(commodityId); - const trailer: Trailer | undefined = commodity?.trailers?.find( + const trailer: TrailerSize | undefined = powerUnit.trailers?.find( (t) => t.type == sizeTrailer, ); + let sizeDimensions: Array; + if ( trailer && trailer.sizeDimensions && @@ -355,21 +577,11 @@ export class Policy { sizeDimensions = new Array(); } - let sizeDimensionConfigured: SizeDimension | null = null; - if (sizeDimensions.length == 0) { - // If there are no dimensions configured but the configuration is still - // valid, we inherit the size dimensions from the global defaults. - sizeDimensionConfigured = this.policyDefinition.globalSizeDefaults; - } else if (sizeDimensions.length == 1) { - sizeDimensionConfigured = sizeDimensions[0]; - } else { - // If multiple size dimensions, select the first one matching all modifiers - sizeDimensionConfigured = this.selectCorrectSizeDimension( - sizeDimensions, - configuration, - sizeTrailer, - ); - } + const sizeDimensionConfigured = this.selectCorrectSizeDimension( + sizeDimensions, + configuration, + sizeTrailer, + ); if (sizeDimensionConfigured) { // Adjust the size dimensions for the regions travelled, if needed @@ -380,32 +592,33 @@ export class Policy { console.log('Assuming all regions for size dimension lookup'); regions = this.policyDefinition.geographicRegions.map((g) => g.id); } else { - console.log('Using ' + regions + ' as regions for size lookup'); + console.log(`Using '${regions}' as regions for size lookup`); } const valueOverrides: Array = []; regions?.forEach((r) => { let valueOverride: RegionSizeOverride; // Check to see if this region has specific size dimensions - let regionOverride = sizeDimensionConfigured.regions?.find((cr) => cr.region == r); + const regionOverride = sizeDimensionConfigured.regions?.find( + (cr) => cr.region == r, + ); if (!regionOverride) { // The region travelled does not have an override, so it assumes - // the dimensions of the base size dimension configured. + // the dimensions of the bc default. valueOverride = { region: r, - height: sizeDimensionConfigured.height ?? this.policyDefinition.globalSizeDefaults.height ?? 0, - width: sizeDimensionConfigured.width ?? this.policyDefinition.globalSizeDefaults.width ?? 0, - length: sizeDimensionConfigured.length ?? this.policyDefinition.globalSizeDefaults.length ?? 0, - } + h: sizeDimensionConfigured.h, + w: sizeDimensionConfigured.w, + l: sizeDimensionConfigured.l, + }; } else { // There is a region override with one or more dimensions. Use this - // value preferentially, using base dimension and global default in - // descending order of preference. + // value preferentially, using default dimension if not supplied valueOverride = { region: r, - height: regionOverride.height ?? sizeDimensionConfigured.height ?? this.policyDefinition.globalSizeDefaults.height ?? 0, - width: regionOverride.width ?? sizeDimensionConfigured.width ?? this.policyDefinition.globalSizeDefaults.width ?? 0, - length: regionOverride.length ?? sizeDimensionConfigured.length ?? this.policyDefinition.globalSizeDefaults.length ?? 0, - } + h: regionOverride.h ?? sizeDimensionConfigured.h, + w: regionOverride.w ?? sizeDimensionConfigured.w, + l: regionOverride.l ?? sizeDimensionConfigured.l, + }; } valueOverrides.push(valueOverride); }); @@ -413,31 +626,41 @@ export class Policy { // At this point we have a complete set of size dimensions for each of // the regions that will be traversed. Take the minimum value of each // dimension for the final value. - const minimumOverrides = valueOverrides.reduce((accumulator, currentValue) => { - - if (typeof accumulator.height === 'undefined') { - accumulator.height = currentValue.height ?? 0; - } - if (typeof accumulator.width === 'undefined') { - accumulator.width = currentValue.width ?? 0; - } - if (typeof accumulator.length === 'undefined') { - accumulator.length = currentValue.length ?? 0; - } - - accumulator.height = Math.min(accumulator.height, currentValue.height ?? 0); - accumulator.width = Math.min(accumulator.width, currentValue.width ?? 0); - accumulator.length = Math.min(accumulator.length, currentValue.length ?? 0); - return accumulator; - }, { 'region': '' }); + const minimumOverrides = valueOverrides.reduce( + (accumulator, currentValue) => { + if (typeof currentValue.h !== 'undefined') { + if (typeof accumulator.h === 'undefined') { + accumulator.h = currentValue.h; + } else { + accumulator.h = Math.min(accumulator.h, currentValue.h); + } + } + if (typeof currentValue.w !== 'undefined') { + if (typeof accumulator.w === 'undefined') { + accumulator.w = currentValue.w; + } else { + accumulator.w = Math.min(accumulator.w, currentValue.w); + } + } + if (typeof currentValue.l !== 'undefined') { + if (typeof accumulator.l === 'undefined') { + accumulator.l = currentValue.l; + } else { + accumulator.l = Math.min(accumulator.l, currentValue.l); + } + } + return accumulator; + }, + { region: '' }, + ); sizeDimension = { - rearProjection: sizeDimensionConfigured.rearProjection ?? this.policyDefinition.globalSizeDefaults.rearProjection, - frontProjection: sizeDimensionConfigured.frontProjection ?? this.policyDefinition.globalSizeDefaults.frontProjection, - height: minimumOverrides.height ?? sizeDimensionConfigured.height ?? this.policyDefinition.globalSizeDefaults.height, - width: minimumOverrides.width ?? sizeDimensionConfigured.width ?? this.policyDefinition.globalSizeDefaults.width, - length: minimumOverrides.length ?? sizeDimensionConfigured.length ?? this.policyDefinition.globalSizeDefaults.length, - } + rp: sizeDimensionConfigured.rp, + fp: sizeDimensionConfigured.fp, + h: minimumOverrides.h, + w: minimumOverrides.w, + l: minimumOverrides.l, + }; } else { console.log('Size dimension not configured for trailer'); } @@ -465,19 +688,18 @@ export class Policy { ): SizeDimension | null { let matchingDimension: SizeDimension | null = null; - if ( - sizeDimensions?.length > 0 && - configuration?.length > 0 - ) { - for (let i = 0; i < sizeDimensions.length; i++) { - if (!sizeDimensions[i].modifiers) { + if (sizeDimensions?.length > 0 && configuration?.length > 0) { + for (const sizeDimension of sizeDimensions) { + if (!sizeDimension.modifiers) { // This dimension has no modifiers, so it is the default if none of // the other specific modifiers match. - matchingDimension = sizeDimensions[i]; + matchingDimension = sizeDimension; console.log('Using default size dimension, no modifiers specified'); } else { - const sizeTrailerIndex = configuration.findIndex((c) => sizeTrailer == c); - const isMatch: boolean | undefined = sizeDimensions[i].modifiers?.every( + const sizeTrailerIndex = configuration.findIndex( + (c) => sizeTrailer == c, + ); + const isMatch: boolean | undefined = sizeDimension.modifiers?.every( (m) => { if (!m.type) { return false; @@ -499,13 +721,15 @@ export class Policy { // As soon as we find a dimension with matching modifiers, // set it and return it. if (isMatch) { - matchingDimension = sizeDimensions[i]; + matchingDimension = sizeDimension; break; } } } } else { - console.log('Either size dimensions or configuration array is null, no matching dimension returned'); + console.log( + 'Either size dimensions or configuration array is null, no matching dimension returned', + ); } return matchingDimension; } diff --git a/policy-engine/src/rule-operator/custom-operators.ts b/policy-engine/src/rule-operator/custom-operators.ts index d92cfb634..297c38726 100644 --- a/policy-engine/src/rule-operator/custom-operators.ts +++ b/policy-engine/src/rule-operator/custom-operators.ts @@ -16,7 +16,11 @@ const CustomOperators: Array = []; CustomOperators.push( new Operator( 'stringMinimumLength', - (a: string, b: number) => a.trim().length >= b, + (a: string, b: number) => { + if (!a) return false; + + return a.trim().length >= b; + }, stringValidator, ), ); diff --git a/policy-engine/src/types/commodity.ts b/policy-engine/src/types/commodity.ts index e5e8ef0f7..b5bbd8ca2 100644 --- a/policy-engine/src/types/commodity.ts +++ b/policy-engine/src/types/commodity.ts @@ -1,10 +1,20 @@ import { IdentifiedObject, - PowerUnit, - Trailer, + VehicleSizeConfiguration, + PowerUnitWeight, + TrailerWeight, } from 'onroute-policy-engine/types'; export type Commodity = IdentifiedObject & { - powerUnits?: Array; - trailers?: Array; + size?: CommoditySize; + weight?: CommodityWeight; +}; + +export type CommoditySize = { + powerUnits?: Array; +}; + +export type CommodityWeight = { + powerUnits?: Array; + trailers?: Array; }; diff --git a/policy-engine/src/types/index.ts b/policy-engine/src/types/index.ts index b8591eaee..2dc59cd8f 100644 --- a/policy-engine/src/types/index.ts +++ b/policy-engine/src/types/index.ts @@ -1,4 +1,4 @@ -export { Commodity } from './commodity'; +export { Commodity, CommoditySize, CommodityWeight } from './commodity'; export { CostRule } from './cost-rule'; export { DimensionModifier } from './dimension-modifier'; export { PermitFacts } from './facts'; @@ -22,7 +22,13 @@ export { TrailerType, VehicleTypes, } from './vehicle-type'; -export { Vehicle, PowerUnit, Trailer } from './vehicle'; +export { + Vehicle, + VehicleSizeConfiguration, + TrailerSize, + PowerUnitWeight, + TrailerWeight, +} from './vehicle'; export { WeightDimension, PowerUnitWeightDimension, diff --git a/policy-engine/src/types/region-size-override.ts b/policy-engine/src/types/region-size-override.ts index f1f6a7b10..92c17e028 100644 --- a/policy-engine/src/types/region-size-override.ts +++ b/policy-engine/src/types/region-size-override.ts @@ -1,6 +1,6 @@ export type RegionSizeOverride = { region: string; - width?: number; - height?: number; - length?: number; + w?: number; + h?: number; + l?: number; }; diff --git a/policy-engine/src/types/self-issuable.ts b/policy-engine/src/types/self-issuable.ts index 4a18222df..fcc8ab81c 100644 --- a/policy-engine/src/types/self-issuable.ts +++ b/policy-engine/src/types/self-issuable.ts @@ -1,3 +1,3 @@ export type SelfIssuable = { - canSelfIssue?: boolean; + selfIssue?: boolean; }; diff --git a/policy-engine/src/types/size-dimension.ts b/policy-engine/src/types/size-dimension.ts index 6c3356a1e..942c0db08 100644 --- a/policy-engine/src/types/size-dimension.ts +++ b/policy-engine/src/types/size-dimension.ts @@ -5,11 +5,11 @@ import { } from 'onroute-policy-engine/types'; export type SizeDimension = SelfIssuable & { - frontProjection?: number; - rearProjection?: number; - width?: number; - height?: number; - length?: number; + fp?: number; + rp?: number; + w?: number; + h?: number; + l?: number; modifiers?: Array; regions?: Array; }; diff --git a/policy-engine/src/types/vehicle.ts b/policy-engine/src/types/vehicle.ts index 81e9c0218..4d557feb0 100644 --- a/policy-engine/src/types/vehicle.ts +++ b/policy-engine/src/types/vehicle.ts @@ -7,14 +7,22 @@ import { export type Vehicle = SelfIssuable & { type: string; - canFollow: Array; +}; + +export type VehicleSizeConfiguration = Vehicle & { + trailers: Array; +}; + +export type TrailerSize = Vehicle & { sizeDimensions?: Array; + jeep: boolean; + booster: boolean; }; -export type PowerUnit = Vehicle & { +export type PowerUnitWeight = Vehicle & { weightDimensions?: Array; }; -export type Trailer = Vehicle & { +export type TrailerWeight = Vehicle & { weightDimensions?: Array; }; From 69acd32067c7972ddf434dccfe146eee10176505 Mon Sep 17 00:00:00 2001 From: Praveen Raju <80779423+praju-aot@users.noreply.github.com> Date: Mon, 9 Sep 2024 10:23:56 -0400 Subject: [PATCH 19/63] ORV22-2637 DB Model for Case Managements /Queue - First Draft (#1544) Co-authored-by: John Fletcher --- .../dbo.ORBC_FEATURE_FLAG.Table.sql | 23 + .../versions/revert/v_42_ddl_revert.sql | 45 + database/mssql/scripts/versions/v_40_ddl.sql | 1 - database/mssql/scripts/versions/v_42_ddl.sql | 1362 +++++++++++++++++ database/mssql/test/versions/v_38_test.sh | 2 +- vehicles/src/app.module.ts | 4 +- .../src/common/constants/permit.constant.ts | 6 + .../application-search.constraint.ts | 57 + .../case-activity-comment.constraint.ts | 30 + .../common/enum/application-search.enum.ts | 4 + .../common/enum/application-status.enum.ts | 2 + .../common/enum/case-activity-type.enum.ts | 8 + .../src/common/enum/case-event-type.enum.ts | 14 + .../src/common/enum/case-status-type.enum.ts | 20 + vehicles/src/common/enum/case-type.enum.ts | 5 + vehicles/src/common/helper/database.helper.ts | 63 +- .../helper/permit-application.helper.ts | 17 + .../case-management/case-management.module.ts | 24 + .../case-management.service.ts | 767 ++++++++++ .../dto/response/read-case-event.dto.ts | 28 + .../entities/case-activity.entity.ts | 69 + .../entities/case-document.entity.ts | 66 + .../entities/case-event.entity.ts | 72 + .../entities/case-notes.entity.ts | 60 + .../case-management/entities/case.entity.ts | 86 ++ .../profiles/case-management.profile.ts | 18 + .../application/application.controller.ts | 59 +- .../application/application.module.ts | 9 +- .../application/application.service.ts | 319 +++- .../company-application-queue.controller.ts | 201 +++ .../company-application.controller.ts | 3 + .../dto/request/issue-permit.dto.ts | 3 +- .../applicationId.path-params.dto.ts | 14 + .../getApplication.query-params.dto.ts | 73 +- .../dto/request/update-case-activity.dto.ts | 34 + .../response/read-application-metadata.dto.ts | 28 + .../profile/application.profile.ts | 86 ++ .../permit/entities/permit.entity.ts | 8 + .../shopping-cart/shopping-cart.service.ts | 55 +- .../dto/request/update-loa-file.dto.ts | 4 +- .../dto/request/update-loa.dto.ts | 4 +- .../entities/loa-detail.entity.ts | 1 - .../special-auth/profile/loa.profile.ts | 3 +- 43 files changed, 3711 insertions(+), 46 deletions(-) create mode 100644 database/mssql/scripts/versions/revert/v_42_ddl_revert.sql create mode 100644 database/mssql/scripts/versions/v_42_ddl.sql create mode 100644 vehicles/src/common/constraint/application-search.constraint.ts create mode 100644 vehicles/src/common/constraint/case-activity-comment.constraint.ts create mode 100644 vehicles/src/common/enum/application-search.enum.ts create mode 100644 vehicles/src/common/enum/case-activity-type.enum.ts create mode 100644 vehicles/src/common/enum/case-event-type.enum.ts create mode 100644 vehicles/src/common/enum/case-status-type.enum.ts create mode 100644 vehicles/src/common/enum/case-type.enum.ts create mode 100644 vehicles/src/modules/case-management/case-management.module.ts create mode 100644 vehicles/src/modules/case-management/case-management.service.ts create mode 100644 vehicles/src/modules/case-management/dto/response/read-case-event.dto.ts create mode 100644 vehicles/src/modules/case-management/entities/case-activity.entity.ts create mode 100644 vehicles/src/modules/case-management/entities/case-document.entity.ts create mode 100644 vehicles/src/modules/case-management/entities/case-event.entity.ts create mode 100644 vehicles/src/modules/case-management/entities/case-notes.entity.ts create mode 100644 vehicles/src/modules/case-management/entities/case.entity.ts create mode 100644 vehicles/src/modules/case-management/profiles/case-management.profile.ts create mode 100644 vehicles/src/modules/permit-application-payment/application/company-application-queue.controller.ts create mode 100644 vehicles/src/modules/permit-application-payment/application/dto/request/pathParam/applicationId.path-params.dto.ts create mode 100644 vehicles/src/modules/permit-application-payment/application/dto/request/update-case-activity.dto.ts diff --git a/database/mssql/scripts/sampledata/dbo.ORBC_FEATURE_FLAG.Table.sql b/database/mssql/scripts/sampledata/dbo.ORBC_FEATURE_FLAG.Table.sql index 9c21db7f3..3688e3dcc 100644 --- a/database/mssql/scripts/sampledata/dbo.ORBC_FEATURE_FLAG.Table.sql +++ b/database/mssql/scripts/sampledata/dbo.ORBC_FEATURE_FLAG.Table.sql @@ -95,6 +95,29 @@ VALUES GETUTCDATE() ); + INSERT INTO + [dbo].[ORBC_FEATURE_FLAG] ( + [FEATURE_ID], + [FEATURE_KEY], + [FEATURE_VALUE], + [CONCURRENCY_CONTROL_NUMBER], + [DB_CREATE_USERID], + [DB_CREATE_TIMESTAMP], + [DB_LAST_UPDATE_USERID], + [DB_LAST_UPDATE_TIMESTAMP] + ) +VALUES + ( + '5', + 'APPLICATION-QUEUE', + 'ENABLED', + NULL, + N'dbo', + GETUTCDATE(), + N'dbo', + GETUTCDATE() + ); + SET IDENTITY_INSERT [dbo].[ORBC_FEATURE_FLAG] OFF GO \ No newline at end of file diff --git a/database/mssql/scripts/versions/revert/v_42_ddl_revert.sql b/database/mssql/scripts/versions/revert/v_42_ddl_revert.sql new file mode 100644 index 000000000..6159e4ada --- /dev/null +++ b/database/mssql/scripts/versions/revert/v_42_ddl_revert.sql @@ -0,0 +1,45 @@ +SET ANSI_NULLS ON +GO +SET QUOTED_IDENTIFIER ON +GO +SET NOCOUNT ON +GO + +SET XACT_ABORT ON + +BEGIN TRY + BEGIN TRANSACTION + DROP TABLE [case].[ORBC_CASE_DOCUMENT_HIST] + DROP TABLE [case].[ORBC_CASE_DOCUMENT] + DROP SEQUENCE [case].[ORBC_CASE_DOCUMENT_H_ID_SEQ] + DROP TABLE [case].[ORBC_CASE_ACTIVITY_HIST] + DROP TABLE [case].[ORBC_CASE_ACTIVITY] + DROP SEQUENCE [case].[ORBC_CASE_ACTIVITY_H_ID_SEQ] + DROP TABLE [case].[ORBC_CASE_NOTES_HIST] + DROP TABLE [case].[ORBC_CASE_NOTES] + DROP SEQUENCE [case].[ORBC_CASE_NOTES_H_ID_SEQ] + DROP TABLE [case].[ORBC_CASE_ACTIVITY_TYPE] + DROP TABLE [case].[ORBC_CASE_EVENT_HIST] + DROP TABLE [case].[ORBC_CASE_EVENT] + DROP SEQUENCE [case].[ORBC_CASE_EVENT_H_ID_SEQ] + DROP TABLE [case].[ORBC_CASE_EVENT_TYPE] + DROP TABLE [case].[ORBC_CASE_HIST] + DROP TABLE [case].[ORBC_CASE] + DROP SEQUENCE [case].[ORBC_CASE_H_ID_SEQ] + DROP TABLE [case].[ORBC_CASE_TYPE] + DROP TABLE [case].[ORBC_CASE_STATUS_TYPE] + DROP SCHEMA [case] + DELETE FROM [permit].[ORBC_PERMIT_STATUS_TYPE] WHERE [PERMIT_STATUS_TYPE] ='IN_QUEUE' + COMMIT +END TRY + +BEGIN CATCH + IF @@TRANCOUNT > 0 + ROLLBACK; + THROW +END CATCH + +DECLARE @VersionDescription VARCHAR(255) +SET @VersionDescription = 'Revert Case/Queue management and related Db objects' + +INSERT [dbo].[ORBC_SYS_VERSION] ([VERSION_ID], [DESCRIPTION], [RELEASE_DATE]) VALUES (41, @VersionDescription, getutcdate()) diff --git a/database/mssql/scripts/versions/v_40_ddl.sql b/database/mssql/scripts/versions/v_40_ddl.sql index 48dc58af0..5f2914525 100644 --- a/database/mssql/scripts/versions/v_40_ddl.sql +++ b/database/mssql/scripts/versions/v_40_ddl.sql @@ -102,4 +102,3 @@ BEGIN END GO - diff --git a/database/mssql/scripts/versions/v_42_ddl.sql b/database/mssql/scripts/versions/v_42_ddl.sql new file mode 100644 index 000000000..d2f3513a7 --- /dev/null +++ b/database/mssql/scripts/versions/v_42_ddl.sql @@ -0,0 +1,1362 @@ +SET ANSI_NULLS ON +GO +SET QUOTED_IDENTIFIER ON +GO +SET NOCOUNT ON +GO + +SET XACT_ABORT ON +GO +SET TRANSACTION ISOLATION LEVEL SERIALIZABLE +GO +BEGIN TRANSACTION +GO + +INSERT [permit].[ORBC_PERMIT_STATUS_TYPE] ([PERMIT_STATUS_TYPE], [NAME], [DESCRIPTION], [CONCURRENCY_CONTROL_NUMBER], [DB_CREATE_USERID], [DB_CREATE_TIMESTAMP], [DB_LAST_UPDATE_USERID], [DB_LAST_UPDATE_TIMESTAMP]) VALUES (N'IN_QUEUE', N'In Queue', NULL, NULL, N'dbo', GETUTCDATE(), N'dbo', GETUTCDATE()) + +GO +IF @@ERROR <> 0 SET NOEXEC ON +GO + +CREATE SCHEMA [case] +GO +IF @@ERROR <> 0 SET NOEXEC ON +GO + +CREATE TABLE [case].[ORBC_CASE_STATUS_TYPE] ( + [CASE_STATUS_TYPE] [nvarchar](12) NOT NULL, + [DESCRIPTION] [nvarchar](100) NULL, + [CONCURRENCY_CONTROL_NUMBER] [int] NULL, + [DB_CREATE_USERID] [varchar](63) NULL, + [DB_CREATE_TIMESTAMP] [datetime2](7) NULL, + [DB_LAST_UPDATE_USERID] [varchar](63) NULL, + [DB_LAST_UPDATE_TIMESTAMP] [datetime2](7) NULL, + CONSTRAINT [PK_ORBC_CASE_STATUS_TYPE] PRIMARY KEY CLUSTERED ([CASE_STATUS_TYPE] ASC) WITH ( + PAD_INDEX = OFF, + STATISTICS_NORECOMPUTE = OFF, + IGNORE_DUP_KEY = OFF, + ALLOW_ROW_LOCKS = ON, + ALLOW_PAGE_LOCKS = ON + ) ON [PRIMARY] + ) ON [PRIMARY] +GO + +-- Descriptions for all ORBC_CASE_STATUS_TYPE columns +EXEC sys.sp_addextendedproperty + @name=N'MS_Description', + @value=N'The type of case status.' , + @level0type=N'SCHEMA', + @level0name=N'case', + @level1type=N'TABLE', + @level1Name=N'ORBC_CASE_STATUS_TYPE', + @level2type=N'COLUMN', + @level2name=N'CASE_STATUS_TYPE' +EXEC sys.sp_addextendedproperty + @name=N'MS_Description', + @value=N'Description of the credit account type.' , + @level0type=N'SCHEMA', + @level0name=N'case', + @level1type=N'TABLE', + @level1Name=N'ORBC_CASE_STATUS_TYPE', + @level2type=N'COLUMN', + @level2name=N'DESCRIPTION' +-- Audit column descriptions (boilerplate) +EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Application code is responsible for retrieving the row and then incrementing the value of the CONCURRENCY_CONTROL_NUMBER column by one prior to issuing an update. If this is done then the update will succeed, provided that the row was not updated by any other transactions in the period between the read and the update operations.' , @level0type=N'SCHEMA',@level0name=N'case', @level1type=N'TABLE',@level1Name=N'ORBC_CASE_STATUS_TYPE', @level2type=N'COLUMN',@level2name=N'CONCURRENCY_CONTROL_NUMBER' +EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'The user or proxy account that created or last updated the record.' , @level0type=N'SCHEMA',@level0name=N'case', @level1type=N'TABLE',@level1Name=N'ORBC_CASE_STATUS_TYPE', @level2type=N'COLUMN',@level2name=N'DB_LAST_UPDATE_USERID' +EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'The date and time the record was created.' , @level0type=N'SCHEMA',@level0name=N'case', @level1type=N'TABLE',@level1Name=N'ORBC_CASE_STATUS_TYPE', @level2type=N'COLUMN',@level2name=N'DB_CREATE_TIMESTAMP' +EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'The user or proxy account that created the record.' , @level0type=N'SCHEMA',@level0name=N'case', @level1type=N'TABLE',@level1Name=N'ORBC_CASE_STATUS_TYPE', @level2type=N'COLUMN',@level2name=N'DB_CREATE_USERID' +EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'The date and time the record was created or last updated.' , @level0type=N'SCHEMA',@level0name=N'case', @level1type=N'TABLE',@level1Name=N'ORBC_CASE_STATUS_TYPE', @level2type=N'COLUMN',@level2name=N'DB_LAST_UPDATE_TIMESTAMP' + +-- Default values for audit columns (boilerplate) +IF @@ERROR <> 0 SET NOEXEC ON +GO +ALTER TABLE [case].[ORBC_CASE_STATUS_TYPE] ADD CONSTRAINT [DF_ORBC_CASE_STATUS_TYPE_DB_CREATE_USERID] DEFAULT (user_name()) FOR [DB_CREATE_USERID] + +IF @@ERROR <> 0 SET NOEXEC ON +GO +ALTER TABLE [case].[ORBC_CASE_STATUS_TYPE] ADD CONSTRAINT [DF_ORBC_CASE_STATUS_TYPE_DB_CREATE_TIMESTAMP] DEFAULT (getutcdate()) FOR [DB_CREATE_TIMESTAMP] + +IF @@ERROR <> 0 SET NOEXEC ON +GO +ALTER TABLE [case].[ORBC_CASE_STATUS_TYPE] ADD CONSTRAINT [DF_ORBC_CASE_STATUS_TYPE_DB_LAST_UPDATE_USERID] DEFAULT (user_name()) FOR [DB_LAST_UPDATE_USERID] + +IF @@ERROR <> 0 SET NOEXEC ON +GO +ALTER TABLE [case].[ORBC_CASE_STATUS_TYPE] ADD CONSTRAINT [DF_ORBC_CASE_STATUS_TYPE_DB_LAST_UPDATE_TIMESTAMP] DEFAULT (getutcdate()) FOR [DB_LAST_UPDATE_TIMESTAMP] + + +INSERT [case].[ORBC_CASE_STATUS_TYPE] ( + [CASE_STATUS_TYPE], + [DESCRIPTION] + ) +VALUES ( + N'OPEN', + N'Open' + ) + +INSERT [case].[ORBC_CASE_STATUS_TYPE] ( + [CASE_STATUS_TYPE], + [DESCRIPTION] + ) +VALUES ( + N'CLOSED', + N'Closed' + ) + +INSERT [case].[ORBC_CASE_STATUS_TYPE] ( + [CASE_STATUS_TYPE], + [DESCRIPTION] + ) +VALUES ( + N'IN_PROGRESS', + N'In Progress' + ) + +IF @@ERROR <> 0 SET NOEXEC ON +GO +CREATE TABLE [case].[ORBC_CASE_TYPE] ( + [CASE_TYPE] [nvarchar](10) NOT NULL, + -- [CASE_STATUS_TYPE] [nvarchar](12) NOT NULL, --Maybe the linking should be in a different table?TBD in future? Would need a composite key if the mapping remains in this table + [DESCRIPTION] [nvarchar](100) NULL, + [CONCURRENCY_CONTROL_NUMBER] [int] NULL, + [DB_CREATE_USERID] [varchar](63) NULL, + [DB_CREATE_TIMESTAMP] [datetime2](7) NULL, + [DB_LAST_UPDATE_USERID] [varchar](63) NULL, + [DB_LAST_UPDATE_TIMESTAMP] [datetime2](7) NULL, + CONSTRAINT [PK_ORBC_CASE_TYPE] PRIMARY KEY CLUSTERED ([CASE_TYPE] ASC) WITH ( + PAD_INDEX = OFF, + STATISTICS_NORECOMPUTE = OFF, + IGNORE_DUP_KEY = OFF, + ALLOW_ROW_LOCKS = ON, + ALLOW_PAGE_LOCKS = ON + ) ON [PRIMARY] + ) ON [PRIMARY] +GO + +IF @@ERROR <> 0 SET NOEXEC ON +GO + +-- -- FK constraints +-- ALTER TABLE [case].[ORBC_CASE_TYPE] +-- WITH CHECK ADD CONSTRAINT [FK_ORBC_CASE_TYPE_CASE_STATUS_TYPE] +-- FOREIGN KEY([CASE_STATUS_TYPE]) +-- REFERENCES [case].[ORBC_CASE_STATUS_TYPE] ([CASE_STATUS_TYPE]) +-- GO +-- ALTER TABLE [case].[ORBC_CASE_TYPE] CHECK CONSTRAINT [FK_ORBC_CASE_TYPE_CASE_STATUS_TYPE] + +GO +IF @@ERROR <> 0 SET NOEXEC ON +GO + +-- Descriptions for all ORBC_CASE_TYPE columns +EXEC sys.sp_addextendedproperty + @name=N'MS_Description', + @value=N'The type of cases.' , + @level0type=N'SCHEMA', + @level0name=N'case', + @level1type=N'TABLE', + @level1Name=N'ORBC_CASE_TYPE', + @level2type=N'COLUMN', + @level2name=N'CASE_TYPE' +EXEC sys.sp_addextendedproperty + @name=N'MS_Description', + @value=N'Description of the credit account type.' , + @level0type=N'SCHEMA', + @level0name=N'case', + @level1type=N'TABLE', + @level1Name=N'ORBC_CASE_TYPE', + @level2type=N'COLUMN', + @level2name=N'DESCRIPTION' +-- Audit column descriptions (boilerplate) +EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Application code is responsible for retrieving the row and then incrementing the value of the CONCURRENCY_CONTROL_NUMBER column by one prior to issuing an update. If this is done then the update will succeed, provided that the row was not updated by any other transactions in the period between the read and the update operations.' , @level0type=N'SCHEMA',@level0name=N'case', @level1type=N'TABLE',@level1Name=N'ORBC_CASE_TYPE', @level2type=N'COLUMN',@level2name=N'CONCURRENCY_CONTROL_NUMBER' +EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'The user or proxy account that created or last updated the record.' , @level0type=N'SCHEMA',@level0name=N'case', @level1type=N'TABLE',@level1Name=N'ORBC_CASE_TYPE', @level2type=N'COLUMN',@level2name=N'DB_LAST_UPDATE_USERID' +EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'The date and time the record was created.' , @level0type=N'SCHEMA',@level0name=N'case', @level1type=N'TABLE',@level1Name=N'ORBC_CASE_TYPE', @level2type=N'COLUMN',@level2name=N'DB_CREATE_TIMESTAMP' +EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'The user or proxy account that created the record.' , @level0type=N'SCHEMA',@level0name=N'case', @level1type=N'TABLE',@level1Name=N'ORBC_CASE_TYPE', @level2type=N'COLUMN',@level2name=N'DB_CREATE_USERID' +EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'The date and time the record was created or last updated.' , @level0type=N'SCHEMA',@level0name=N'case', @level1type=N'TABLE',@level1Name=N'ORBC_CASE_TYPE', @level2type=N'COLUMN',@level2name=N'DB_LAST_UPDATE_TIMESTAMP' + + +-- Default values for audit columns (boilerplate) +IF @@ERROR <> 0 SET NOEXEC ON +GO +ALTER TABLE [case].[ORBC_CASE_TYPE] ADD CONSTRAINT [DF_ORBC_CASE_TYPE_DB_CREATE_USERID] DEFAULT (user_name()) FOR [DB_CREATE_USERID] + +IF @@ERROR <> 0 SET NOEXEC ON +GO +ALTER TABLE [case].[ORBC_CASE_TYPE] ADD CONSTRAINT [DF_ORBC_CASE_TYPE_DB_CREATE_TIMESTAMP] DEFAULT (getutcdate()) FOR [DB_CREATE_TIMESTAMP] + +IF @@ERROR <> 0 SET NOEXEC ON +GO +ALTER TABLE [case].[ORBC_CASE_TYPE] ADD CONSTRAINT [DF_ORBC_CASE_TYPE_DB_LAST_UPDATE_USERID] DEFAULT (user_name()) FOR [DB_LAST_UPDATE_USERID] + +IF @@ERROR <> 0 SET NOEXEC ON +GO +ALTER TABLE [case].[ORBC_CASE_TYPE] ADD CONSTRAINT [DF_ORBC_CASE_TYPE_DB_LAST_UPDATE_TIMESTAMP] DEFAULT (getutcdate()) FOR [DB_LAST_UPDATE_TIMESTAMP] + + +INSERT [case].[ORBC_CASE_TYPE] ( + [CASE_TYPE], + -- [CASE_STATUS_TYPE], + [DESCRIPTION] + ) +VALUES ( + N'DEFAULT', + -- N'OPEN', + N'Default' + ) + +-- INSERT [case].[ORBC_CASE_TYPE] ( +-- [CASE_TYPE], +-- --[CASE_STATUS_TYPE], +-- [DESCRIPTION] +-- ) +-- VALUES ( +-- N'DEFAULT', +-- --N'CLOSED', +-- N'Default' +-- ) + +-- INSERT [case].[ORBC_CASE_TYPE] ( +-- [CASE_TYPE], +-- --[CASE_STATUS_TYPE], +-- [DESCRIPTION] +-- ) +-- VALUES ( +-- N'DEFAULT', +-- --N'IN_PROGRESS', +-- N'Default' +-- ) + +IF @@ERROR <> 0 SET NOEXEC ON +GO +CREATE TABLE [case].[ORBC_CASE_EVENT_TYPE] ( + [CASE_EVENT_TYPE] [nvarchar](20) NOT NULL, + [DESCRIPTION] [nvarchar](100) NULL, + [CONCURRENCY_CONTROL_NUMBER] [int] NULL, + [DB_CREATE_USERID] [varchar](63) NULL, + [DB_CREATE_TIMESTAMP] [datetime2](7) NULL, + [DB_LAST_UPDATE_USERID] [varchar](63) NULL, + [DB_LAST_UPDATE_TIMESTAMP] [datetime2](7) NULL, + CONSTRAINT [PK_ORBC_CASE_EVENT_TYPE] PRIMARY KEY CLUSTERED ([CASE_EVENT_TYPE] ASC) WITH ( + PAD_INDEX = OFF, + STATISTICS_NORECOMPUTE = OFF, + IGNORE_DUP_KEY = OFF, + ALLOW_ROW_LOCKS = ON, + ALLOW_PAGE_LOCKS = ON + ) ON [PRIMARY] + ) ON [PRIMARY] +GO + +-- Descriptions for all ORBC_CASE_EVENT_TYPE columns +EXEC sys.sp_addextendedproperty + @name=N'MS_Description', + @value=N'The type of case events.' , + @level0type=N'SCHEMA', + @level0name=N'case', + @level1type=N'TABLE', + @level1Name=N'ORBC_CASE_EVENT_TYPE', + @level2type=N'COLUMN', + @level2name=N'CASE_EVENT_TYPE' +EXEC sys.sp_addextendedproperty + @name=N'MS_Description', + @value=N'Description of the credit account type.' , + @level0type=N'SCHEMA', + @level0name=N'case', + @level1type=N'TABLE', + @level1Name=N'ORBC_CASE_EVENT_TYPE', + @level2type=N'COLUMN', + @level2name=N'DESCRIPTION' +-- Audit column descriptions (boilerplate) +EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Application code is responsible for retrieving the row and then incrementing the value of the CONCURRENCY_CONTROL_NUMBER column by one prior to issuing an update. If this is done then the update will succeed, provided that the row was not updated by any other transactions in the period between the read and the update operations.' , @level0type=N'SCHEMA',@level0name=N'case', @level1type=N'TABLE',@level1Name=N'ORBC_CASE_EVENT_TYPE', @level2type=N'COLUMN',@level2name=N'CONCURRENCY_CONTROL_NUMBER' +EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'The user or proxy account that created or last updated the record.' , @level0type=N'SCHEMA',@level0name=N'case', @level1type=N'TABLE',@level1Name=N'ORBC_CASE_EVENT_TYPE', @level2type=N'COLUMN',@level2name=N'DB_LAST_UPDATE_USERID' +EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'The date and time the record was created.' , @level0type=N'SCHEMA',@level0name=N'case', @level1type=N'TABLE',@level1Name=N'ORBC_CASE_EVENT_TYPE', @level2type=N'COLUMN',@level2name=N'DB_CREATE_TIMESTAMP' +EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'The user or proxy account that created the record.' , @level0type=N'SCHEMA',@level0name=N'case', @level1type=N'TABLE',@level1Name=N'ORBC_CASE_EVENT_TYPE', @level2type=N'COLUMN',@level2name=N'DB_CREATE_USERID' +EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'The date and time the record was created or last updated.' , @level0type=N'SCHEMA',@level0name=N'case', @level1type=N'TABLE',@level1Name=N'ORBC_CASE_EVENT_TYPE', @level2type=N'COLUMN',@level2name=N'DB_LAST_UPDATE_TIMESTAMP' + +-- Default values for audit columns (boilerplate) +IF @@ERROR <> 0 SET NOEXEC ON +GO +ALTER TABLE [case].[ORBC_CASE_EVENT_TYPE] ADD CONSTRAINT [DF_ORBC_CASE_EVENT_TYPE_DB_CREATE_USERID] DEFAULT (user_name()) FOR [DB_CREATE_USERID] + +IF @@ERROR <> 0 SET NOEXEC ON +GO +ALTER TABLE [case].[ORBC_CASE_EVENT_TYPE] ADD CONSTRAINT [DF_ORBC_CASE_EVENT_TYPE_DB_CREATE_TIMESTAMP] DEFAULT (getutcdate()) FOR [DB_CREATE_TIMESTAMP] + +IF @@ERROR <> 0 SET NOEXEC ON +GO +ALTER TABLE [case].[ORBC_CASE_EVENT_TYPE] ADD CONSTRAINT [DF_ORBC_CASE_EVENT_TYPE_DB_LAST_UPDATE_USERID] DEFAULT (user_name()) FOR [DB_LAST_UPDATE_USERID] + +IF @@ERROR <> 0 SET NOEXEC ON +GO +ALTER TABLE [case].[ORBC_CASE_EVENT_TYPE] ADD CONSTRAINT [DF_ORBC_CASE_EVENT_TYPE_DB_LAST_UPDATE_TIMESTAMP] DEFAULT (getutcdate()) FOR [DB_LAST_UPDATE_TIMESTAMP] + + +/* + A record of when the case was submitted to the queue. +*/ +INSERT [case].[ORBC_CASE_EVENT_TYPE] ( + [CASE_EVENT_TYPE], + [DESCRIPTION] + ) +VALUES ( + N'OPENED', + N'Case Opened' + ) + +/* + A record for tracking the datetime, userid whenever the case is claimed/assigned/reassigned to a user. +*/ +INSERT [case].[ORBC_CASE_EVENT_TYPE] ( + [CASE_EVENT_TYPE], + [DESCRIPTION] + ) +VALUES ( + N'ASSIGNED', + N'Case claimed/assigned/reassigned' + ) + +/* When a case is claimed by the user the very first time. i.e When the case is first picked up from the queue + */ +INSERT [case].[ORBC_CASE_EVENT_TYPE] ( + [CASE_EVENT_TYPE], + [DESCRIPTION] + ) +VALUES ( + N'WORKFLOW_STARTED', + N'Workflow started' + ) + + +/* Can query the activity table when workflow_completed to find the outcome/decision. i.e whether its approved/rejected or withdrawn. + */ +INSERT [case].[ORBC_CASE_EVENT_TYPE] ( + [CASE_EVENT_TYPE], + [DESCRIPTION] + ) +VALUES ( + N'WORKFLOW_COMPLETED', + N'Workflow Completed' + ) + +INSERT [case].[ORBC_CASE_EVENT_TYPE] ( + [CASE_EVENT_TYPE], + [DESCRIPTION] + ) +VALUES ( + N'NOTIFICATION', + N'Notification Sent' + ) + +/* A dummy CLOSED event is created when WORKFLOW_COMPLETED + */ +INSERT [case].[ORBC_CASE_EVENT_TYPE] ( + [CASE_EVENT_TYPE], + [DESCRIPTION] + ) +VALUES ( + N'CLOSED', + N'Case Closed' + ) + +/* A record of when Notes are attached to the case + */ +INSERT [case].[ORBC_CASE_EVENT_TYPE] ( + [CASE_EVENT_TYPE], + [DESCRIPTION] + ) +VALUES ( + N'NOTE_CREATED', + N'Note Created' + ) + +/* A record of when documents are attached to the case + */ +INSERT [case].[ORBC_CASE_EVENT_TYPE] ( + [CASE_EVENT_TYPE], + [DESCRIPTION] + ) +VALUES ( + N'DOCUMENT_ADDED', + N'Document Added' + ) + +/* A record of when documents are deleted wrst to a case + */ +INSERT [case].[ORBC_CASE_EVENT_TYPE] ( + [CASE_EVENT_TYPE], + [DESCRIPTION] + ) +VALUES ( + N'DOCUMENT_DELETED', + N'Document Deleted' + ) + + INSERT [case].[ORBC_CASE_EVENT_TYPE] ( + [CASE_EVENT_TYPE], + [DESCRIPTION] + ) +VALUES ( + N'CASE_WITHDRAWN', + N'Case Withdrawn' + ) + +IF @@ERROR <> 0 SET NOEXEC ON +GO +CREATE TABLE [case].[ORBC_CASE_ACTIVITY_TYPE] ( + [CASE_ACTIVITY_TYPE] [nvarchar](10) NOT NULL, + [DESCRIPTION] [nvarchar](100) NULL, + [CONCURRENCY_CONTROL_NUMBER] [int] NULL, + [DB_CREATE_USERID] [varchar](63) NULL, + [DB_CREATE_TIMESTAMP] [datetime2](7) NULL, + [DB_LAST_UPDATE_USERID] [varchar](63) NULL, + [DB_LAST_UPDATE_TIMESTAMP] [datetime2](7) NULL, + CONSTRAINT [PK_ORBC_CASE_ACTIVITY_TYPE] PRIMARY KEY CLUSTERED ([CASE_ACTIVITY_TYPE] ASC) WITH ( + PAD_INDEX = OFF, + STATISTICS_NORECOMPUTE = OFF, + IGNORE_DUP_KEY = OFF, + ALLOW_ROW_LOCKS = ON, + ALLOW_PAGE_LOCKS = ON + ) ON [PRIMARY] + ) ON [PRIMARY] +GO + +-- Descriptions for all ORBC_CASE_ACTIVITY_TYPE columns +EXEC sys.sp_addextendedproperty + @name=N'MS_Description', + @value=N'The type of case events.' , + @level0type=N'SCHEMA', + @level0name=N'case', + @level1type=N'TABLE', + @level1Name=N'ORBC_CASE_ACTIVITY_TYPE', + @level2type=N'COLUMN', + @level2name=N'CASE_ACTIVITY_TYPE' +EXEC sys.sp_addextendedproperty + @name=N'MS_Description', + @value=N'Description of the credit account type.' , + @level0type=N'SCHEMA', + @level0name=N'case', + @level1type=N'TABLE', + @level1Name=N'ORBC_CASE_ACTIVITY_TYPE', + @level2type=N'COLUMN', + @level2name=N'DESCRIPTION' +-- Audit column descriptions (boilerplate) +EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Application code is responsible for retrieving the row and then incrementing the value of the CONCURRENCY_CONTROL_NUMBER column by one prior to issuing an update. If this is done then the update will succeed, provided that the row was not updated by any other transactions in the period between the read and the update operations.' , @level0type=N'SCHEMA',@level0name=N'case', @level1type=N'TABLE',@level1Name=N'ORBC_CASE_ACTIVITY_TYPE', @level2type=N'COLUMN',@level2name=N'CONCURRENCY_CONTROL_NUMBER' +EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'The user or proxy account that created or last updated the record.' , @level0type=N'SCHEMA',@level0name=N'case', @level1type=N'TABLE',@level1Name=N'ORBC_CASE_ACTIVITY_TYPE', @level2type=N'COLUMN',@level2name=N'DB_LAST_UPDATE_USERID' +EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'The date and time the record was created.' , @level0type=N'SCHEMA',@level0name=N'case', @level1type=N'TABLE',@level1Name=N'ORBC_CASE_ACTIVITY_TYPE', @level2type=N'COLUMN',@level2name=N'DB_CREATE_TIMESTAMP' +EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'The user or proxy account that created the record.' , @level0type=N'SCHEMA',@level0name=N'case', @level1type=N'TABLE',@level1Name=N'ORBC_CASE_ACTIVITY_TYPE', @level2type=N'COLUMN',@level2name=N'DB_CREATE_USERID' +EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'The date and time the record was created or last updated.' , @level0type=N'SCHEMA',@level0name=N'case', @level1type=N'TABLE',@level1Name=N'ORBC_CASE_ACTIVITY_TYPE', @level2type=N'COLUMN',@level2name=N'DB_LAST_UPDATE_TIMESTAMP' + + + +-- Default values for audit columns (boilerplate) +IF @@ERROR <> 0 SET NOEXEC ON +GO +ALTER TABLE [case].[ORBC_CASE_ACTIVITY_TYPE] ADD CONSTRAINT [DF_ORBC_CASE_ACTIVITY_TYPE_DB_CREATE_USERID] DEFAULT (user_name()) FOR [DB_CREATE_USERID] + +IF @@ERROR <> 0 SET NOEXEC ON +GO +ALTER TABLE [case].[ORBC_CASE_ACTIVITY_TYPE] ADD CONSTRAINT [DF_ORBC_CASE_ACTIVITY_TYPE_DB_CREATE_TIMESTAMP] DEFAULT (getutcdate()) FOR [DB_CREATE_TIMESTAMP] + +IF @@ERROR <> 0 SET NOEXEC ON +GO +ALTER TABLE [case].[ORBC_CASE_ACTIVITY_TYPE] ADD CONSTRAINT [DF_ORBC_CASE_ACTIVITY_TYPE_DB_LAST_UPDATE_USERID] DEFAULT (user_name()) FOR [DB_LAST_UPDATE_USERID] + +IF @@ERROR <> 0 SET NOEXEC ON +GO +ALTER TABLE [case].[ORBC_CASE_ACTIVITY_TYPE] ADD CONSTRAINT [DF_ORBC_CASE_ACTIVITY_TYPE_DB_LAST_UPDATE_TIMESTAMP] DEFAULT (getutcdate()) FOR [DB_LAST_UPDATE_TIMESTAMP] + +INSERT [case].[ORBC_CASE_ACTIVITY_TYPE] ( + [CASE_ACTIVITY_TYPE], + [DESCRIPTION] + ) +VALUES ( + N'APPROVED', + N'Approved' + ) + +INSERT [case].[ORBC_CASE_ACTIVITY_TYPE] ( + [CASE_ACTIVITY_TYPE], + [DESCRIPTION] + ) +VALUES ( + N'REJECTED', + N'Rejected' + ) + +INSERT [case].[ORBC_CASE_ACTIVITY_TYPE] ( + [CASE_ACTIVITY_TYPE], + [DESCRIPTION] + ) +VALUES ( + N'WITHDRAWN', + N'Withdrawn' + ) + + + +IF @@ERROR <> 0 SET NOEXEC ON +GO +CREATE TABLE [case].[ORBC_CASE] ( + [CASE_ID] [int] IDENTITY(1, 1) NOT NULL, + [ORIGINAL_CASE_ID] [int] NULL, + [PREVIOUS_CASE_ID] [int] NULL, + [PERMIT_ID] [bigint] NOT NULL, + [CASE_TYPE] [nvarchar](10) NOT NULL, + [CASE_STATUS_TYPE] [nvarchar](12) NOT NULL, + [ASSIGNED_USER_GUID] [char](32) NULL, -- Claimed or assigned? + [CONCURRENCY_CONTROL_NUMBER] [int] NULL, + [APP_CREATE_TIMESTAMP] [datetime2](7) NULL, + [APP_CREATE_USERID] [nvarchar](30) NULL, + [APP_CREATE_USER_GUID] [char](32) NULL, + [APP_CREATE_USER_DIRECTORY] [nvarchar](30) NULL, + [APP_LAST_UPDATE_TIMESTAMP] [datetime2](7) NULL, + [APP_LAST_UPDATE_USERID] [nvarchar](30) NULL, + [APP_LAST_UPDATE_USER_GUID] [char](32) NULL, + [APP_LAST_UPDATE_USER_DIRECTORY] [nvarchar](30) NULL, + [DB_CREATE_USERID] [varchar](63) NULL, + [DB_CREATE_TIMESTAMP] [datetime2](7) NULL, + [DB_LAST_UPDATE_USERID] [varchar](63) NULL, + [DB_LAST_UPDATE_TIMESTAMP] [datetime2](7) NULL, + CONSTRAINT [PK_ORBC_CASE] PRIMARY KEY CLUSTERED ([CASE_ID] ASC) WITH ( + PAD_INDEX = OFF, + STATISTICS_NORECOMPUTE = OFF, + IGNORE_DUP_KEY = OFF, + ALLOW_ROW_LOCKS = ON, + ALLOW_PAGE_LOCKS = ON + ) ON [PRIMARY] + ) ON [PRIMARY] +GO + +IF @@ERROR <> 0 SET NOEXEC ON +GO + +-- FK constraints +ALTER TABLE [case].[ORBC_CASE] + WITH CHECK ADD CONSTRAINT [FK_ORBC_CASE_ORIGINAL_CASE_ID] + FOREIGN KEY([ORIGINAL_CASE_ID]) + REFERENCES [case].[ORBC_CASE] ([CASE_ID]) +GO +ALTER TABLE [case].[ORBC_CASE] CHECK CONSTRAINT [FK_ORBC_CASE_ORIGINAL_CASE_ID] + +GO +IF @@ERROR <> 0 SET NOEXEC ON +GO + +ALTER TABLE [case].[ORBC_CASE] + WITH CHECK ADD CONSTRAINT [FK_ORBC_CASE_PREVIOUS_CASE_ID] + FOREIGN KEY([PREVIOUS_CASE_ID]) + REFERENCES [case].[ORBC_CASE] ([CASE_ID]) +GO +ALTER TABLE [case].[ORBC_CASE] CHECK CONSTRAINT [FK_ORBC_CASE_PREVIOUS_CASE_ID] + +GO +IF @@ERROR <> 0 SET NOEXEC ON +GO + +ALTER TABLE [case].[ORBC_CASE] + WITH CHECK ADD CONSTRAINT [FK_ORBC_CASE_PERMIT_ID] + FOREIGN KEY([PERMIT_ID]) + REFERENCES [permit].[ORBC_PERMIT] ([ID]) +GO +ALTER TABLE [case].[ORBC_CASE] CHECK CONSTRAINT [FK_ORBC_CASE_PERMIT_ID] + +GO +IF @@ERROR <> 0 SET NOEXEC ON +GO + +ALTER TABLE [case].[ORBC_CASE] + WITH CHECK ADD CONSTRAINT [FK_ORBC_CASE_CASE_TYPE] + FOREIGN KEY([CASE_TYPE]) + REFERENCES [case].[ORBC_CASE_TYPE] ([CASE_TYPE]) +GO +ALTER TABLE [case].[ORBC_CASE] CHECK CONSTRAINT [FK_ORBC_CASE_CASE_TYPE] + +GO +IF @@ERROR <> 0 SET NOEXEC ON +GO + +ALTER TABLE [case].[ORBC_CASE] + WITH CHECK ADD CONSTRAINT [FK_ORBC_CASE_CASE_STATUS_TYPE] + FOREIGN KEY([CASE_STATUS_TYPE]) + REFERENCES [case].[ORBC_CASE_STATUS_TYPE] ([CASE_STATUS_TYPE]) +GO +ALTER TABLE [case].[ORBC_CASE] CHECK CONSTRAINT [FK_ORBC_CASE_CASE_STATUS_TYPE] + +-- Default values for audit columns (boilerplate) +IF @@ERROR <> 0 SET NOEXEC ON +GO +ALTER TABLE [case].[ORBC_CASE] ADD CONSTRAINT [DF_ORBC_CASE_DB_CREATE_USERID] DEFAULT (user_name()) FOR [DB_CREATE_USERID] + +IF @@ERROR <> 0 SET NOEXEC ON +GO +ALTER TABLE [case].[ORBC_CASE] ADD CONSTRAINT [DF_ORBC_CASE_DB_CREATE_TIMESTAMP] DEFAULT (getutcdate()) FOR [DB_CREATE_TIMESTAMP] + +IF @@ERROR <> 0 SET NOEXEC ON +GO +ALTER TABLE [case].[ORBC_CASE] ADD CONSTRAINT [DF_ORBC_CASE_DB_LAST_UPDATE_USERID] DEFAULT (user_name()) FOR [DB_LAST_UPDATE_USERID] + +IF @@ERROR <> 0 SET NOEXEC ON +GO +ALTER TABLE [case].[ORBC_CASE] ADD CONSTRAINT [DF_ORBC_CASE_DB_LAST_UPDATE_TIMESTAMP] DEFAULT (getutcdate()) FOR [DB_LAST_UPDATE_TIMESTAMP] + + +-- Descriptions for all ORBC_CASE columns +EXEC sys.sp_addextendedproperty + @name=N'MS_Description', + @value=N'Unique auto-generated surrogate primary key' , + @level0type=N'SCHEMA', + @level0name=N'case', + @level1type=N'TABLE', + @level1Name=N'ORBC_CASE', + @level2type=N'COLUMN', + @level2name=N'CASE_ID' +EXEC sys.sp_addextendedproperty + @name=N'MS_Description', + @value=N'Original case id' , + @level0type=N'SCHEMA', + @level0name=N'case', + @level1type=N'TABLE', + @level1Name=N'ORBC_CASE', + @level2type=N'COLUMN', + @level2name=N'ORIGINAL_CASE_ID' +EXEC sys.sp_addextendedproperty + @name=N'MS_Description', + @value=N'Previous version of the case id' , + @level0type=N'SCHEMA', + @level0name=N'case', + @level1type=N'TABLE', + @level1Name=N'ORBC_CASE', + @level2type=N'COLUMN', + @level2name=N'PREVIOUS_CASE_ID' +EXEC sys.sp_addextendedproperty + @name=N'MS_Description', + @value=N'Permit id of the application' , + @level0type=N'SCHEMA', + @level0name=N'case', + @level1type=N'TABLE', + @level1Name=N'ORBC_CASE', + @level2type=N'COLUMN', + @level2name=N'PERMIT_ID' +EXEC sys.sp_addextendedproperty + @name=N'MS_Description', + @value=N'The type of case' , + @level0type=N'SCHEMA', + @level0name=N'case', + @level1type=N'TABLE', + @level1Name=N'ORBC_CASE', + @level2type=N'COLUMN', + @level2name=N'CASE_TYPE' +EXEC sys.sp_addextendedproperty + @name=N'MS_Description', + @value=N'The status type of the case' , + @level0type=N'SCHEMA', + @level0name=N'case', + @level1type=N'TABLE', + @level1Name=N'ORBC_CASE', + @level2type=N'COLUMN', + @level2name=N'CASE_STATUS_TYPE' +EXEC sys.sp_addextendedproperty + @name=N'MS_Description', + @value=N'The userid of the person currently assigned to the case' , + @level0type=N'SCHEMA', + @level0name=N'case', + @level1type=N'TABLE', + @level1Name=N'ORBC_CASE', + @level2type=N'COLUMN', + @level2name=N'ASSIGNED_USER_GUID' +-- Audit column descriptions (boilerplate) +EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Application code is responsible for retrieving the row and then incrementing the value of the CONCURRENCY_CONTROL_NUMBER column by one prior to issuing an update. If this is done then the update will succeed, provided that the row was not updated by any other transactions in the period between the read and the update operations.' , @level0type=N'SCHEMA',@level0name=N'case', @level1type=N'TABLE',@level1Name=N'ORBC_CASE', @level2type=N'COLUMN',@level2name=N'CONCURRENCY_CONTROL_NUMBER' +EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'The user or proxy account that created or last updated the record.' , @level0type=N'SCHEMA',@level0name=N'case', @level1type=N'TABLE',@level1Name=N'ORBC_CASE', @level2type=N'COLUMN',@level2name=N'DB_LAST_UPDATE_USERID' +EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'The date and time the record was created.' , @level0type=N'SCHEMA',@level0name=N'case', @level1type=N'TABLE',@level1Name=N'ORBC_CASE', @level2type=N'COLUMN',@level2name=N'DB_CREATE_TIMESTAMP' +EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'The user or proxy account that created the record.' , @level0type=N'SCHEMA',@level0name=N'case', @level1type=N'TABLE',@level1Name=N'ORBC_CASE', @level2type=N'COLUMN',@level2name=N'DB_CREATE_USERID' +EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'The date and time the record was created or last updated.' , @level0type=N'SCHEMA',@level0name=N'case', @level1type=N'TABLE',@level1Name=N'ORBC_CASE', @level2type=N'COLUMN',@level2name=N'DB_LAST_UPDATE_TIMESTAMP' + +CREATE SEQUENCE [case].[ORBC_CASE_H_ID_SEQ] AS [bigint] START WITH 1 INCREMENT BY 1 MINVALUE 1 MAXVALUE 2147483647 CACHE 50; + +CREATE TABLE [case].[ORBC_CASE_HIST]( + _CASE_HIST_ID [bigint] DEFAULT (NEXT VALUE FOR [case].[ORBC_CASE_H_ID_SEQ]) NOT NULL + ,EFFECTIVE_DATE_HIST [datetime] NOT NULL default getutcdate() + ,END_DATE_HIST [datetime] + , [CASE_ID] int NOT NULL, [ORIGINAL_CASE_ID] int NULL, [PREVIOUS_CASE_ID] int NULL, [PERMIT_ID] bigint NOT NULL, [CASE_TYPE] nvarchar(10) NOT NULL, [CASE_STATUS_TYPE] nvarchar(12) NOT NULL, [ASSIGNED_USER_GUID] char(32) NULL, [CONCURRENCY_CONTROL_NUMBER] int NULL, [APP_CREATE_TIMESTAMP] datetime2 NULL, [APP_CREATE_USERID] nvarchar(30) NULL, [APP_CREATE_USER_GUID] char(32) NULL, [APP_CREATE_USER_DIRECTORY] nvarchar(30) NULL, [APP_LAST_UPDATE_TIMESTAMP] datetime2 NULL, [APP_LAST_UPDATE_USERID] nvarchar(30) NULL, [APP_LAST_UPDATE_USER_GUID] char(32) NULL, [APP_LAST_UPDATE_USER_DIRECTORY] nvarchar(30) NULL, [DB_CREATE_USERID] varchar(63) NULL, [DB_CREATE_TIMESTAMP] datetime2 NULL, [DB_LAST_UPDATE_USERID] varchar(63) NULL, [DB_LAST_UPDATE_TIMESTAMP] datetime2 NULL + ) +ALTER TABLE [case].[ORBC_CASE_HIST] ADD CONSTRAINT ORBC_2_H_PK PRIMARY KEY CLUSTERED (_CASE_HIST_ID); +ALTER TABLE [case].[ORBC_CASE_HIST] ADD CONSTRAINT ORBC_2_H_UK UNIQUE (_CASE_HIST_ID,END_DATE_HIST) +go + +CREATE TRIGGER ORBC_CASE_A_S_IUD_TR ON [case].[ORBC_CASE] FOR INSERT, UPDATE, DELETE AS +SET NOCOUNT ON +BEGIN TRY +DECLARE @curr_date datetime; +SET @curr_date = getutcdate(); + IF NOT EXISTS(SELECT * FROM inserted) AND NOT EXISTS(SELECT * FROM deleted) + RETURN; + + -- historical + IF EXISTS(SELECT * FROM deleted) + update [case].[ORBC_CASE_HIST] set END_DATE_HIST = @curr_date where CASE_ID in (select CASE_ID from deleted) and END_DATE_HIST is null; + + IF EXISTS(SELECT * FROM inserted) + insert into [case].[ORBC_CASE_HIST] ([CASE_ID], [ORIGINAL_CASE_ID], [PREVIOUS_CASE_ID], [PERMIT_ID], [CASE_TYPE], [CASE_STATUS_TYPE], [ASSIGNED_USER_GUID], [CONCURRENCY_CONTROL_NUMBER], [APP_CREATE_TIMESTAMP], [APP_CREATE_USERID], [APP_CREATE_USER_GUID], [APP_CREATE_USER_DIRECTORY], [APP_LAST_UPDATE_TIMESTAMP], [APP_LAST_UPDATE_USERID], [APP_LAST_UPDATE_USER_GUID], [APP_LAST_UPDATE_USER_DIRECTORY], [DB_CREATE_USERID], [DB_CREATE_TIMESTAMP], [DB_LAST_UPDATE_USERID], [DB_LAST_UPDATE_TIMESTAMP], _CASE_HIST_ID, END_DATE_HIST, EFFECTIVE_DATE_HIST) + select [CASE_ID], [ORIGINAL_CASE_ID], [PREVIOUS_CASE_ID], [PERMIT_ID], [CASE_TYPE], [CASE_STATUS_TYPE], [ASSIGNED_USER_GUID], [CONCURRENCY_CONTROL_NUMBER], [APP_CREATE_TIMESTAMP], [APP_CREATE_USERID], [APP_CREATE_USER_GUID], [APP_CREATE_USER_DIRECTORY], [APP_LAST_UPDATE_TIMESTAMP], [APP_LAST_UPDATE_USERID], [APP_LAST_UPDATE_USER_GUID], [APP_LAST_UPDATE_USER_DIRECTORY], [DB_CREATE_USERID], [DB_CREATE_TIMESTAMP], [DB_LAST_UPDATE_USERID], [DB_LAST_UPDATE_TIMESTAMP], (next value for [case].[ORBC_CASE_H_ID_SEQ]) as [_CASE_HIST_ID], null as [END_DATE_HIST], @curr_date as [EFFECTIVE_DATE_HIST] from inserted; + +END TRY +BEGIN CATCH + IF @@trancount > 0 ROLLBACK TRANSACTION + EXEC orbc_error_handling +END CATCH; +go + +IF @@ERROR <> 0 SET NOEXEC ON +GO +CREATE TABLE [case].[ORBC_CASE_EVENT] ( + [CASE_EVENT_ID] [int] IDENTITY(1, 1) NOT NULL, + [CASE_ID] [int] NOT NULL, + [CASE_EVENT_TYPE] [nvarchar](20) NOT NULL, + [EVENT_DATE] [datetime2](7) NOT NULL, + [EVENT_USER_GUID] [char](32) NULL, + [CONCURRENCY_CONTROL_NUMBER] [int] NULL, + [APP_CREATE_TIMESTAMP] [datetime2](7) NULL, + [APP_CREATE_USERID] [nvarchar](30) NULL, + [APP_CREATE_USER_GUID] [char](32) NULL, + [APP_CREATE_USER_DIRECTORY] [nvarchar](30) NULL, + [APP_LAST_UPDATE_TIMESTAMP] [datetime2](7) NULL, + [APP_LAST_UPDATE_USERID] [nvarchar](30) NULL, + [APP_LAST_UPDATE_USER_GUID] [char](32) NULL, + [APP_LAST_UPDATE_USER_DIRECTORY] [nvarchar](30) NULL, + [DB_CREATE_USERID] [varchar](63) NULL, + [DB_CREATE_TIMESTAMP] [datetime2](7) NULL, + [DB_LAST_UPDATE_USERID] [varchar](63) NULL, + [DB_LAST_UPDATE_TIMESTAMP] [datetime2](7) NULL, + CONSTRAINT [PK_ORBC_CASE_EVENT] PRIMARY KEY CLUSTERED ([CASE_EVENT_ID] ASC) WITH ( + PAD_INDEX = OFF, + STATISTICS_NORECOMPUTE = OFF, + IGNORE_DUP_KEY = OFF, + ALLOW_ROW_LOCKS = ON, + ALLOW_PAGE_LOCKS = ON + ) ON [PRIMARY] + ) ON [PRIMARY] +GO + +ALTER TABLE [case].[ORBC_CASE_EVENT] + WITH CHECK ADD CONSTRAINT [FK_ORBC_CASE_EVENT_CASE_EVENT_TYPE] + FOREIGN KEY([CASE_EVENT_TYPE]) + REFERENCES [case].[ORBC_CASE_EVENT_TYPE] ([CASE_EVENT_TYPE]) +GO +ALTER TABLE [case].[ORBC_CASE_EVENT] CHECK CONSTRAINT [FK_ORBC_CASE_EVENT_CASE_EVENT_TYPE] + +-- Default values for audit columns (boilerplate) +IF @@ERROR <> 0 SET NOEXEC ON +GO +ALTER TABLE [case].[ORBC_CASE_EVENT] ADD CONSTRAINT [DF_ORBC_CASE_EVENT_DB_CREATE_USERID] DEFAULT (user_name()) FOR [DB_CREATE_USERID] + +IF @@ERROR <> 0 SET NOEXEC ON +GO +ALTER TABLE [case].[ORBC_CASE_EVENT] ADD CONSTRAINT [DF_ORBC_CASE_EVENT_DB_CREATE_TIMESTAMP] DEFAULT (getutcdate()) FOR [DB_CREATE_TIMESTAMP] + +IF @@ERROR <> 0 SET NOEXEC ON +GO +ALTER TABLE [case].[ORBC_CASE_EVENT] ADD CONSTRAINT [DF_ORBC_CASE_EVENT_DB_LAST_UPDATE_USERID] DEFAULT (user_name()) FOR [DB_LAST_UPDATE_USERID] + +IF @@ERROR <> 0 SET NOEXEC ON +GO +ALTER TABLE [case].[ORBC_CASE_EVENT] ADD CONSTRAINT [DF_ORBC_CASE_EVENT_DB_LAST_UPDATE_TIMESTAMP] DEFAULT (getutcdate()) FOR [DB_LAST_UPDATE_TIMESTAMP] + + +-- Descriptions for all ORBC_CASE_EVENT columns +EXEC sys.sp_addextendedproperty + @name=N'MS_Description', + @value=N'Unique auto-generated surrogate primary key' , + @level0type=N'SCHEMA', + @level0name=N'case', + @level1type=N'TABLE', + @level1Name=N'ORBC_CASE_EVENT', + @level2type=N'COLUMN', + @level2name=N'CASE_EVENT_ID' +EXEC sys.sp_addextendedproperty + @name=N'MS_Description', + @value=N'Reference to ORBC_CASE.CASE_ID' , + @level0type=N'SCHEMA', + @level0name=N'case', + @level1type=N'TABLE', + @level1Name=N'ORBC_CASE_EVENT', + @level2type=N'COLUMN', + @level2name=N'CASE_ID' +EXEC sys.sp_addextendedproperty + @name=N'MS_Description', + @value=N'The type of case event' , + @level0type=N'SCHEMA', + @level0name=N'case', + @level1type=N'TABLE', + @level1Name=N'ORBC_CASE_EVENT', + @level2type=N'COLUMN', + @level2name=N'CASE_EVENT_TYPE' +EXEC sys.sp_addextendedproperty + @name=N'MS_Description', + @value=N'The date time of the event occurrence' , + @level0type=N'SCHEMA', + @level0name=N'case', + @level1type=N'TABLE', + @level1Name=N'ORBC_CASE_EVENT', + @level2type=N'COLUMN', + @level2name=N'EVENT_DATE' +EXEC sys.sp_addextendedproperty + @name=N'MS_Description', + @value=N'The userid that triggered the event' , + @level0type=N'SCHEMA', + @level0name=N'case', + @level1type=N'TABLE', + @level1Name=N'ORBC_CASE_EVENT', + @level2type=N'COLUMN', + @level2name=N'EVENT_USER_GUID' +-- Audit column descriptions (boilerplate) +EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Application code is responsible for retrieving the row and then incrementing the value of the CONCURRENCY_CONTROL_NUMBER column by one prior to issuing an update. If this is done then the update will succeed, provided that the row was not updated by any other transactions in the period between the read and the update operations.' , @level0type=N'SCHEMA',@level0name=N'case', @level1type=N'TABLE',@level1Name=N'ORBC_CASE_EVENT', @level2type=N'COLUMN',@level2name=N'CONCURRENCY_CONTROL_NUMBER' +EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'The user or proxy account that created or last updated the record.' , @level0type=N'SCHEMA',@level0name=N'case', @level1type=N'TABLE',@level1Name=N'ORBC_CASE_EVENT', @level2type=N'COLUMN',@level2name=N'DB_LAST_UPDATE_USERID' +EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'The date and time the record was created.' , @level0type=N'SCHEMA',@level0name=N'case', @level1type=N'TABLE',@level1Name=N'ORBC_CASE_EVENT', @level2type=N'COLUMN',@level2name=N'DB_CREATE_TIMESTAMP' +EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'The user or proxy account that created the record.' , @level0type=N'SCHEMA',@level0name=N'case', @level1type=N'TABLE',@level1Name=N'ORBC_CASE_EVENT', @level2type=N'COLUMN',@level2name=N'DB_CREATE_USERID' +EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'The date and time the record was created or last updated.' , @level0type=N'SCHEMA',@level0name=N'case', @level1type=N'TABLE',@level1Name=N'ORBC_CASE_EVENT', @level2type=N'COLUMN',@level2name=N'DB_LAST_UPDATE_TIMESTAMP' + +CREATE SEQUENCE [case].[ORBC_CASE_EVENT_H_ID_SEQ] AS [bigint] START WITH 1 INCREMENT BY 1 MINVALUE 1 MAXVALUE 2147483647 CACHE 50; + +CREATE TABLE [case].[ORBC_CASE_EVENT_HIST]( + _CASE_EVENT_HIST_ID [bigint] DEFAULT (NEXT VALUE FOR [case].[ORBC_CASE_EVENT_H_ID_SEQ]) NOT NULL + ,EFFECTIVE_DATE_HIST [datetime] NOT NULL default getutcdate() + ,END_DATE_HIST [datetime] + , [CASE_EVENT_ID] int NOT NULL, [CASE_ID] int NOT NULL, [CASE_EVENT_TYPE] nvarchar(20) NOT NULL, [EVENT_DATE] datetime2 NOT NULL, [EVENT_USER_GUID] char(32) NULL, [CONCURRENCY_CONTROL_NUMBER] int NULL, [APP_CREATE_TIMESTAMP] datetime2 NULL, [APP_CREATE_USERID] nvarchar(30) NULL, [APP_CREATE_USER_GUID] char(32) NULL, [APP_CREATE_USER_DIRECTORY] nvarchar(30) NULL, [APP_LAST_UPDATE_TIMESTAMP] datetime2 NULL, [APP_LAST_UPDATE_USERID] nvarchar(30) NULL, [APP_LAST_UPDATE_USER_GUID] char(32) NULL, [APP_LAST_UPDATE_USER_DIRECTORY] nvarchar(30) NULL, [DB_CREATE_USERID] varchar(63) NULL, [DB_CREATE_TIMESTAMP] datetime2 NULL, [DB_LAST_UPDATE_USERID] varchar(63) NULL, [DB_LAST_UPDATE_TIMESTAMP] datetime2 NULL + ) +ALTER TABLE [case].[ORBC_CASE_EVENT_HIST] ADD CONSTRAINT ORBC_5_H_PK PRIMARY KEY CLUSTERED (_CASE_EVENT_HIST_ID); +ALTER TABLE [case].[ORBC_CASE_EVENT_HIST] ADD CONSTRAINT ORBC_5_H_UK UNIQUE (_CASE_EVENT_HIST_ID,END_DATE_HIST) +go + +CREATE TRIGGER ORBC_CASE_EVENT_A_S_IUD_TR ON [case].[ORBC_CASE_EVENT] FOR INSERT, UPDATE, DELETE AS +SET NOCOUNT ON +BEGIN TRY +DECLARE @curr_date datetime; +SET @curr_date = getutcdate(); + IF NOT EXISTS(SELECT * FROM inserted) AND NOT EXISTS(SELECT * FROM deleted) + RETURN; + + -- historical + IF EXISTS(SELECT * FROM deleted) + update [case].[ORBC_CASE_EVENT_HIST] set END_DATE_HIST = @curr_date where CASE_EVENT_ID in (select CASE_EVENT_ID from deleted) and END_DATE_HIST is null; + + IF EXISTS(SELECT * FROM inserted) + insert into [case].[ORBC_CASE_EVENT_HIST] ([CASE_EVENT_ID], [CASE_ID], [CASE_EVENT_TYPE], [EVENT_DATE], [EVENT_USER_GUID], [CONCURRENCY_CONTROL_NUMBER], [APP_CREATE_TIMESTAMP], [APP_CREATE_USERID], [APP_CREATE_USER_GUID], [APP_CREATE_USER_DIRECTORY], [APP_LAST_UPDATE_TIMESTAMP], [APP_LAST_UPDATE_USERID], [APP_LAST_UPDATE_USER_GUID], [APP_LAST_UPDATE_USER_DIRECTORY], [DB_CREATE_USERID], [DB_CREATE_TIMESTAMP], [DB_LAST_UPDATE_USERID], [DB_LAST_UPDATE_TIMESTAMP], _CASE_EVENT_HIST_ID, END_DATE_HIST, EFFECTIVE_DATE_HIST) + select [CASE_EVENT_ID], [CASE_ID], [CASE_EVENT_TYPE], [EVENT_DATE], [EVENT_USER_GUID], [CONCURRENCY_CONTROL_NUMBER], [APP_CREATE_TIMESTAMP], [APP_CREATE_USERID], [APP_CREATE_USER_GUID], [APP_CREATE_USER_DIRECTORY], [APP_LAST_UPDATE_TIMESTAMP], [APP_LAST_UPDATE_USERID], [APP_LAST_UPDATE_USER_GUID], [APP_LAST_UPDATE_USER_DIRECTORY], [DB_CREATE_USERID], [DB_CREATE_TIMESTAMP], [DB_LAST_UPDATE_USERID], [DB_LAST_UPDATE_TIMESTAMP], (next value for [case].[ORBC_CASE_EVENT_H_ID_SEQ]) as [_CASE_EVENT_HIST_ID], null as [END_DATE_HIST], @curr_date as [EFFECTIVE_DATE_HIST] from inserted; + +END TRY +BEGIN CATCH + IF @@trancount > 0 ROLLBACK TRANSACTION + EXEC orbc_error_handling +END CATCH; +go + + +IF @@ERROR <> 0 SET NOEXEC ON +GO +CREATE TABLE [case].[ORBC_CASE_NOTES] ( + [CASE_NOTES_ID] [int] IDENTITY(1, 1) NOT NULL, + [CASE_ID] [int] NOT NULL, + [CASE_EVENT_ID] [int] NOT NULL, + [USER_GUID] [char](32) NULL, + [NOTES_DATE] [datetime2](7) NOT NULL, + [NOTES] [nvarchar](4000) NOT NULL, + [CONCURRENCY_CONTROL_NUMBER] [int] NULL, + [APP_CREATE_TIMESTAMP] [datetime2](7) NULL, + [APP_CREATE_USERID] [nvarchar](30) NULL, + [APP_CREATE_USER_GUID] [char](32) NULL, + [APP_CREATE_USER_DIRECTORY] [nvarchar](30) NULL, + [APP_LAST_UPDATE_TIMESTAMP] [datetime2](7) NULL, + [APP_LAST_UPDATE_USERID] [nvarchar](30) NULL, + [APP_LAST_UPDATE_USER_GUID] [char](32) NULL, + [APP_LAST_UPDATE_USER_DIRECTORY] [nvarchar](30) NULL, + [DB_CREATE_USERID] [varchar](63) NULL, + [DB_CREATE_TIMESTAMP] [datetime2](7) NULL, + [DB_LAST_UPDATE_USERID] [varchar](63) NULL, + [DB_LAST_UPDATE_TIMESTAMP] [datetime2](7) NULL, + CONSTRAINT [PK_ORBC_CASE_NOTES] PRIMARY KEY CLUSTERED ([CASE_NOTES_ID] ASC) WITH ( + PAD_INDEX = OFF, + STATISTICS_NORECOMPUTE = OFF, + IGNORE_DUP_KEY = OFF, + ALLOW_ROW_LOCKS = ON, + ALLOW_PAGE_LOCKS = ON + ) ON [PRIMARY] + ) ON [PRIMARY] +GO + +ALTER TABLE [case].[ORBC_CASE_NOTES] + WITH CHECK ADD CONSTRAINT [FK_ORBC_CASE_NOTES_CASE_ID] + FOREIGN KEY([CASE_ID]) + REFERENCES [case].[ORBC_CASE] ([CASE_ID]) +GO +ALTER TABLE [case].[ORBC_CASE_NOTES] CHECK CONSTRAINT [FK_ORBC_CASE_NOTES_CASE_ID] + +ALTER TABLE [case].[ORBC_CASE_NOTES] + WITH CHECK ADD CONSTRAINT [FK_ORBC_CASE_NOTES_CASE_EVENT_ID] + FOREIGN KEY([CASE_EVENT_ID]) + REFERENCES [case].[ORBC_CASE_EVENT] ([CASE_EVENT_ID]) +GO +ALTER TABLE [case].[ORBC_CASE_NOTES] CHECK CONSTRAINT [FK_ORBC_CASE_NOTES_CASE_EVENT_ID] + + +-- Default values for audit columns (boilerplate) +IF @@ERROR <> 0 SET NOEXEC ON +GO +ALTER TABLE [case].[ORBC_CASE_NOTES] ADD CONSTRAINT [DF_ORBC_CASE_NOTES_DB_CREATE_USERID] DEFAULT (user_name()) FOR [DB_CREATE_USERID] + +IF @@ERROR <> 0 SET NOEXEC ON +GO +ALTER TABLE [case].[ORBC_CASE_NOTES] ADD CONSTRAINT [DF_ORBC_CASE_NOTES_DB_CREATE_TIMESTAMP] DEFAULT (getutcdate()) FOR [DB_CREATE_TIMESTAMP] + +IF @@ERROR <> 0 SET NOEXEC ON +GO +ALTER TABLE [case].[ORBC_CASE_NOTES] ADD CONSTRAINT [DF_ORBC_CASE_NOTES_DB_LAST_UPDATE_USERID] DEFAULT (user_name()) FOR [DB_LAST_UPDATE_USERID] + +IF @@ERROR <> 0 SET NOEXEC ON +GO +ALTER TABLE [case].[ORBC_CASE_NOTES] ADD CONSTRAINT [DF_ORBC_CASE_NOTES_DB_LAST_UPDATE_TIMESTAMP] DEFAULT (getutcdate()) FOR [DB_LAST_UPDATE_TIMESTAMP] + +-- Descriptions for all ORBC_CASE_NOTES columns +EXEC sys.sp_addextendedproperty + @name=N'MS_Description', + @value=N'Unique auto-generated surrogate primary key' , + @level0type=N'SCHEMA', + @level0name=N'case', + @level1type=N'TABLE', + @level1Name=N'ORBC_CASE_NOTES', + @level2type=N'COLUMN', + @level2name=N'CASE_NOTES_ID' +EXEC sys.sp_addextendedproperty + @name=N'MS_Description', + @value=N'Reference to ORBC_CASE.CASE_ID' , + @level0type=N'SCHEMA', + @level0name=N'case', + @level1type=N'TABLE', + @level1Name=N'ORBC_CASE_NOTES', + @level2type=N'COLUMN', + @level2name=N'CASE_ID' +EXEC sys.sp_addextendedproperty + @name=N'MS_Description', + @value=N'Reference to ORBC_CASE_EVENT.CASE_EVENT_ID' , + @level0type=N'SCHEMA', + @level0name=N'case', + @level1type=N'TABLE', + @level1Name=N'ORBC_CASE_NOTES', + @level2type=N'COLUMN', + @level2name=N'CASE_EVENT_ID' +EXEC sys.sp_addextendedproperty + @name=N'MS_Description', + @value=N'The userid associated with the notes' , + @level0type=N'SCHEMA', + @level0name=N'case', + @level1type=N'TABLE', + @level1Name=N'ORBC_CASE_NOTES', + @level2type=N'COLUMN', + @level2name=N'USER_GUID' +EXEC sys.sp_addextendedproperty + @name=N'MS_Description', + @value=N'The date time of the notes' , + @level0type=N'SCHEMA', + @level0name=N'case', + @level1type=N'TABLE', + @level1Name=N'ORBC_CASE_NOTES', + @level2type=N'COLUMN', + @level2name=N'NOTES_DATE' +EXEC sys.sp_addextendedproperty + @name=N'MS_Description', + @value=N'Notes, if any' , + @level0type=N'SCHEMA', + @level0name=N'case', + @level1type=N'TABLE', + @level1Name=N'ORBC_CASE_NOTES', + @level2type=N'COLUMN', + @level2name=N'NOTES' + +-- Audit column descriptions (boilerplate) +EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Application code is responsible for retrieving the row and then incrementing the value of the CONCURRENCY_CONTROL_NUMBER column by one prior to issuing an update. If this is done then the update will succeed, provided that the row was not updated by any other transactions in the period between the read and the update operations.' , @level0type=N'SCHEMA',@level0name=N'case', @level1type=N'TABLE',@level1Name=N'ORBC_CASE_NOTES', @level2type=N'COLUMN',@level2name=N'CONCURRENCY_CONTROL_NUMBER' +EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'The user or proxy account that created or last updated the record.' , @level0type=N'SCHEMA',@level0name=N'case', @level1type=N'TABLE',@level1Name=N'ORBC_CASE_NOTES', @level2type=N'COLUMN',@level2name=N'DB_LAST_UPDATE_USERID' +EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'The date and time the record was created.' , @level0type=N'SCHEMA',@level0name=N'case', @level1type=N'TABLE',@level1Name=N'ORBC_CASE_NOTES', @level2type=N'COLUMN',@level2name=N'DB_CREATE_TIMESTAMP' +EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'The user or proxy account that created the record.' , @level0type=N'SCHEMA',@level0name=N'case', @level1type=N'TABLE',@level1Name=N'ORBC_CASE_NOTES', @level2type=N'COLUMN',@level2name=N'DB_CREATE_USERID' +EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'The date and time the record was created or last updated.' , @level0type=N'SCHEMA',@level0name=N'case', @level1type=N'TABLE',@level1Name=N'ORBC_CASE_NOTES', @level2type=N'COLUMN',@level2name=N'DB_LAST_UPDATE_TIMESTAMP' + +CREATE SEQUENCE [case].[ORBC_CASE_NOTES_H_ID_SEQ] AS [bigint] START WITH 1 INCREMENT BY 1 MINVALUE 1 MAXVALUE 2147483647 CACHE 50; + +CREATE TABLE [case].[ORBC_CASE_NOTES_HIST]( + _CASE_NOTES_HIST_ID [bigint] DEFAULT (NEXT VALUE FOR [case].[ORBC_CASE_NOTES_H_ID_SEQ]) NOT NULL + ,EFFECTIVE_DATE_HIST [datetime] NOT NULL default getutcdate() + ,END_DATE_HIST [datetime] + , [CASE_NOTES_ID] int NOT NULL, [CASE_ID] int NOT NULL, [CASE_EVENT_ID] int NOT NULL, [USER_GUID] char(32) NULL, [NOTES_DATE] datetime2 NOT NULL, [NOTES] nvarchar(4000) NOT NULL, [CONCURRENCY_CONTROL_NUMBER] int NULL, [APP_CREATE_TIMESTAMP] datetime2 NULL, [APP_CREATE_USERID] nvarchar(30) NULL, [APP_CREATE_USER_GUID] char(32) NULL, [APP_CREATE_USER_DIRECTORY] nvarchar(30) NULL, [APP_LAST_UPDATE_TIMESTAMP] datetime2 NULL, [APP_LAST_UPDATE_USERID] nvarchar(30) NULL, [APP_LAST_UPDATE_USER_GUID] char(32) NULL, [APP_LAST_UPDATE_USER_DIRECTORY] nvarchar(30) NULL, [DB_CREATE_USERID] varchar(63) NULL, [DB_CREATE_TIMESTAMP] datetime2 NULL, [DB_LAST_UPDATE_USERID] varchar(63) NULL, [DB_LAST_UPDATE_TIMESTAMP] datetime2 NULL + ) +ALTER TABLE [case].[ORBC_CASE_NOTES_HIST] ADD CONSTRAINT ORBC_6_H_PK PRIMARY KEY CLUSTERED (_CASE_NOTES_HIST_ID); +ALTER TABLE [case].[ORBC_CASE_NOTES_HIST] ADD CONSTRAINT ORBC_6_H_UK UNIQUE (_CASE_NOTES_HIST_ID,END_DATE_HIST) +go + +CREATE TRIGGER ORBC_CASE_NOTES_A_S_IUD_TR ON [case].[ORBC_CASE_NOTES] FOR INSERT, UPDATE, DELETE AS +SET NOCOUNT ON +BEGIN TRY +DECLARE @curr_date datetime; +SET @curr_date = getutcdate(); + IF NOT EXISTS(SELECT * FROM inserted) AND NOT EXISTS(SELECT * FROM deleted) + RETURN; + + -- historical + IF EXISTS(SELECT * FROM deleted) + update [case].[ORBC_CASE_NOTES_HIST] set END_DATE_HIST = @curr_date where CASE_NOTES_ID in (select CASE_NOTES_ID from deleted) and END_DATE_HIST is null; + + IF EXISTS(SELECT * FROM inserted) + insert into [case].[ORBC_CASE_NOTES_HIST] ([CASE_NOTES_ID], [CASE_ID], [CASE_EVENT_ID], [USER_GUID], [NOTES_DATE], [NOTES], [CONCURRENCY_CONTROL_NUMBER], [APP_CREATE_TIMESTAMP], [APP_CREATE_USERID], [APP_CREATE_USER_GUID], [APP_CREATE_USER_DIRECTORY], [APP_LAST_UPDATE_TIMESTAMP], [APP_LAST_UPDATE_USERID], [APP_LAST_UPDATE_USER_GUID], [APP_LAST_UPDATE_USER_DIRECTORY], [DB_CREATE_USERID], [DB_CREATE_TIMESTAMP], [DB_LAST_UPDATE_USERID], [DB_LAST_UPDATE_TIMESTAMP], _CASE_NOTES_HIST_ID, END_DATE_HIST, EFFECTIVE_DATE_HIST) + select [CASE_NOTES_ID], [CASE_ID], [CASE_EVENT_ID], [USER_GUID], [NOTES_DATE], [NOTES], [CONCURRENCY_CONTROL_NUMBER], [APP_CREATE_TIMESTAMP], [APP_CREATE_USERID], [APP_CREATE_USER_GUID], [APP_CREATE_USER_DIRECTORY], [APP_LAST_UPDATE_TIMESTAMP], [APP_LAST_UPDATE_USERID], [APP_LAST_UPDATE_USER_GUID], [APP_LAST_UPDATE_USER_DIRECTORY], [DB_CREATE_USERID], [DB_CREATE_TIMESTAMP], [DB_LAST_UPDATE_USERID], [DB_LAST_UPDATE_TIMESTAMP], (next value for [case].[ORBC_CASE_NOTES_H_ID_SEQ]) as [_CASE_NOTES_HIST_ID], null as [END_DATE_HIST], @curr_date as [EFFECTIVE_DATE_HIST] from inserted; + +END TRY +BEGIN CATCH + IF @@trancount > 0 ROLLBACK TRANSACTION + EXEC orbc_error_handling +END CATCH; +go + +IF @@ERROR <> 0 SET NOEXEC ON +GO +CREATE TABLE [case].[ORBC_CASE_ACTIVITY] ( + [CASE_ACTIVITY_ID] [int] IDENTITY(1, 1) NOT NULL, + [CASE_ID] [int] NOT NULL, + [CASE_EVENT_ID] [int] NOT NULL, + [CASE_ACTIVITY_TYPE] [nvarchar](10) NOT NULL, + [CASE_NOTES_ID] [int] NULL, + [DATETIME] [datetime2](7) NOT NULL, + [USER_GUID] [char](32) NULL, + [CONCURRENCY_CONTROL_NUMBER] [int] NULL, + [APP_CREATE_TIMESTAMP] [datetime2](7) NULL, + [APP_CREATE_USERID] [nvarchar](30) NULL, + [APP_CREATE_USER_GUID] [char](32) NULL, + [APP_CREATE_USER_DIRECTORY] [nvarchar](30) NULL, + [APP_LAST_UPDATE_TIMESTAMP] [datetime2](7) NULL, + [APP_LAST_UPDATE_USERID] [nvarchar](30) NULL, + [APP_LAST_UPDATE_USER_GUID] [char](32) NULL, + [APP_LAST_UPDATE_USER_DIRECTORY] [nvarchar](30) NULL, + [DB_CREATE_USERID] [varchar](63) NULL, + [DB_CREATE_TIMESTAMP] [datetime2](7) NULL, + [DB_LAST_UPDATE_USERID] [varchar](63) NULL, + [DB_LAST_UPDATE_TIMESTAMP] [datetime2](7) NULL, + CONSTRAINT [PK_ORBC_CASE_ACTIVITY] PRIMARY KEY CLUSTERED ([CASE_ACTIVITY_ID] ASC) WITH ( + PAD_INDEX = OFF, + STATISTICS_NORECOMPUTE = OFF, + IGNORE_DUP_KEY = OFF, + ALLOW_ROW_LOCKS = ON, + ALLOW_PAGE_LOCKS = ON + ) ON [PRIMARY] + ) ON [PRIMARY] +GO + + +ALTER TABLE [case].[ORBC_CASE_ACTIVITY] + WITH CHECK ADD CONSTRAINT [FK_ORBC_CASE_ACTIVITY_CASE_ID] + FOREIGN KEY([CASE_ID]) + REFERENCES [case].[ORBC_CASE] ([CASE_ID]) +GO +ALTER TABLE [case].[ORBC_CASE_ACTIVITY] CHECK CONSTRAINT [FK_ORBC_CASE_ACTIVITY_CASE_ID] + +ALTER TABLE [case].[ORBC_CASE_ACTIVITY] + WITH CHECK ADD CONSTRAINT [FK_ORBC_CASE_ACTIVITY_CASE_EVENT_ID] + FOREIGN KEY([CASE_EVENT_ID]) + REFERENCES [case].[ORBC_CASE_EVENT] ([CASE_EVENT_ID]) +GO +ALTER TABLE [case].[ORBC_CASE_ACTIVITY] CHECK CONSTRAINT [FK_ORBC_CASE_ACTIVITY_CASE_EVENT_ID] + +ALTER TABLE [case].[ORBC_CASE_ACTIVITY] + WITH CHECK ADD CONSTRAINT [FK_ORBC_CASE_ACTIVITY_CASE_ACTIVITY_TYPE] + FOREIGN KEY([CASE_ACTIVITY_TYPE]) + REFERENCES [case].[ORBC_CASE_ACTIVITY_TYPE] ([CASE_ACTIVITY_TYPE]) +GO +ALTER TABLE [case].[ORBC_CASE_ACTIVITY] CHECK CONSTRAINT [FK_ORBC_CASE_ACTIVITY_CASE_ACTIVITY_TYPE] + + +-- Default values for audit columns (boilerplate) +IF @@ERROR <> 0 SET NOEXEC ON +GO +ALTER TABLE [case].[ORBC_CASE_ACTIVITY] ADD CONSTRAINT [DF_ORBC_CASE_ACTIVITY_DB_CREATE_USERID] DEFAULT (user_name()) FOR [DB_CREATE_USERID] + +IF @@ERROR <> 0 SET NOEXEC ON +GO +ALTER TABLE [case].[ORBC_CASE_ACTIVITY] ADD CONSTRAINT [DF_ORBC_CASE_ACTIVITY_DB_CREATE_TIMESTAMP] DEFAULT (getutcdate()) FOR [DB_CREATE_TIMESTAMP] + +IF @@ERROR <> 0 SET NOEXEC ON +GO +ALTER TABLE [case].[ORBC_CASE_ACTIVITY] ADD CONSTRAINT [DF_ORBC_CASE_ACTIVITY_DB_LAST_UPDATE_USERID] DEFAULT (user_name()) FOR [DB_LAST_UPDATE_USERID] + +IF @@ERROR <> 0 SET NOEXEC ON +GO +ALTER TABLE [case].[ORBC_CASE_ACTIVITY] ADD CONSTRAINT [DF_ORBC_CASE_ACTIVITY_DB_LAST_UPDATE_TIMESTAMP] DEFAULT (getutcdate()) FOR [DB_LAST_UPDATE_TIMESTAMP] + + +-- Descriptions for all ORBC_CASE_HISTORY columns +EXEC sys.sp_addextendedproperty + @name=N'MS_Description', + @value=N'Unique auto-generated surrogate primary key' , + @level0type=N'SCHEMA', + @level0name=N'case', + @level1type=N'TABLE', + @level1Name=N'ORBC_CASE_ACTIVITY', + @level2type=N'COLUMN', + @level2name=N'CASE_ACTIVITY_ID' +EXEC sys.sp_addextendedproperty + @name=N'MS_Description', + @value=N'Reference to ORBC_CASE.CASE_ID' , + @level0type=N'SCHEMA', + @level0name=N'case', + @level1type=N'TABLE', + @level1Name=N'ORBC_CASE_ACTIVITY', + @level2type=N'COLUMN', + @level2name=N'CASE_ID' +EXEC sys.sp_addextendedproperty + @name=N'MS_Description', + @value=N'Reference to ORBC_CASE_EVENT.CASE_EVENT_ID' , + @level0type=N'SCHEMA', + @level0name=N'case', + @level1type=N'TABLE', + @level1Name=N'ORBC_CASE_ACTIVITY', + @level2type=N'COLUMN', + @level2name=N'CASE_EVENT_ID' +EXEC sys.sp_addextendedproperty + @name=N'MS_Description', + @value=N'Reference to ORBC_CASE_ACTIVITY_TYPE.CASE_ACTIVITY_TYPE' , + @level0type=N'SCHEMA', + @level0name=N'case', + @level1type=N'TABLE', + @level1Name=N'ORBC_CASE_ACTIVITY', + @level2type=N'COLUMN', + @level2name=N'CASE_ACTIVITY_TYPE' +EXEC sys.sp_addextendedproperty + @name=N'MS_Description', + @value=N'The date time of the ACTIVITY' , + @level0type=N'SCHEMA', + @level0name=N'case', + @level1type=N'TABLE', + @level1Name=N'ORBC_CASE_ACTIVITY', + @level2type=N'COLUMN', + @level2name=N'DATETIME' +EXEC sys.sp_addextendedproperty + @name=N'MS_Description', + @value=N'The userid associated with the ACTIVITY' , + @level0type=N'SCHEMA', + @level0name=N'case', + @level1type=N'TABLE', + @level1Name=N'ORBC_CASE_ACTIVITY', + @level2type=N'COLUMN', + @level2name=N'USER_GUID' +EXEC sys.sp_addextendedproperty + @name=N'MS_Description', + @value=N'Comments related to the ACTIVITY, references ORBC_CASE_NOTES' , + @level0type=N'SCHEMA', + @level0name=N'case', + @level1type=N'TABLE', + @level1Name=N'ORBC_CASE_ACTIVITY', + @level2type=N'COLUMN', + @level2name=N'CASE_NOTES_ID' + +-- Audit column descriptions (boilerplate) +EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Application code is responsible for retrieving the row and then incrementing the value of the CONCURRENCY_CONTROL_NUMBER column by one prior to issuing an update. If this is done then the update will succeed, provided that the row was not updated by any other transactions in the period between the read and the update operations.' , @level0type=N'SCHEMA',@level0name=N'case', @level1type=N'TABLE',@level1Name=N'ORBC_CASE_ACTIVITY', @level2type=N'COLUMN',@level2name=N'CONCURRENCY_CONTROL_NUMBER' +EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'The user or proxy account that created or last updated the record.' , @level0type=N'SCHEMA',@level0name=N'case', @level1type=N'TABLE',@level1Name=N'ORBC_CASE_ACTIVITY', @level2type=N'COLUMN',@level2name=N'DB_LAST_UPDATE_USERID' +EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'The date and time the record was created.' , @level0type=N'SCHEMA',@level0name=N'case', @level1type=N'TABLE',@level1Name=N'ORBC_CASE_ACTIVITY', @level2type=N'COLUMN',@level2name=N'DB_CREATE_TIMESTAMP' +EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'The user or proxy account that created the record.' , @level0type=N'SCHEMA',@level0name=N'case', @level1type=N'TABLE',@level1Name=N'ORBC_CASE_ACTIVITY', @level2type=N'COLUMN',@level2name=N'DB_CREATE_USERID' +EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'The date and time the record was created or last updated.' , @level0type=N'SCHEMA',@level0name=N'case', @level1type=N'TABLE',@level1Name=N'ORBC_CASE_ACTIVITY', @level2type=N'COLUMN',@level2name=N'DB_LAST_UPDATE_TIMESTAMP' + +CREATE SEQUENCE [case].[ORBC_CASE_ACTIVITY_H_ID_SEQ] AS [bigint] START WITH 1 INCREMENT BY 1 MINVALUE 1 MAXVALUE 2147483647 CACHE 50; + +CREATE TABLE [case].[ORBC_CASE_ACTIVITY_HIST]( + _CASE_ACTIVITY_HIST_ID [bigint] DEFAULT (NEXT VALUE FOR [case].[ORBC_CASE_ACTIVITY_H_ID_SEQ]) NOT NULL + ,EFFECTIVE_DATE_HIST [datetime] NOT NULL default getutcdate() + ,END_DATE_HIST [datetime] + , [CASE_ACTIVITY_ID] int NOT NULL, [CASE_ID] int NOT NULL, [CASE_EVENT_ID] int NOT NULL, [CASE_ACTIVITY_TYPE] nvarchar(10) NOT NULL, [CASE_NOTES_ID] int NULL, [DATETIME] datetime2 NOT NULL, [USER_GUID] char(32) NULL, [CONCURRENCY_CONTROL_NUMBER] int NULL, [APP_CREATE_TIMESTAMP] datetime2 NULL, [APP_CREATE_USERID] nvarchar(30) NULL, [APP_CREATE_USER_GUID] char(32) NULL, [APP_CREATE_USER_DIRECTORY] nvarchar(30) NULL, [APP_LAST_UPDATE_TIMESTAMP] datetime2 NULL, [APP_LAST_UPDATE_USERID] nvarchar(30) NULL, [APP_LAST_UPDATE_USER_GUID] char(32) NULL, [APP_LAST_UPDATE_USER_DIRECTORY] nvarchar(30) NULL, [DB_CREATE_USERID] varchar(63) NULL, [DB_CREATE_TIMESTAMP] datetime2 NULL, [DB_LAST_UPDATE_USERID] varchar(63) NULL, [DB_LAST_UPDATE_TIMESTAMP] datetime2 NULL + ) +ALTER TABLE [case].[ORBC_CASE_ACTIVITY_HIST] ADD CONSTRAINT ORBC_3_H_PK PRIMARY KEY CLUSTERED (_CASE_ACTIVITY_HIST_ID); +ALTER TABLE [case].[ORBC_CASE_ACTIVITY_HIST] ADD CONSTRAINT ORBC_3_H_UK UNIQUE (_CASE_ACTIVITY_HIST_ID,END_DATE_HIST) +go + +CREATE TRIGGER ORBC_CASE_ACTIVITY_A_S_IUD_TR ON [case].[ORBC_CASE_ACTIVITY] FOR INSERT, UPDATE, DELETE AS +SET NOCOUNT ON +BEGIN TRY +DECLARE @curr_date datetime; +SET @curr_date = getutcdate(); + IF NOT EXISTS(SELECT * FROM inserted) AND NOT EXISTS(SELECT * FROM deleted) + RETURN; + + -- historical + IF EXISTS(SELECT * FROM deleted) + update [case].[ORBC_CASE_ACTIVITY_HIST] set END_DATE_HIST = @curr_date where CASE_ACTIVITY_ID in (select CASE_ACTIVITY_ID from deleted) and END_DATE_HIST is null; + + IF EXISTS(SELECT * FROM inserted) + insert into [case].[ORBC_CASE_ACTIVITY_HIST] ([CASE_ACTIVITY_ID], [CASE_ID], [CASE_EVENT_ID], [CASE_ACTIVITY_TYPE], [CASE_NOTES_ID], [DATETIME], [USER_GUID], [CONCURRENCY_CONTROL_NUMBER], [APP_CREATE_TIMESTAMP], [APP_CREATE_USERID], [APP_CREATE_USER_GUID], [APP_CREATE_USER_DIRECTORY], [APP_LAST_UPDATE_TIMESTAMP], [APP_LAST_UPDATE_USERID], [APP_LAST_UPDATE_USER_GUID], [APP_LAST_UPDATE_USER_DIRECTORY], [DB_CREATE_USERID], [DB_CREATE_TIMESTAMP], [DB_LAST_UPDATE_USERID], [DB_LAST_UPDATE_TIMESTAMP], _CASE_ACTIVITY_HIST_ID, END_DATE_HIST, EFFECTIVE_DATE_HIST) + select [CASE_ACTIVITY_ID], [CASE_ID], [CASE_EVENT_ID], [CASE_ACTIVITY_TYPE], [CASE_NOTES_ID], [DATETIME], [USER_GUID], [CONCURRENCY_CONTROL_NUMBER], [APP_CREATE_TIMESTAMP], [APP_CREATE_USERID], [APP_CREATE_USER_GUID], [APP_CREATE_USER_DIRECTORY], [APP_LAST_UPDATE_TIMESTAMP], [APP_LAST_UPDATE_USERID], [APP_LAST_UPDATE_USER_GUID], [APP_LAST_UPDATE_USER_DIRECTORY], [DB_CREATE_USERID], [DB_CREATE_TIMESTAMP], [DB_LAST_UPDATE_USERID], [DB_LAST_UPDATE_TIMESTAMP], (next value for [case].[ORBC_CASE_ACTIVITY_H_ID_SEQ]) as [_CASE_ACTIVITY_HIST_ID], null as [END_DATE_HIST], @curr_date as [EFFECTIVE_DATE_HIST] from inserted; + +END TRY +BEGIN CATCH + IF @@trancount > 0 ROLLBACK TRANSACTION + EXEC orbc_error_handling +END CATCH; +go + +IF @@ERROR <> 0 SET NOEXEC ON +GO +CREATE TABLE [case].[ORBC_CASE_DOCUMENT] ( + [CASE_DOCUMENT_ID] [int] IDENTITY(1, 1) NOT NULL, + [CASE_ID] [int] NOT NULL, + [CASE_EVENT_ID] [int] NOT NULL, + [DOCUMENT_ID] [bigint] NOT NULL, + [CONCURRENCY_CONTROL_NUMBER] [int] NULL, + [APP_CREATE_TIMESTAMP] [datetime2](7) NULL, + [APP_CREATE_USERID] [nvarchar](30) NULL, + [APP_CREATE_USER_GUID] [char](32) NULL, + [APP_CREATE_USER_DIRECTORY] [nvarchar](30) NULL, + [APP_LAST_UPDATE_TIMESTAMP] [datetime2](7) NULL, + [APP_LAST_UPDATE_USERID] [nvarchar](30) NULL, + [APP_LAST_UPDATE_USER_GUID] [char](32) NULL, + [APP_LAST_UPDATE_USER_DIRECTORY] [nvarchar](30) NULL, + [DB_CREATE_USERID] [varchar](63) NULL, + [DB_CREATE_TIMESTAMP] [datetime2](7) NULL, + [DB_LAST_UPDATE_USERID] [varchar](63) NULL, + [DB_LAST_UPDATE_TIMESTAMP] [datetime2](7) NULL, + CONSTRAINT [PK_ORBC_CASE_DOCUMENT] PRIMARY KEY CLUSTERED ([CASE_DOCUMENT_ID] ASC) WITH ( + PAD_INDEX = OFF, + STATISTICS_NORECOMPUTE = OFF, + IGNORE_DUP_KEY = OFF, + ALLOW_ROW_LOCKS = ON, + ALLOW_PAGE_LOCKS = ON + ) ON [PRIMARY] + ) ON [PRIMARY] +GO + + +ALTER TABLE [case].[ORBC_CASE_DOCUMENT] + WITH CHECK ADD CONSTRAINT [FK_ORBC_CASE_DOCUMENT_CASE_ID] + FOREIGN KEY([CASE_ID]) + REFERENCES [case].[ORBC_CASE] ([CASE_ID]) +GO +ALTER TABLE [case].[ORBC_CASE_DOCUMENT] CHECK CONSTRAINT [FK_ORBC_CASE_DOCUMENT_CASE_ID] + +ALTER TABLE [case].[ORBC_CASE_DOCUMENT] + WITH CHECK ADD CONSTRAINT [FK_ORBC_CASE_DOCUMENT_CASE_EVENT_ID] + FOREIGN KEY([CASE_EVENT_ID]) + REFERENCES [case].[ORBC_CASE_EVENT] ([CASE_EVENT_ID]) +GO +ALTER TABLE [case].[ORBC_CASE_DOCUMENT] CHECK CONSTRAINT [FK_ORBC_CASE_DOCUMENT_CASE_EVENT_ID] + +-- Default values for audit columns (boilerplate) +IF @@ERROR <> 0 SET NOEXEC ON +GO +ALTER TABLE [case].[ORBC_CASE_DOCUMENT] ADD CONSTRAINT [DF_ORBC_CASE_DOCUMENT_DB_CREATE_USERID] DEFAULT (user_name()) FOR [DB_CREATE_USERID] + +IF @@ERROR <> 0 SET NOEXEC ON +GO +ALTER TABLE [case].[ORBC_CASE_DOCUMENT] ADD CONSTRAINT [DF_ORBC_CASE_DOCUMENT_DB_CREATE_TIMESTAMP] DEFAULT (getutcdate()) FOR [DB_CREATE_TIMESTAMP] + +IF @@ERROR <> 0 SET NOEXEC ON +GO +ALTER TABLE [case].[ORBC_CASE_DOCUMENT] ADD CONSTRAINT [DF_ORBC_CASE_DOCUMENT_DB_LAST_UPDATE_USERID] DEFAULT (user_name()) FOR [DB_LAST_UPDATE_USERID] + +IF @@ERROR <> 0 SET NOEXEC ON +GO +ALTER TABLE [case].[ORBC_CASE_DOCUMENT] ADD CONSTRAINT [DF_ORBC_CASE_DOCUMENT_DB_LAST_UPDATE_TIMESTAMP] DEFAULT (getutcdate()) FOR [DB_LAST_UPDATE_TIMESTAMP] + + +-- Descriptions for all ORBC_CASE_DOCUMENT columns +EXEC sys.sp_addextendedproperty + @name=N'MS_Description', + @value=N'Unique auto-generated surrogate primary key' , + @level0type=N'SCHEMA', + @level0name=N'case', + @level1type=N'TABLE', + @level1Name=N'ORBC_CASE_DOCUMENT', + @level2type=N'COLUMN', + @level2name=N'CASE_DOCUMENT_ID' +EXEC sys.sp_addextendedproperty + @name=N'MS_Description', + @value=N'Reference to ORBC_CASE.CASE_ID' , + @level0type=N'SCHEMA', + @level0name=N'case', + @level1type=N'TABLE', + @level1Name=N'ORBC_CASE_DOCUMENT', + @level2type=N'COLUMN', + @level2name=N'CASE_ID' +EXEC sys.sp_addextendedproperty + @name=N'MS_Description', + @value=N'Reference to ORBC_CASE_EVENT.CASE_EVENT_ID' , + @level0type=N'SCHEMA', + @level0name=N'case', + @level1type=N'TABLE', + @level1Name=N'ORBC_CASE_DOCUMENT', + @level2type=N'COLUMN', + @level2name=N'CASE_EVENT_ID' +EXEC sys.sp_addextendedproperty + @name=N'MS_Description', + @value=N'Reference to ORBC_DOCUMENT' , + @level0type=N'SCHEMA', + @level0name=N'case', + @level1type=N'TABLE', + @level1Name=N'ORBC_CASE_DOCUMENT', + @level2type=N'COLUMN', + @level2name=N'DOCUMENT_ID' + +-- Audit column descriptions (boilerplate) +EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Application code is responsible for retrieving the row and then incrementing the value of the CONCURRENCY_CONTROL_NUMBER column by one prior to issuing an update. If this is done then the update will succeed, provided that the row was not updated by any other transactions in the period between the read and the update operations.' , @level0type=N'SCHEMA',@level0name=N'case', @level1type=N'TABLE',@level1Name=N'ORBC_CASE_DOCUMENT', @level2type=N'COLUMN',@level2name=N'CONCURRENCY_CONTROL_NUMBER' +EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'The user or proxy account that created or last updated the record.' , @level0type=N'SCHEMA',@level0name=N'case', @level1type=N'TABLE',@level1Name=N'ORBC_CASE_DOCUMENT', @level2type=N'COLUMN',@level2name=N'DB_LAST_UPDATE_USERID' +EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'The date and time the record was created.' , @level0type=N'SCHEMA',@level0name=N'case', @level1type=N'TABLE',@level1Name=N'ORBC_CASE_DOCUMENT', @level2type=N'COLUMN',@level2name=N'DB_CREATE_TIMESTAMP' +EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'The user or proxy account that created the record.' , @level0type=N'SCHEMA',@level0name=N'case', @level1type=N'TABLE',@level1Name=N'ORBC_CASE_DOCUMENT', @level2type=N'COLUMN',@level2name=N'DB_CREATE_USERID' +EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'The date and time the record was created or last updated.' , @level0type=N'SCHEMA',@level0name=N'case', @level1type=N'TABLE',@level1Name=N'ORBC_CASE_DOCUMENT', @level2type=N'COLUMN',@level2name=N'DB_LAST_UPDATE_TIMESTAMP' + +CREATE SEQUENCE [case].[ORBC_CASE_DOCUMENT_H_ID_SEQ] AS [bigint] START WITH 1 INCREMENT BY 1 MINVALUE 1 MAXVALUE 2147483647 CACHE 50; + +CREATE TABLE [case].[ORBC_CASE_DOCUMENT_HIST]( + _CASE_DOCUMENT_HIST_ID [bigint] DEFAULT (NEXT VALUE FOR [case].[ORBC_CASE_DOCUMENT_H_ID_SEQ]) NOT NULL + ,EFFECTIVE_DATE_HIST [datetime] NOT NULL default getutcdate() + ,END_DATE_HIST [datetime] + , [CASE_DOCUMENT_ID] int NOT NULL, [CASE_ID] int NOT NULL, [CASE_EVENT_ID] int NOT NULL, [DOCUMENT_ID] bigint NOT NULL, [CONCURRENCY_CONTROL_NUMBER] int NULL, [APP_CREATE_TIMESTAMP] datetime2 NULL, [APP_CREATE_USERID] nvarchar(30) NULL, [APP_CREATE_USER_GUID] char(32) NULL, [APP_CREATE_USER_DIRECTORY] nvarchar(30) NULL, [APP_LAST_UPDATE_TIMESTAMP] datetime2 NULL, [APP_LAST_UPDATE_USERID] nvarchar(30) NULL, [APP_LAST_UPDATE_USER_GUID] char(32) NULL, [APP_LAST_UPDATE_USER_DIRECTORY] nvarchar(30) NULL, [DB_CREATE_USERID] varchar(63) NULL, [DB_CREATE_TIMESTAMP] datetime2 NULL, [DB_LAST_UPDATE_USERID] varchar(63) NULL, [DB_LAST_UPDATE_TIMESTAMP] datetime2 NULL + ) +ALTER TABLE [case].[ORBC_CASE_DOCUMENT_HIST] ADD CONSTRAINT ORBC_4_H_PK PRIMARY KEY CLUSTERED (_CASE_DOCUMENT_HIST_ID); +ALTER TABLE [case].[ORBC_CASE_DOCUMENT_HIST] ADD CONSTRAINT ORBC_4_H_UK UNIQUE (_CASE_DOCUMENT_HIST_ID,END_DATE_HIST) +go + +CREATE TRIGGER ORBC_CASE_DOCUMENT_A_S_IUD_TR ON [case].[ORBC_CASE_DOCUMENT] FOR INSERT, UPDATE, DELETE AS +SET NOCOUNT ON +BEGIN TRY +DECLARE @curr_date datetime; +SET @curr_date = getutcdate(); + IF NOT EXISTS(SELECT * FROM inserted) AND NOT EXISTS(SELECT * FROM deleted) + RETURN; + + -- historical + IF EXISTS(SELECT * FROM deleted) + update [case].[ORBC_CASE_DOCUMENT_HIST] set END_DATE_HIST = @curr_date where CASE_DOCUMENT_ID in (select CASE_DOCUMENT_ID from deleted) and END_DATE_HIST is null; + + IF EXISTS(SELECT * FROM inserted) + insert into [case].[ORBC_CASE_DOCUMENT_HIST] ([CASE_DOCUMENT_ID], [CASE_ID], [CASE_EVENT_ID], [DOCUMENT_ID], [CONCURRENCY_CONTROL_NUMBER], [APP_CREATE_TIMESTAMP], [APP_CREATE_USERID], [APP_CREATE_USER_GUID], [APP_CREATE_USER_DIRECTORY], [APP_LAST_UPDATE_TIMESTAMP], [APP_LAST_UPDATE_USERID], [APP_LAST_UPDATE_USER_GUID], [APP_LAST_UPDATE_USER_DIRECTORY], [DB_CREATE_USERID], [DB_CREATE_TIMESTAMP], [DB_LAST_UPDATE_USERID], [DB_LAST_UPDATE_TIMESTAMP], _CASE_DOCUMENT_HIST_ID, END_DATE_HIST, EFFECTIVE_DATE_HIST) + select [CASE_DOCUMENT_ID], [CASE_ID], [CASE_EVENT_ID], [DOCUMENT_ID], [CONCURRENCY_CONTROL_NUMBER], [APP_CREATE_TIMESTAMP], [APP_CREATE_USERID], [APP_CREATE_USER_GUID], [APP_CREATE_USER_DIRECTORY], [APP_LAST_UPDATE_TIMESTAMP], [APP_LAST_UPDATE_USERID], [APP_LAST_UPDATE_USER_GUID], [APP_LAST_UPDATE_USER_DIRECTORY], [DB_CREATE_USERID], [DB_CREATE_TIMESTAMP], [DB_LAST_UPDATE_USERID], [DB_LAST_UPDATE_TIMESTAMP], (next value for [case].[ORBC_CASE_DOCUMENT_H_ID_SEQ]) as [_CASE_DOCUMENT_HIST_ID], null as [END_DATE_HIST], @curr_date as [EFFECTIVE_DATE_HIST] from inserted; + +END TRY +BEGIN CATCH + IF @@trancount > 0 ROLLBACK TRANSACTION + EXEC orbc_error_handling +END CATCH; +go + +IF @@ERROR <> 0 SET NOEXEC ON +GO + +DECLARE @VersionDescription VARCHAR(255) +SET @VersionDescription = 'Case/Queue management and related Db objects.' + +INSERT [dbo].[ORBC_SYS_VERSION] ([VERSION_ID], [DESCRIPTION], [UPDATE_SCRIPT], [REVERT_SCRIPT], [RELEASE_DATE]) VALUES (42, @VersionDescription, '$(UPDATE_SCRIPT)', '$(REVERT_SCRIPT)', getutcdate()) +IF @@ERROR <> 0 SET NOEXEC ON +GO + +COMMIT TRANSACTION +GO +IF @@ERROR <> 0 SET NOEXEC ON +GO +DECLARE @Success AS BIT +SET @Success = 1 +SET NOEXEC OFF +IF (@Success = 1) PRINT 'The database update succeeded' +ELSE BEGIN + IF @@TRANCOUNT > 0 ROLLBACK TRANSACTION + PRINT 'The database update failed' +END +GO + diff --git a/database/mssql/test/versions/v_38_test.sh b/database/mssql/test/versions/v_38_test.sh index 90ec08f15..0dbdd2b5a 100644 --- a/database/mssql/test/versions/v_38_test.sh +++ b/database/mssql/test/versions/v_38_test.sh @@ -9,7 +9,7 @@ parse_options "${USAGE}" ${@} # TESTS_DIR variable set by the calling test-runner script. TEST_38_1_RESULT=$(/opt/mssql-tools/bin/sqlcmd -U ${USER} -P "${PASS}" -S ${SERVER} -v DB_NAME=${DATABASE} -h -1 -i ${TESTS_DIR}/v_38_1_test.sql | xargs) -# Returns 30 for an nvarchar(15) data type due to larger nvarchar storage +# Returns 24 for an nvarchar(12) data type due to larger nvarchar storage if [[ $TEST_38_1_RESULT -eq 24 ]]; then echo "Test 38.1 passed: CREDIT_ACCOUNT_NUMBER column length updated correctly" else diff --git a/vehicles/src/app.module.ts b/vehicles/src/app.module.ts index 2fda196fb..8fdf8bc37 100644 --- a/vehicles/src/app.module.ts +++ b/vehicles/src/app.module.ts @@ -38,6 +38,7 @@ import { PermitReceiptDocumentModule } from './modules/permit-application-paymen import { ShoppingCartModule } from './modules/shopping-cart/shopping-cart.module'; import { CreditAccountModule } from './modules/credit-account/credit-account.module'; import { SpecialAuthModule } from './modules/special-auth/special-auth.module'; +import { CaseManagementModule } from './modules/case-management/case-management.module'; const envPath = path.resolve(process.cwd() + '/../'); @@ -56,7 +57,7 @@ const envPath = path.resolve(process.cwd() + '/../'); const correlationId = req.headers['x-correlation-id']; return Array.isArray(correlationId) ? correlationId[0] - : correlationId ?? uuidv4(); + : (correlationId ?? uuidv4()); }, }, }), @@ -102,6 +103,7 @@ const envPath = path.resolve(process.cwd() + '/../'); CreditAccountModule, FeatureFlagsModule, SpecialAuthModule, + CaseManagementModule, ], controllers: [AppController], providers: [AppService], diff --git a/vehicles/src/common/constants/permit.constant.ts b/vehicles/src/common/constants/permit.constant.ts index afe5b7e3d..c1e5804ae 100644 --- a/vehicles/src/common/constants/permit.constant.ts +++ b/vehicles/src/common/constants/permit.constant.ts @@ -1,3 +1,5 @@ +import { PermitType } from '../enum/permit-type.enum'; + export const TROS_TERM = 30; export const TROS_PRICE_PER_TERM = 30; export const TROS_MIN_VALID_DURATION = 1; @@ -6,3 +8,7 @@ export const TROW_TERM = 30; export const TROW_PRICE_PER_TERM = 100; export const TROW_MIN_VALID_DURATION = 1; export const TROW_MAX_VALID_DURATION = 366; + +export const PERMIT_TYPES_FOR_QUEUE: readonly PermitType[] = [ + PermitType.SINGLE_TRIP_OVERSIZE, +]; diff --git a/vehicles/src/common/constraint/application-search.constraint.ts b/vehicles/src/common/constraint/application-search.constraint.ts new file mode 100644 index 000000000..8f367018e --- /dev/null +++ b/vehicles/src/common/constraint/application-search.constraint.ts @@ -0,0 +1,57 @@ +import { + ValidatorConstraint, + ValidatorConstraintInterface, + ValidationArguments, +} from 'class-validator'; +import { Nullable } from '../types/common'; +import { ApplicationSearch } from '../enum/application-search.enum'; + +@ValidatorConstraint({ name: 'ApplicationSearch', async: false }) +export class ApplicationSearchConstraint + implements ValidatorConstraintInterface +{ + validate( + value: ApplicationSearch | boolean | undefined, + args: ValidationArguments, + ) { + const fields = args.object as { + pendingPermits?: Nullable; + applicationsInQueue?: Nullable; + searchColumn?: Nullable; + searchString?: Nullable; + }; + if ( + fields.pendingPermits != undefined && + fields.applicationsInQueue !== undefined + ) { + return false; + } else if (fields.searchColumn && !fields.searchString) { + return false; + } + return true; + } + + defaultMessage(args: ValidationArguments) { + const message: string[] = []; + const fields = args.object as { + pendingPermits?: Nullable; + applicationsInQueue?: Nullable; + searchColumn?: Nullable; + searchString?: Nullable; + }; + if ( + fields.pendingPermits != undefined && + fields.applicationsInQueue !== undefined + ) { + message.push( + 'Both pendingPermits and applicationsInQueue cannot be set at the same time.', + ); + } + if (fields.searchColumn && !fields.searchString) { + message.push('searchString is required when searchColumn is defined.'); + } + if (message?.length) { + return message.join(', '); + } + } +} diff --git a/vehicles/src/common/constraint/case-activity-comment.constraint.ts b/vehicles/src/common/constraint/case-activity-comment.constraint.ts new file mode 100644 index 000000000..9027d972d --- /dev/null +++ b/vehicles/src/common/constraint/case-activity-comment.constraint.ts @@ -0,0 +1,30 @@ +import { + ValidatorConstraint, + ValidatorConstraintInterface, + ValidationArguments, +} from 'class-validator'; +import { CaseActivityType } from '../enum/case-activity-type.enum'; + +@ValidatorConstraint({ name: 'SuspendComment', async: false }) +export class CaseActivityCommentConstraint + implements ValidatorConstraintInterface +{ + validate(comment: string | undefined, args: ValidationArguments) { + const caseActivityType = ( + args.object as { + caseActivityType?: CaseActivityType; + } + ).caseActivityType; // Access the searchString property from the same object + + // If CaseActivityType.APPROVED or CaseActivityType.REJECTED , comment should exists + if (caseActivityType !== CaseActivityType.WITHDRAWN && !comment) { + return false; + } + + return true; + } + + defaultMessage() { + return `Comment is required when activity type is ${CaseActivityType.APPROVED} or ${CaseActivityType.REJECTED} `; + } +} diff --git a/vehicles/src/common/enum/application-search.enum.ts b/vehicles/src/common/enum/application-search.enum.ts new file mode 100644 index 000000000..af54f868c --- /dev/null +++ b/vehicles/src/common/enum/application-search.enum.ts @@ -0,0 +1,4 @@ +export enum ApplicationSearch { + PLATE = 'plate', + APPLICATION_NUMBER = 'applicationNumber', +} diff --git a/vehicles/src/common/enum/application-status.enum.ts b/vehicles/src/common/enum/application-status.enum.ts index dfe3d8e94..7b5f5ea27 100644 --- a/vehicles/src/common/enum/application-status.enum.ts +++ b/vehicles/src/common/enum/application-status.enum.ts @@ -5,6 +5,7 @@ export enum ApplicationStatus { IN_PROGRESS = 'IN_PROGRESS', IN_CART = 'IN_CART', REJECTED = 'REJECTED', + IN_QUEUE = 'IN_QUEUE', UNDER_REVIEW = 'UNDER_REVIEW', WAITING_APPROVAL = 'WAITING_APPROVAL', WAITING_PAYMENT = 'WAITING_PAYMENT', @@ -41,4 +42,5 @@ export const ALL_APPLICATION_STATUS: readonly ApplicationStatus[] = [ ApplicationStatus.IN_PROGRESS, ApplicationStatus.WAITING_PAYMENT, ApplicationStatus.PAYMENT_COMPLETE, + ApplicationStatus.IN_QUEUE, ]; diff --git a/vehicles/src/common/enum/case-activity-type.enum.ts b/vehicles/src/common/enum/case-activity-type.enum.ts new file mode 100644 index 000000000..9b773d4db --- /dev/null +++ b/vehicles/src/common/enum/case-activity-type.enum.ts @@ -0,0 +1,8 @@ +export const CaseActivityType = { + APPROVED: 'APPROVED', + REJECTED: 'REJECTED', + WITHDRAWN: 'WITHDRAWN', +} as const; + +export type CaseActivityType = + (typeof CaseActivityType)[keyof typeof CaseActivityType]; diff --git a/vehicles/src/common/enum/case-event-type.enum.ts b/vehicles/src/common/enum/case-event-type.enum.ts new file mode 100644 index 000000000..d0023bd49 --- /dev/null +++ b/vehicles/src/common/enum/case-event-type.enum.ts @@ -0,0 +1,14 @@ +export const CaseEventType = { + OPENED: 'OPENED', + CLOSED: 'CLOSED', + ASSIGNED: 'ASSIGNED', + WORKFLOW_STARTED: 'WORKFLOW_STARTED', + WORKFLOW_COMPLETED: 'WORKFLOW_COMPLETED', + CASE_WITHDRAWN: 'CASE_WITHDRAWN', + NOTE_CREATED: 'NOTE_CREATED', + DOCUMENT_ADDED: 'DOCUMENT_ADDED', + DOCUMENT_DELETED: 'DOCUMENT_DELETED', + NOTIFICATION: 'NOTIFICATION', +} as const; + +export type CaseEventType = (typeof CaseEventType)[keyof typeof CaseEventType]; diff --git a/vehicles/src/common/enum/case-status-type.enum.ts b/vehicles/src/common/enum/case-status-type.enum.ts new file mode 100644 index 000000000..52e228044 --- /dev/null +++ b/vehicles/src/common/enum/case-status-type.enum.ts @@ -0,0 +1,20 @@ +export const CaseStatusType = { + OPEN: 'OPEN', + CLOSED: 'CLOSED', + IN_PROGRESS: 'IN_PROGRESS', +} as const; + +export type CaseStatusType = + (typeof CaseStatusType)[keyof typeof CaseStatusType]; + +export const ApplicationQueueStatus = { + PENDING_REVIEW: 'PENDING_REVIEW', + IN_REVIEW: 'IN_REVIEW', + CLOSED: 'CLOSED', +} as const; + +export type ApplicationQueueStatus = + (typeof ApplicationQueueStatus)[keyof typeof ApplicationQueueStatus]; + +export const ACTIVE_APPLICATION_QUEUE_STATUS: readonly ApplicationQueueStatus[] = + [ApplicationQueueStatus.PENDING_REVIEW, ApplicationQueueStatus.IN_REVIEW]; diff --git a/vehicles/src/common/enum/case-type.enum.ts b/vehicles/src/common/enum/case-type.enum.ts new file mode 100644 index 000000000..2aedfbeed --- /dev/null +++ b/vehicles/src/common/enum/case-type.enum.ts @@ -0,0 +1,5 @@ +export const CaseType = { + DEFAULT: 'DEFAULT', +} as const; + +export type CaseType = (typeof CaseType)[keyof typeof CaseType]; diff --git a/vehicles/src/common/helper/database.helper.ts b/vehicles/src/common/helper/database.helper.ts index 493107609..72094953e 100644 --- a/vehicles/src/common/helper/database.helper.ts +++ b/vehicles/src/common/helper/database.helper.ts @@ -1,4 +1,7 @@ -import { DataSource, SelectQueryBuilder } from 'typeorm'; +import { DataSource, QueryRunner, SelectQueryBuilder } from 'typeorm'; +import { IUserJWT } from '../interface/user-jwt.interface'; +import { Base } from '../../modules/common/entities/base.entity'; +import { Nullable } from '../types/common'; export const callDatabaseSequence = async ( databaseSequenceName: string, @@ -78,3 +81,61 @@ export const paginate = ( query.offset((page - 1) * take).limit(take); } }; + +/** + * Sets the base properties of an entity based on the current user and operation type. + * If `update` is not provided or is false, it will only set the creation properties. + * Always sets the update properties regardless of the operation. + * + * @param entity - The entity to set the properties on. + * @param currentUser - The user who is making the current operation. + * @param update - Optional boolean flag indicating whether to update or create. + */ +export const setBaseEntityProperties = ({ + entity, + currentUser, + update, +}: { + entity: T; + currentUser: IUserJWT; + update?: Nullable; +}): void => { + if (!update) { + entity.createdUser = currentUser.userName; + entity.createdDateTime = new Date(); + entity.createdUserDirectory = currentUser.orbcUserDirectory; + entity.createdUserGuid = currentUser.userGUID; + } + + entity.updatedUser = currentUser.userName; + entity.updatedDateTime = new Date(); + entity.updatedUserDirectory = currentUser.orbcUserDirectory; + entity.updatedUserGuid = currentUser.userGUID; +}; + +/** + * Retrieves or creates a QueryRunner instance and manages transaction state. + * If a QueryRunner is not provided, this method creates one, connects it, + * starts a transaction, and marks it as a locally managed (i.e., not passed in). + * + * @param queryRunner - The existing QueryRunner instance, if any. + * @param dataSource - The DataSource used to create a new QueryRunner if none is supplied. + * @returns An object containing the QueryRunner instance and a flag indicating + * whether it is locally managed (i.e., newly created in this function). + */ +export const getQueryRunner = async ({ + queryRunner, + dataSource, +}: { + queryRunner?: Nullable; + dataSource: DataSource; +}): Promise<{ localQueryRunner: boolean; queryRunner: QueryRunner }> => { + let localQueryRunner = false; + if (!queryRunner) { + queryRunner = dataSource.createQueryRunner(); + await queryRunner.connect(); + await queryRunner.startTransaction(); + localQueryRunner = true; + } + return { localQueryRunner, queryRunner }; +}; diff --git a/vehicles/src/common/helper/permit-application.helper.ts b/vehicles/src/common/helper/permit-application.helper.ts index ed8bd8e70..63b591f2a 100644 --- a/vehicles/src/common/helper/permit-application.helper.ts +++ b/vehicles/src/common/helper/permit-application.helper.ts @@ -16,6 +16,8 @@ import { IDIR_USER_ROLE_LIST, UserRole } from '../enum/user-role.enum'; import { PPC_FULL_TEXT } from '../constants/api.constant'; import { User } from '../../modules/company-user-management/users/entities/user.entity'; import { ApplicationStatus } from '../enum/application-status.enum'; +import { PermitType } from '../enum/permit-type.enum'; +import { PERMIT_TYPES_FOR_QUEUE } from '../constants/permit.constant'; /** * Fetches and resolves various types of names associated with a permit using cache. @@ -249,3 +251,18 @@ export const isAmendmentApplication = ({ revision > 0 ); }; + +/** + * Checks if the given permit type is eligible to be added to a specific processing queue. + * This method essentially acts as a filter, determining whether the provided permit type + * exists in a predefined list of types that require additional processing in a queue. + + * @param {PermitType} permitType - The type of the permit being checked. + * @returns {boolean} - Returns true if the permit type is in the list of types + * that are eligible for the queue, otherwise returns false. + */ +export const isPermitTypeEligibleForQueue = ( + permitType: PermitType, +): boolean => { + return PERMIT_TYPES_FOR_QUEUE.includes(permitType); +}; diff --git a/vehicles/src/modules/case-management/case-management.module.ts b/vehicles/src/modules/case-management/case-management.module.ts new file mode 100644 index 000000000..b54f21b32 --- /dev/null +++ b/vehicles/src/modules/case-management/case-management.module.ts @@ -0,0 +1,24 @@ +import { Module } from '@nestjs/common'; +import { CaseManagementService } from './case-management.service'; +import { TypeOrmModule } from '@nestjs/typeorm'; +import { Case } from './entities/case.entity'; +import { CaseActivity } from './entities/case-activity.entity'; +import { CaseDocument } from './entities/case-document.entity'; +import { CaseNotes } from './entities/case-notes.entity'; +import { CaseEvent } from './entities/case-event.entity'; +import { CaseManagementProfile } from './profiles/case-management.profile'; + +@Module({ + imports: [ + TypeOrmModule.forFeature([ + Case, + CaseEvent, + CaseActivity, + CaseDocument, + CaseNotes, + ]), + ], + providers: [CaseManagementService, CaseManagementProfile], + exports: [CaseManagementService], +}) +export class CaseManagementModule {} diff --git a/vehicles/src/modules/case-management/case-management.service.ts b/vehicles/src/modules/case-management/case-management.service.ts new file mode 100644 index 000000000..66b21ecc2 --- /dev/null +++ b/vehicles/src/modules/case-management/case-management.service.ts @@ -0,0 +1,767 @@ +import { Injectable, Logger } from '@nestjs/common'; +import { InjectRepository } from '@nestjs/typeorm'; +import { Case } from './entities/case.entity'; +import { DataSource, QueryRunner, Repository } from 'typeorm'; +import { IUserJWT } from '../../common/interface/user-jwt.interface'; +import { Nullable } from '../../common/types/common'; +import { LogAsyncMethodExecution } from '../../common/decorator/log-async-method-execution.decorator'; +import { CaseType } from '../../common/enum/case-type.enum'; +import { CaseStatusType } from '../../common/enum/case-status-type.enum'; +import { Permit } from '../permit-application-payment/permit/entities/permit.entity'; +import { CaseEvent } from './entities/case-event.entity'; +import { CaseEventType } from '../../common/enum/case-event-type.enum'; +import { User } from '../company-user-management/users/entities/user.entity'; +import { throwUnprocessableEntityException } from '../../common/helper/exception.helper'; +import { + getQueryRunner, + setBaseEntityProperties, +} from '../../common/helper/database.helper'; +import { DataNotFoundException } from '../../common/exception/data-not-found.exception'; +import { CaseActivity } from './entities/case-activity.entity'; +import { CaseActivityType } from '../../common/enum/case-activity-type.enum'; +import { CaseNotes } from './entities/case-notes.entity'; +import { InjectMapper } from '@automapper/nestjs'; +import { Mapper } from '@automapper/core'; +import { ReadCaseEvenDto } from './dto/response/read-case-event.dto'; + +@Injectable() +export class CaseManagementService { + private readonly logger = new Logger(CaseManagementService.name); + constructor( + @InjectMapper() private readonly classMapper: Mapper, + private dataSource: DataSource, + @InjectRepository(Case) + private readonly caseRepository: Repository, + ) {} + + /** + * Creates a new case event instance and sets the base entity properties, + * such as `eventDate` and `user`, using the provided `caseEntity`, + * `caseEventType`, and `currentUser`. + * + * @param caseEntity - The `Case` entity to which the event is associated. + * @param caseEventType - The type of event to log (e.g., OPENED, CLOSED). + * @param currentUser - The current user performing the action, captured in the event. + * @returns Returns a new `CaseEvent` object set with the given parameters. + */ + private createEvent( + caseEntity: Case, + caseEventType: CaseEventType, + currentUser: IUserJWT, + ) { + const newEvent = new CaseEvent(); + newEvent.case = caseEntity; + newEvent.caseEventType = caseEventType; + newEvent.eventDate = new Date(); + newEvent.user = new User(); + newEvent.user.userGUID = currentUser.userGUID; + setBaseEntityProperties({ entity: newEvent, currentUser }); + return newEvent; + } + + /** + * Finds the latest `Case` entity based on a combination of `caseId`, `originalCaseId`, and `applicationId`. + * If a matching case is found, it returns the existing case; otherwise, it returns `undefined`. + * + * @param queryRunner - Optional, an existing QueryRunner, typically part of a larger transaction. + * @param caseId - Optional, the ID of the case to find. + * @param originalCaseId - Optional, the original ID of the case to find. + * @param applicationId - Optional, the ID of the permit associated with the case. + * @returns A `Promise>` which resolves to the latest matching `Case`, or `undefined` if not found. + */ + @LogAsyncMethodExecution() + async findLatest({ + queryRunner, + caseId, + originalCaseId, + applicationId, + }: { + queryRunner: QueryRunner; + caseId?: Nullable; + originalCaseId?: Nullable; + applicationId?: Nullable; + }) { + return await queryRunner.manager.findOne(Case, { + where: [ + { caseId: caseId }, + { originalCaseId: originalCaseId }, + { permit: { permitId: applicationId } }, + ], + order: { caseId: { direction: 'DESC' } }, + }); + } + + /** + * Opens a new case if an existing case with the same applicationId is closed. + * This method checks if the existing case is closed, creates a new case, and then logs + * an event indicating the case has been opened. + * + * @param currentUser - The current user executing the action. + * @param queryRunner - Optional, existing QueryRunner instance. + * @param applicationId - The ID of the permit associated with the new case. + * @returns A `Promise` object containing the event details of the opened case. + * @throws `DataNotFoundException` - If the existing case is not closed, the operation will not proceed. + */ + @LogAsyncMethodExecution() + async openCase({ + currentUser, + queryRunner, + applicationId, + }: { + currentUser: IUserJWT; + queryRunner?: Nullable; + applicationId: string; + }): Promise { + let localQueryRunner = true; + ({ localQueryRunner, queryRunner } = await getQueryRunner({ + queryRunner, + dataSource: this.dataSource, + })); + try { + const existingCase = await this.findLatest({ + queryRunner, + applicationId, + }); + if ( + existingCase && + existingCase?.caseStatusType !== CaseStatusType.CLOSED + ) { + throwUnprocessableEntityException( + 'An active case exists for the given application id', + ); + } + let newCase = new Case(); + newCase.caseType = CaseType.DEFAULT; + newCase.caseStatusType = CaseStatusType.OPEN; + newCase.permit = new Permit(); + newCase.permit.permitId = applicationId; + newCase.previousCaseId = existingCase?.caseId; + newCase.originalCaseId = existingCase?.originalCaseId; + setBaseEntityProperties({ entity: newCase, currentUser }); + newCase = await queryRunner.manager.save(newCase); + newCase.originalCaseId = newCase.originalCaseId ?? newCase.caseId; + newCase = await queryRunner.manager.save(newCase); + + let newEvent = this.createEvent( + newCase, + CaseEventType.OPENED, + currentUser, + ); + newEvent = await queryRunner.manager.save(newEvent); + if (localQueryRunner) { + await queryRunner.commitTransaction(); + } + return await this.classMapper.mapAsync( + newEvent, + CaseEvent, + ReadCaseEvenDto, + ); + } catch (error) { + if (localQueryRunner) { + await queryRunner.rollbackTransaction(); + } + this.logger.error(error); + throw error; + } finally { + if (localQueryRunner) { + await queryRunner.release(); + } + } + } + + /** + * Closes an existing case in the system by updating its status to `CLOSED`. + * If no existing case is provided, it will attempt to load the case based on + * the provided identifiers (caseId, originalCaseId, applicationId). + * Also, ensures a new event is created to log this operation. + * + * @param currentUser - The current user executing the action. + * @param queryRunner - Optional, existing QueryRunner instance. + * @param caseId - Optional, the ID of the case to close. + * @param originalCaseId - Optional, the original ID of the case. + * @param applicationId - Optional, the ID of the permit associated with the case. + * @param existingCase - Optional, the instance of the case to be closed. + * @returns A `Promise` object containing the event details of the closed case. + * @throws `DataNotFoundException` - If case cannot be found or does not exist. + * @throws `UnprocessableEntityException` - If the case is already closed. + */ + @LogAsyncMethodExecution() + async closeCase({ + currentUser, + queryRunner, + caseId, + originalCaseId, + applicationId, + existingCase, + }: { + currentUser: IUserJWT; + queryRunner?: Nullable; + caseId?: Nullable; + originalCaseId?: Nullable; + applicationId?: Nullable; + existingCase?: Nullable; + }): Promise { + let localQueryRunner = true; + ({ localQueryRunner, queryRunner } = await getQueryRunner({ + queryRunner, + dataSource: this.dataSource, + })); + try { + if (!existingCase) { + existingCase = await this.findLatest({ + queryRunner, + caseId, + originalCaseId, + applicationId, + }); + } + if (!existingCase) { + throw new DataNotFoundException(); + } else if (existingCase.caseStatusType === CaseStatusType.CLOSED) { + throwUnprocessableEntityException( + 'Invalid status. Case is already closed', + ); + } + + existingCase.caseStatusType = CaseStatusType.CLOSED; //Rename to CaseStatusType + setBaseEntityProperties({ + entity: existingCase, + currentUser, + update: true, + }); + existingCase = await queryRunner.manager.save(existingCase); + let newEvent = this.createEvent( + existingCase, + CaseEventType.CLOSED, + currentUser, + ); + newEvent = await queryRunner.manager.save(newEvent); + + if (localQueryRunner) { + await queryRunner.commitTransaction(); + } + return await this.classMapper.mapAsync( + newEvent, + CaseEvent, + ReadCaseEvenDto, + ); + } catch (error) { + if (localQueryRunner) { + await queryRunner.rollbackTransaction(); + } + this.logger.error(error); + throw error; + } finally { + if (localQueryRunner) { + await queryRunner.release(); + } + } + } + + /** + * Assigns a user to an existing case, updates the case's assigned user, and logs the assignment event. + * If the case does not exist or is already closed, it throws appropriate exceptions. Optionally, + * starts a workflow if the case is in an open state. + * + * @param currentUser - The current user executing the action. + * @param queryRunner - Optional, existing QueryRunner instance. + * @param caseId - Optional, the ID of the case to be assigned. + * @param originalCaseId - Optional, the original ID of the case. + * @param applicationId - Optional, the ID of the permit associated with the case. + * @param existingCase - Optional, the existing `Case` entity to be assigned. + * @returns A `Promise` object containing the event details of the assignment. + * @throws `DataNotFoundException` - If the case cannot be found or does not exist. + * @throws `UnprocessableEntityException` - If the case is already closed. + */ + @LogAsyncMethodExecution() + async assignCase({ + currentUser, + queryRunner, + caseId, + originalCaseId, + applicationId, + existingCase, + }: { + currentUser: IUserJWT; + queryRunner?: Nullable; + caseId?: Nullable; + originalCaseId?: Nullable; + applicationId?: Nullable; + existingCase?: Nullable; + }): Promise { + let localQueryRunner = true; + ({ localQueryRunner, queryRunner } = await getQueryRunner({ + queryRunner, + dataSource: this.dataSource, + })); + try { + if (!existingCase) { + existingCase = await this.findLatest({ + queryRunner, + caseId, + originalCaseId, + applicationId, + }); + } + if (!existingCase) { + throw new DataNotFoundException(); + } else if (existingCase.caseStatusType === CaseStatusType.CLOSED) { + throwUnprocessableEntityException( + 'Invalid status. Case is already closed', + ); + } + + existingCase.assignedUser = new User(); + existingCase.assignedUser.userGUID = currentUser.userGUID; //TODO: In future, get the userGuid in request payload + setBaseEntityProperties({ + entity: existingCase, + currentUser, + update: true, + }); + existingCase = await queryRunner.manager.save(existingCase); + + let newEvent = this.createEvent( + existingCase, + CaseEventType.ASSIGNED, + currentUser, + ); + newEvent = await queryRunner.manager.save(newEvent); + if (existingCase.caseStatusType === CaseStatusType.OPEN) { + await this.workflowStart({ + currentUser, + queryRunner, + existingCase, + }); + } + if (localQueryRunner) { + await queryRunner.commitTransaction(); + } + return await this.classMapper.mapAsync( + newEvent, + CaseEvent, + ReadCaseEvenDto, + ); + } catch (error) { + if (localQueryRunner) { + await queryRunner.rollbackTransaction(); + } + this.logger.error(error); + throw error; + } finally { + if (localQueryRunner) { + await queryRunner.release(); + } + } + } + + /** + * Starts the workflow for an existing case by changing its status to `IN_PROGRESS`. + * It first retrieves or verifies the existence of the `Case` based on provided identifiers. + * If the case does not exist or is closed, an appropriate exception is thrown. + * On successful execution, the method logs the workflow start event. + * + * @param currentUser - The current user executing the action. + * @param queryRunner - Optional, existing QueryRunner instance. + * @param caseId - Optional, the ID of the case. + * @param originalCaseId - Optional, the original ID of the case. + * @param applicationId - Optional, the ID of the permit associated with the case. + * @param existingCase - Optional, the existing `Case` entity. If not provided, it will be retrieved. + * @returns A `Promise` object containing the event details of the started workflow. + * @throws `DataNotFoundException` - If the case cannot be found or does not exist. + * @throws `UnprocessableEntityException` - If the case is already closed or not open. + */ + @LogAsyncMethodExecution() + async workflowStart({ + currentUser, + queryRunner, + caseId, + originalCaseId, + applicationId, + existingCase, + }: { + currentUser: IUserJWT; + queryRunner?: Nullable; + caseId?: Nullable; + originalCaseId?: Nullable; + applicationId?: Nullable; + existingCase?: Nullable; + }): Promise { + let localQueryRunner = true; + ({ localQueryRunner, queryRunner } = await getQueryRunner({ + queryRunner, + dataSource: this.dataSource, + })); + try { + if (!existingCase) { + existingCase = await this.findLatest({ + queryRunner, + caseId, + originalCaseId, + applicationId, + }); + } + if (!existingCase) { + throw new DataNotFoundException(); + } else if (existingCase.caseStatusType === CaseStatusType.CLOSED) { + throwUnprocessableEntityException( + 'Invalid status. Case is already closed', + ); + } else if (existingCase.caseStatusType !== CaseStatusType.OPEN) { + throwUnprocessableEntityException( + 'Cannot start workflow. Invalid status.', + ); + } + + existingCase.caseStatusType = CaseStatusType.IN_PROGRESS; + setBaseEntityProperties({ + entity: existingCase, + currentUser, + update: true, + }); + existingCase = await queryRunner.manager.save(existingCase); + + let newEvent = this.createEvent( + existingCase, + CaseEventType.WORKFLOW_STARTED, + currentUser, + ); + newEvent = await queryRunner.manager.save(newEvent); + + if (localQueryRunner) { + await queryRunner.commitTransaction(); + } + return await this.classMapper.mapAsync( + newEvent, + CaseEvent, + ReadCaseEvenDto, + ); + } catch (error) { + if (localQueryRunner) { + await queryRunner.rollbackTransaction(); + } + this.logger.error(error); + throw error; + } finally { + if (localQueryRunner) { + await queryRunner.release(); + } + } + } + + /** + * Completes the workflow for an existing case by changing its status from `IN_PROGRESS` to `CLOSED`. + * It checks the current status of the case, creates any necessary notes, logs the workflow completion event, + * and saves the corresponding activities. If the case is already closed or not in progress, appropriate + * exceptions are thrown. + * + * @param currentUser - The current user executing the action. + * @param queryRunner - Optional, existing QueryRunner instance. + * @param caseId - Optional, the ID of the case. + * @param originalCaseId - Optional, the original ID of the case. + * @param applicationId - Optional, the ID of the permit associated with the case. + * @param existingCase - Optional, the existing `Case` entity. If not provided, it will be retrieved. + * @param caseActivityType - The type of case activity to log. + * @param comment - Optional, a comment to add as notes during this workflow. + * @returns A `Promise` object containing the event details of the completed workflow. + * @throws `DataNotFoundException` - If the case cannot be found or does not exist. + * @throws `UnprocessableEntityException` - If the case is already closed or is not in progress. + */ + @LogAsyncMethodExecution() + async workflowEnd({ + currentUser, + queryRunner, + caseId, + originalCaseId, + applicationId, + existingCase, + caseActivityType, + comment, + }: { + currentUser: IUserJWT; + queryRunner?: Nullable; + caseId?: Nullable; + originalCaseId?: Nullable; + applicationId?: Nullable; + existingCase?: Nullable; + caseActivityType: CaseActivityType; + comment?: Nullable; + }): Promise { + let localQueryRunner = true; + ({ localQueryRunner, queryRunner } = await getQueryRunner({ + queryRunner, + dataSource: this.dataSource, + })); + try { + if (!existingCase) { + existingCase = await this.findLatest({ + queryRunner, + caseId, + originalCaseId, + applicationId, + }); + } + if (!existingCase) { + throw new DataNotFoundException(); + } else if (existingCase.caseStatusType === CaseStatusType.CLOSED) { + throwUnprocessableEntityException( + 'Invalid status. Case is already closed', + ); + } else if (existingCase.caseStatusType !== CaseStatusType.IN_PROGRESS) { + throwUnprocessableEntityException( + 'Cannot complete workflow. Invalid status.', + ); + } + + let caseNotes: CaseNotes; + if (comment) { + caseNotes = await this.addNotes({ + currentUser, + queryRunner, + existingCase, + comment, + }); + } + + let newEvent = this.createEvent( + existingCase, + CaseEventType.WORKFLOW_COMPLETED, + currentUser, + ); + newEvent = await queryRunner.manager.save(newEvent); + + const newActivity = new CaseActivity(); + newActivity.case = existingCase; + newActivity.caseEvent = newEvent; + newActivity.caseActivityType = caseActivityType; + newActivity.dateTime = new Date(); + setBaseEntityProperties({ entity: newActivity, currentUser }); + if (comment) { + newActivity.caseNotes = caseNotes; + } + await queryRunner.manager.save(newActivity); + + if (existingCase.caseStatusType === CaseStatusType.IN_PROGRESS) { + await this.closeCase({ + currentUser, + queryRunner, + existingCase, + }); + } + + if (localQueryRunner) { + await queryRunner.commitTransaction(); + } + return await this.classMapper.mapAsync( + newEvent, + CaseEvent, + ReadCaseEvenDto, + ); + } catch (error) { + if (localQueryRunner) { + await queryRunner.rollbackTransaction(); + } + this.logger.error(error); + throw error; + } finally { + if (localQueryRunner) { + await queryRunner.release(); + } + } + } + + /** + * Withdraws an existing case by first ensuring the current case status is valid for withdrawal. + * If the case has already been closed or is in progress, an appropriate exception is thrown. + * The method creates a withdrawal event, logs the withdrawal activity, and finally closes the case. + * + * @param currentUser - The current user executing the withdrawal action. + * @param queryRunner - Optional, existing QueryRunner instance used in the transaction process. + * @param caseId - Optional, the ID of the case to be withdrawn. Can be used to retrieve the existing case. + * @param originalCaseId - Optional, the original ID of the case to be withdrawn. Useful in lookup scenarios. + * @param applicationId - Optional, the ID of the permit application associated with the case. + * @param existingCase - Optional, the pre-loaded `Case` entity, if provided, will be used directly. + * @returns A `Promise` object containing the event details of the withdrawn case. + * @throws `DataNotFoundException` - If the case cannot be found or does not exist. + * @throws `UnprocessableEntityException` - If the case is already closed or in progress. + */ + @LogAsyncMethodExecution() + async caseWithdrawn({ + currentUser, + queryRunner, + caseId, + originalCaseId, + applicationId, + existingCase, + }: { + currentUser: IUserJWT; + queryRunner?: Nullable; + caseId?: Nullable; + originalCaseId?: Nullable; + applicationId?: Nullable; + existingCase?: Nullable; + }): Promise { + let localQueryRunner = true; + ({ localQueryRunner, queryRunner } = await getQueryRunner({ + queryRunner, + dataSource: this.dataSource, + })); + try { + if (!existingCase) { + existingCase = await this.findLatest({ + queryRunner, + caseId, + originalCaseId, + applicationId, + }); + } + if (!existingCase) { + throw new DataNotFoundException(); + } else if (existingCase.caseStatusType === CaseStatusType.CLOSED) { + throwUnprocessableEntityException( + 'Invalid status. Case is already closed', + ); + } else if (existingCase.caseStatusType === CaseStatusType.IN_PROGRESS) { + throwUnprocessableEntityException( + 'Unable to withdraw the application in review', + ); + } + + let newEvent = this.createEvent( + existingCase, + CaseEventType.CASE_WITHDRAWN, + currentUser, + ); + newEvent = await queryRunner.manager.save(newEvent); + + const newActivity = new CaseActivity(); + newActivity.case = existingCase; + newActivity.caseEvent = newEvent; + newActivity.caseActivityType = CaseActivityType.WITHDRAWN; + newActivity.dateTime = new Date(); + setBaseEntityProperties({ entity: newActivity, currentUser }); + await queryRunner.manager.save(newActivity); + + await this.closeCase({ + currentUser, + queryRunner, + existingCase, + }); + + if (localQueryRunner) { + await queryRunner.commitTransaction(); + } + return await this.classMapper.mapAsync( + newEvent, + CaseEvent, + ReadCaseEvenDto, + ); + } catch (error) { + if (localQueryRunner) { + await queryRunner.rollbackTransaction(); + } + this.logger.error(error); + throw error; + } finally { + if (localQueryRunner) { + await queryRunner.release(); + } + } + } + + /** + * Adds a note to an existing case by creating a new `CaseEvent` and `CaseNotes` record. + * If an existing case is not provided, it attempts to find one using the provided + * case identifiers (`caseId`, `originalCaseId`, `applicationId`). Ensures that only cases + * with an 'IN_PROGRESS' status can have notes added; otherwise, an exception is thrown. + * + * @param currentUser - The current user executing the action. + * @param queryRunner - Optional, existing QueryRunner instance. + * @param caseId - Optional, the ID of the case to retrieve if `existingCase` is not provided. + * @param originalCaseId - Optional, the original ID of the case to retrieve. + * @param applicationId - Optional, the ID of the permit associated with the case. + * @param existingCase - Optional, the instance of the case to which the note will be added. + * @param comment - Optional, the comment content of the note. + * @returns A `Promise` object containing the details of the added note. + * @throws `DataNotFoundException` - If the case cannot be found or does not exist. + * @throws `UnprocessableEntityException` - If the case is closed or not in progress. + */ + @LogAsyncMethodExecution() + async addNotes({ + currentUser, + queryRunner, + caseId, + originalCaseId, + applicationId, + existingCase, + comment, + }: { + currentUser: IUserJWT; + queryRunner?: Nullable; + caseId?: Nullable; + originalCaseId?: Nullable; + applicationId?: Nullable; + existingCase?: Nullable; + comment?: Nullable; + }): Promise { + let localQueryRunner = true; + ({ localQueryRunner, queryRunner } = await getQueryRunner({ + queryRunner, + dataSource: this.dataSource, + })); + if (!existingCase) { + existingCase = await queryRunner.manager.findOne(Case, { + where: [ + { caseId: caseId }, + { originalCaseId: originalCaseId }, + { permit: { permitId: applicationId } }, + ], + order: { caseId: { direction: 'DESC' } }, + }); + } + if (!existingCase) { + throw new DataNotFoundException(); + } + if (existingCase.caseStatusType === CaseStatusType.CLOSED) { + throwUnprocessableEntityException( + 'Invalid status. Case is already closed', + ); + } else if (existingCase.caseStatusType !== CaseStatusType.IN_PROGRESS) { + throwUnprocessableEntityException('Cannot add notes. Invalid status.'); + } + try { + let newEvent = this.createEvent( + existingCase, + CaseEventType.NOTE_CREATED, + currentUser, + ); + newEvent = await queryRunner.manager.save(newEvent); + + let newCaseNotes = new CaseNotes(); + newCaseNotes.case = existingCase; + newCaseNotes.caseEvent = newEvent; + newCaseNotes.comment = comment; + newCaseNotes.user = new User(); + newCaseNotes.user.userGUID = currentUser.userGUID; + newCaseNotes.notesDate = new Date(); + setBaseEntityProperties({ entity: newCaseNotes, currentUser }); + + newCaseNotes = await queryRunner.manager.save(newCaseNotes); + + if (localQueryRunner) { + await queryRunner.commitTransaction(); + } + + return newCaseNotes; + } catch (error) { + if (localQueryRunner) { + await queryRunner.rollbackTransaction(); + } + this.logger.error(error); + throw error; + } finally { + if (localQueryRunner) { + await queryRunner.release(); + } + } + } +} diff --git a/vehicles/src/modules/case-management/dto/response/read-case-event.dto.ts b/vehicles/src/modules/case-management/dto/response/read-case-event.dto.ts new file mode 100644 index 000000000..2c6fe9bc2 --- /dev/null +++ b/vehicles/src/modules/case-management/dto/response/read-case-event.dto.ts @@ -0,0 +1,28 @@ +import { AutoMap } from '@automapper/classes'; +import { ApiProperty } from '@nestjs/swagger'; +import { CaseEventType } from '../../../../common/enum/case-event-type.enum'; + +export class ReadCaseEvenDto { + @AutoMap() + @ApiProperty({ + description: + 'The unique identifier for the credit account status update activity linked to this user.', + example: 4527, + }) + caseEventId: number; + + @AutoMap() + @ApiProperty({ + description: 'The type of event that occurred in the credit account.', + example: CaseEventType.OPENED, + }) + caseEventType: CaseEventType; + + @AutoMap() + @ApiProperty({ + description: + 'The date and time when the credit account activity took place.', + example: '2023-10-11T23:26:51.170Z', + }) + eventDate: string; +} diff --git a/vehicles/src/modules/case-management/entities/case-activity.entity.ts b/vehicles/src/modules/case-management/entities/case-activity.entity.ts new file mode 100644 index 000000000..b4abf8244 --- /dev/null +++ b/vehicles/src/modules/case-management/entities/case-activity.entity.ts @@ -0,0 +1,69 @@ +import { + Column, + Entity, + JoinColumn, + ManyToOne, + OneToOne, + PrimaryGeneratedColumn, +} from 'typeorm'; +import { AutoMap } from '@automapper/classes'; +import { Base } from '../../common/entities/base.entity'; +import { Case } from './case.entity'; +import { User } from '../../company-user-management/users/entities/user.entity'; +import { CaseEvent } from './case-event.entity'; +import { Nullable } from '../../../common/types/common'; +import { CaseNotes } from './case-notes.entity'; +import { CaseActivityType } from '../../../common/enum/case-activity-type.enum'; + +@Entity({ name: 'case.ORBC_CASE_ACTIVITY' }) +export class CaseActivity extends Base { + /** + * An auto-generated unique identifier for the case events. + */ + @AutoMap() + @PrimaryGeneratedColumn({ type: 'int', name: 'CASE_ACTIVITY_ID' }) + caseActivityId: number; + + @AutoMap() + @ManyToOne(() => Case, (Case) => Case.caseActivity, { + eager: true, + cascade: false, + }) + @JoinColumn({ name: 'CASE_ID' }) + case: Case; + + @AutoMap() + @OneToOne(() => CaseEvent, (caseEvent) => caseEvent.caseActivity) + @JoinColumn({ name: 'CASE_EVENT_ID' }) + caseEvent: CaseEvent; + + @AutoMap() + @Column({ + type: 'simple-enum', + enum: CaseActivityType, + length: 10, + name: 'CASE_ACTIVITY_TYPE', + nullable: false, + }) + caseActivityType: CaseActivityType; + + @AutoMap() + @OneToOne(() => CaseNotes, (caseNotes) => caseNotes.caseActivity, { + cascade: false, + eager: false, + }) + @JoinColumn({ name: 'CASE_NOTES_ID' }) + caseNotes?: Nullable; + + @AutoMap() + @Column({ + name: 'DATETIME', + nullable: false, + }) + dateTime: Date; + + @AutoMap() + @ManyToOne(() => User, { eager: true, cascade: false, nullable: true }) + @JoinColumn({ name: 'USER_GUID' }) + user?: Nullable; +} diff --git a/vehicles/src/modules/case-management/entities/case-document.entity.ts b/vehicles/src/modules/case-management/entities/case-document.entity.ts new file mode 100644 index 000000000..443e91e72 --- /dev/null +++ b/vehicles/src/modules/case-management/entities/case-document.entity.ts @@ -0,0 +1,66 @@ +import { + Column, + Entity, + JoinColumn, + ManyToOne, + OneToOne, + PrimaryGeneratedColumn, +} from 'typeorm'; +import { AutoMap } from '@automapper/classes'; +import { Base } from '../../common/entities/base.entity'; +import { Case } from './case.entity'; +import { User } from '../../company-user-management/users/entities/user.entity'; +import { CaseEvent } from './case-event.entity'; +import { Nullable } from '../../../common/types/common'; +import { CaseNotes } from './case-notes.entity'; +import { CaseActivityType } from '../../../common/enum/case-activity-type.enum'; + +@Entity({ name: 'case.ORBC_CASE_ACTIVITY' }) +export class CaseDocument extends Base { + /** + * An auto-generated unique identifier for the case document. + */ + @AutoMap() + @PrimaryGeneratedColumn({ type: 'int', name: 'CASE_DOCUMENT_ID' }) + caseDocumentId: number; + + @AutoMap() + @ManyToOne(() => Case, (Case) => Case.caseDocuments, { + eager: true, + cascade: false, + }) + @JoinColumn({ name: 'CASE_ID' }) + case: Case; + + @AutoMap() + @OneToOne(() => CaseEvent, (caseEvent) => caseEvent.caseDocument) + @JoinColumn({ name: 'CASE_EVENT_ID' }) + caseEvent: CaseEvent; + + @AutoMap() + @Column({ + type: 'simple-enum', + enum: CaseActivityType, + length: 10, + name: 'CASE_ACTIVITY_TYPE', + nullable: false, + }) + caseActivityType: CaseActivityType; + + @AutoMap() + @OneToOne(() => CaseNotes, (caseNotes) => caseNotes.caseActivity) + @JoinColumn({ name: 'CASE_NOTES_ID' }) + caseNotes: CaseNotes; + + @AutoMap() + @Column({ + name: 'DATETIME', + nullable: false, + }) + dateTime: Date; + + @AutoMap() + @ManyToOne(() => User, { eager: true, cascade: false, nullable: true }) + @JoinColumn({ name: 'USER_GUID' }) + user?: Nullable; +} diff --git a/vehicles/src/modules/case-management/entities/case-event.entity.ts b/vehicles/src/modules/case-management/entities/case-event.entity.ts new file mode 100644 index 000000000..ffe5337f7 --- /dev/null +++ b/vehicles/src/modules/case-management/entities/case-event.entity.ts @@ -0,0 +1,72 @@ +import { + Column, + Entity, + JoinColumn, + ManyToOne, + OneToOne, + PrimaryGeneratedColumn, +} from 'typeorm'; +import { AutoMap } from '@automapper/classes'; +import { Base } from '../../common/entities/base.entity'; +import { Case } from './case.entity'; +import { CaseEventType } from '../../../common/enum/case-event-type.enum'; +import { User } from '../../company-user-management/users/entities/user.entity'; +import { CaseNotes } from './case-notes.entity'; +import { CaseActivity } from './case-activity.entity'; +import { Nullable } from '../../../common/types/common'; +import { CaseDocument } from './case-document.entity'; + +@Entity({ name: 'case.ORBC_CASE_EVENT' }) +export class CaseEvent extends Base { + /** + * An auto-generated unique identifier for the case events. + */ + @AutoMap() + @PrimaryGeneratedColumn({ type: 'int', name: 'CASE_EVENT_ID' }) + caseEventId: number; + + @AutoMap() + @ManyToOne(() => Case, (Case) => Case.events, { eager: true, cascade: false }) + @JoinColumn({ name: 'CASE_ID' }) + case: Case; + + @AutoMap() + @Column({ + type: 'simple-enum', + enum: CaseEventType, + length: 20, + name: 'CASE_EVENT_TYPE', + nullable: false, + }) + caseEventType: CaseEventType; + + @AutoMap() + @Column({ + name: 'EVENT_DATE', + nullable: false, + }) + eventDate: Date; + + @AutoMap() + @ManyToOne(() => User, { eager: true, cascade: false, nullable: true }) + @JoinColumn({ name: 'EVENT_USER_GUID' }) + user?: Nullable; + + @AutoMap() + @OneToOne(() => CaseNotes, (caseNotes) => caseNotes.caseEvent, { + eager: false, + }) + caseNotes?: Nullable; + + @AutoMap() + @OneToOne(() => CaseActivity, (caseActivity) => caseActivity.caseEvent, { + eager: false, + }) + caseActivity?: Nullable; + + @AutoMap() + @OneToOne(() => CaseDocument, (caseDocument) => caseDocument.caseEvent, { + eager: false, + }) + caseDocument?: Nullable; +} diff --git a/vehicles/src/modules/case-management/entities/case-notes.entity.ts b/vehicles/src/modules/case-management/entities/case-notes.entity.ts new file mode 100644 index 000000000..0e6b2c5f7 --- /dev/null +++ b/vehicles/src/modules/case-management/entities/case-notes.entity.ts @@ -0,0 +1,60 @@ +import { + Column, + Entity, + JoinColumn, + ManyToOne, + OneToOne, + PrimaryGeneratedColumn, +} from 'typeorm'; +import { AutoMap } from '@automapper/classes'; +import { Base } from '../../common/entities/base.entity'; +import { Case } from './case.entity'; +import { User } from '../../company-user-management/users/entities/user.entity'; +import { CaseEvent } from './case-event.entity'; +import { Nullable } from '../../../common/types/common'; +import { CaseActivity } from './case-activity.entity'; + +@Entity({ name: 'case.ORBC_CASE_NOTES' }) +export class CaseNotes extends Base { + /** + * An auto-generated unique identifier for the case notes. + */ + @AutoMap() + @PrimaryGeneratedColumn({ type: 'int', name: 'CASE_NOTES_ID' }) + caseNoteId: number; + + @AutoMap() + @ManyToOne(() => Case, (Case) => Case.caseNotes, { + eager: true, + cascade: false, + }) + @JoinColumn({ name: 'CASE_ID' }) + case: Case; + + @AutoMap() + @OneToOne(() => CaseEvent, (caseEvent) => caseEvent.caseNotes) + @JoinColumn({ name: 'CASE_EVENT_ID' }) + caseEvent: CaseEvent; + + @AutoMap() + @ManyToOne(() => User, { eager: true, cascade: false, nullable: true }) + @JoinColumn({ name: 'USER_GUID' }) + user?: Nullable; + + @AutoMap() + @Column({ + name: 'NOTES_DATE', + nullable: false, + }) + notesDate: Date; + + @AutoMap() + @Column({ length: 4000, name: 'NOTES', nullable: false }) + comment: string; + + @AutoMap() + @OneToOne(() => CaseActivity, (caseActivity) => caseActivity.caseNotes, { + eager: false, + }) + caseActivity?: Nullable; +} diff --git a/vehicles/src/modules/case-management/entities/case.entity.ts b/vehicles/src/modules/case-management/entities/case.entity.ts new file mode 100644 index 000000000..5fa0094e0 --- /dev/null +++ b/vehicles/src/modules/case-management/entities/case.entity.ts @@ -0,0 +1,86 @@ +import { + Column, + Entity, + JoinColumn, + ManyToOne, + OneToMany, + PrimaryGeneratedColumn, +} from 'typeorm'; +import { AutoMap } from '@automapper/classes'; +import { Base } from '../../common/entities/base.entity'; +import { Permit } from '../../permit-application-payment/permit/entities/permit.entity'; +import { User } from '../../company-user-management/users/entities/user.entity'; +import { CaseType } from '../../../common/enum/case-type.enum'; +import { CaseStatusType } from '../../../common/enum/case-status-type.enum'; +import { CaseEvent } from './case-event.entity'; +import { Nullable } from '../../../common/types/common'; +import { CaseDocument } from './case-document.entity'; +import { CaseNotes } from './case-notes.entity'; +import { CaseActivity } from './case-activity.entity'; + +@Entity({ name: 'case.ORBC_CASE' }) +export class Case extends Base { + /** + * An auto-generated unique identifier for the cases. + */ + @AutoMap() + @PrimaryGeneratedColumn({ type: 'int', name: 'CASE_ID' }) + caseId: number; + + @AutoMap() + @Column({ type: 'int', name: 'ORIGINAL_CASE_ID', nullable: true }) + originalCaseId?: Nullable; + + @AutoMap() + @Column({ type: 'int', name: 'PREVIOUS_CASE_ID', nullable: true }) + previousCaseId?: Nullable; + + @AutoMap() + @ManyToOne(() => Permit, (permit) => permit.cases, { + eager: true, + cascade: false, + }) + @JoinColumn({ name: 'PERMIT_ID' }) + permit: Permit; + + @AutoMap() + @Column({ + type: 'simple-enum', + enum: CaseType, + length: 10, + name: 'CASE_TYPE', + nullable: false, + }) + caseType: CaseType; + + @AutoMap() + @Column({ + type: 'simple-enum', + enum: CaseStatusType, + length: 12, + name: 'CASE_STATUS_TYPE', + nullable: false, + }) + caseStatusType: CaseStatusType; + + @AutoMap() + @ManyToOne(() => User, { eager: true, cascade: false, nullable: true }) + @JoinColumn({ name: 'ASSIGNED_USER_GUID' }) + assignedUser?: Nullable; + + @AutoMap() + @OneToMany(() => CaseEvent, (caseEvent) => caseEvent.case) + events: CaseEvent[]; + + @AutoMap() + @OneToMany(() => CaseNotes, (caseNotes) => caseNotes.case) + caseNotes?: Nullable; + + @AutoMap() + @OneToMany(() => CaseActivity, (caseActivity) => caseActivity.case) + caseActivity?: Nullable; + + @AutoMap() + @OneToMany(() => CaseDocument, (caseDocument) => caseDocument.case) + caseDocuments?: Nullable; +} diff --git a/vehicles/src/modules/case-management/profiles/case-management.profile.ts b/vehicles/src/modules/case-management/profiles/case-management.profile.ts new file mode 100644 index 000000000..380c9f0ff --- /dev/null +++ b/vehicles/src/modules/case-management/profiles/case-management.profile.ts @@ -0,0 +1,18 @@ +import { AutomapperProfile, InjectMapper } from '@automapper/nestjs'; +import { Mapper, createMap } from '@automapper/core'; +import { Injectable } from '@nestjs/common'; +import { CaseEvent } from '../entities/case-event.entity'; +import { ReadCaseEvenDto } from '../dto/response/read-case-event.dto'; + +@Injectable() +export class CaseManagementProfile extends AutomapperProfile { + constructor(@InjectMapper() mapper: Mapper) { + super(mapper); + } + + override get profile() { + return (mapper: Mapper) => { + createMap(mapper, CaseEvent, ReadCaseEvenDto); + }; + } +} diff --git a/vehicles/src/modules/permit-application-payment/application/application.controller.ts b/vehicles/src/modules/permit-application-payment/application/application.controller.ts index 5a3d34ce6..7258c89e0 100644 --- a/vehicles/src/modules/permit-application-payment/application/application.controller.ts +++ b/vehicles/src/modules/permit-application-payment/application/application.controller.ts @@ -1,4 +1,12 @@ -import { Body, Controller, Post, Req, UseGuards } from '@nestjs/common'; +import { + Body, + Controller, + Get, + Post, + Query, + Req, + UseGuards, +} from '@nestjs/common'; import { ApiBearerAuth, ApiInternalServerErrorResponse, @@ -12,12 +20,17 @@ import { ApplicationService } from './application.service'; import { Request } from 'express'; import { ExceptionDto } from '../../../common/exception/exception.dto'; import { ResultDto } from './dto/response/result.dto'; -import { PermitReceiptDocumentService } from '../permit-receipt-document/permit-receipt-document.service'; import { JwtServiceAccountAuthGuard } from 'src/common/guard/jwt-sa-auth.guard'; import { PermitIdDto } from 'src/modules/permit-application-payment/permit/dto/request/permit-id.dto'; +import { ApiPaginatedResponse } from '../../../common/decorator/api-paginate-response'; +import { Permissions } from '../../../common/decorator/permissions.decorator'; +import { IDIR_USER_ROLE_LIST } from '../../../common/enum/user-role.enum'; +import { PaginationDto } from '../../../common/dto/paginate/pagination'; +import { ReadApplicationMetadataDto } from './dto/response/read-application-metadata.dto'; +import { GetApplicationQueryParamsDto } from './dto/request/queryParam/getApplication.query-params.dto'; @ApiBearerAuth() -@ApiTags('Application') +@ApiTags('Application : API accessible exclusively to staff users and SA.') @Controller('/applications') @ApiNotFoundResponse({ description: 'The Application Api Not Found Response', @@ -32,10 +45,42 @@ import { PermitIdDto } from 'src/modules/permit-application-payment/permit/dto/r type: ExceptionDto, }) export class ApplicationController { - constructor( - private readonly applicationService: ApplicationService, - private readonly permitReceiptDocumentService: PermitReceiptDocumentService, - ) {} + constructor(private readonly applicationService: ApplicationService) {} + + @ApiPaginatedResponse(ReadApplicationMetadataDto) + @ApiOperation({ + summary: 'Retrieve all applications with criteria', + description: + 'Fetch paginated list of applications based on user-defined filters such as page, sorting order, search column, search string, and whether to include applications in queue. Accessible only to specific IDIR roles.', + }) + @Permissions({ + allowedIdirRoles: IDIR_USER_ROLE_LIST, + }) + @Get() + async getApplications( + @Req() request: Request, + @Query() + { + page, + take, + orderBy, + searchColumn, + searchString, + applicationsInQueue, + }: GetApplicationQueryParamsDto, + ): Promise> { + const currentUser = request.user as IUserJWT; + + return await this.applicationService.findAllApplications({ + page, + take, + orderBy, + currentUser, + searchColumn, + searchString, + applicationsInQueue, + }); + } /** * A POST method defined with the @Post() decorator and a route of /scheduler/issue diff --git a/vehicles/src/modules/permit-application-payment/application/application.module.ts b/vehicles/src/modules/permit-application-payment/application/application.module.ts index 7dab68aec..46be431d1 100644 --- a/vehicles/src/modules/permit-application-payment/application/application.module.ts +++ b/vehicles/src/modules/permit-application-payment/application/application.module.ts @@ -11,6 +11,8 @@ import { PermitType } from '../permit/entities/permit-type.entity'; import { Permit } from '../permit/entities/permit.entity'; import { PermitReceiptDocumentModule } from '../permit-receipt-document/permit-receipt-document.module'; import { ApplicationController } from './application.controller'; +import { CaseManagementModule } from '../../case-management/case-management.module'; +import { CompanyApplicationQueueController } from './company-application-queue.controller'; @Module({ imports: [ @@ -23,8 +25,13 @@ import { ApplicationController } from './application.controller'; ]), PaymentModule, PermitReceiptDocumentModule, + CaseManagementModule, + ], + controllers: [ + CompanyApplicationQueueController, + CompanyApplicationController, + ApplicationController, ], - controllers: [CompanyApplicationController, ApplicationController], providers: [ApplicationService, ApplicationProfile], exports: [ApplicationService], }) diff --git a/vehicles/src/modules/permit-application-payment/application/application.service.ts b/vehicles/src/modules/permit-application-payment/application/application.service.ts index 49c2297a8..aeaa42f16 100644 --- a/vehicles/src/modules/permit-application-payment/application/application.service.ts +++ b/vehicles/src/modules/permit-application-payment/application/application.service.ts @@ -20,7 +20,12 @@ import { PermitApplicationOrigin } from './entities/permit-application-origin.en import { PermitApprovalSource } from './entities/permit-approval-source.entity'; import { PermitApplicationOrigin as PermitApplicationOriginEnum } from '../../../common/enum/permit-application-origin.enum'; import { PermitApprovalSource as PermitApprovalSourceEnum } from '../../../common/enum/permit-approval-source.enum'; -import { paginate, sortQuery } from '../../../common/helper/database.helper'; +import { + getQueryRunner, + paginate, + setBaseEntityProperties, + sortQuery, +} from '../../../common/helper/database.helper'; import { CACHE_MANAGER } from '@nestjs/cache-manager'; import { Cache } from 'cache-manager'; import { DopsService } from '../../common/dops.service'; @@ -48,8 +53,18 @@ import { IUserJWT } from '../../../common/interface/user-jwt.interface'; import { generateApplicationNumber, generatePermitNumber, + isPermitTypeEligibleForQueue, } from '../../../common/helper/permit-application.helper'; import { PaymentService } from '../payment/payment.service'; +import { CaseManagementService } from '../../case-management/case-management.service'; +import { ReadCaseEvenDto } from '../../case-management/dto/response/read-case-event.dto'; +import { CaseActivityType } from '../../../common/enum/case-activity-type.enum'; +import { Nullable } from '../../../common/types/common'; +import { DataNotFoundException } from '../../../common/exception/data-not-found.exception'; +import { throwUnprocessableEntityException } from '../../../common/helper/exception.helper'; +import { ApplicationSearch } from '../../../common/enum/application-search.enum'; + +import { CaseStatusType } from '../../../common/enum/case-status-type.enum'; @Injectable() export class ApplicationService { @@ -67,6 +82,7 @@ export class ApplicationService { private permitApprovalSourceRepository: Repository, @Inject(CACHE_MANAGER) private readonly cacheManager: Cache, + private readonly caseManagementService: CaseManagementService, ) {} /** @@ -240,7 +256,6 @@ export class ApplicationService { return await permitQB.getMany(); } - /* Get single application By Permit ID*/ @LogAsyncMethodExecution() async findApplication( applicationId: string, @@ -262,9 +277,20 @@ export class ApplicationService { } /** - * Retrieves applications based on user GUID, and company ID. It allows for sorting, pagination, and filtering of the applications results. - * @param getApplicationQueryParamsDto - DTO containing query parameters such as companyId, orderBy, page, and take for filtering and pagination. - * @param userGUID - Unique identifier for the user. If provided, the query + * Retrieves applications based on multiple optional filters including user GUID, company ID, pending permits status, applications in queue, and a search string. + * The function supports sorting by various columns and includes pagination for efficient retrieval. + * @param findAllApplicationsOptions - Contains multiple optional parameters: pagination, sorting, filtering by company ID, user GUID, and other search filters. + * - page: The current page number for pagination. + * - take: Number of records to display per page. + * - orderBy: Column to sort the results by (e.g., applicationNumber, startDate, etc.). + * - pendingPermits: Whether to filter by pending permits. + * - companyId: The ID of the company to filter applications by. + * - userGUID: The GUID of the user whose applications to filter. + * - currentUser: The current logged-in user's JWT payload. + * - applicationsInQueue: Boolean filter for applications that are in the queue. + * - searchColumn: The specific column to search within (e.g., plate, application number). + * - searchString: The input keyword to use for searching. + * @returns A paginated result containing filtered and sorted ReadApplicationMetadataDto objects. */ @LogAsyncMethodExecution() async findAllApplications(findAllApplicationsOptions?: { @@ -275,6 +301,9 @@ export class ApplicationService { companyId?: number; userGUID?: string; currentUser?: IUserJWT; + applicationsInQueue?: Nullable; + searchColumn?: Nullable; + searchString?: Nullable; }): Promise> { // Construct the base query to find applications const applicationsQB = this.buildApplicationQuery( @@ -282,6 +311,9 @@ export class ApplicationService { findAllApplicationsOptions.companyId, findAllApplicationsOptions.pendingPermits, findAllApplicationsOptions.userGUID, + findAllApplicationsOptions.searchColumn, + findAllApplicationsOptions.searchString, + findAllApplicationsOptions.applicationsInQueue, ); // total number of items const totalItems = await applicationsQB.getCount(); @@ -337,6 +369,8 @@ export class ApplicationService { extraArgs: () => ({ currentUserRole: findAllApplicationsOptions?.currentUser?.orbcUserRole, + currentDateTime: new Date(), + applicationsInQueue: findAllApplicationsOptions.applicationsInQueue, }), }, ); @@ -349,7 +383,18 @@ export class ApplicationService { companyId?: number, pendingPermits?: boolean, userGUID?: string, + searchColumn?: Nullable, + searchString?: Nullable, + applicationsInQueue?: Nullable, ): SelectQueryBuilder { + // Ensure that pendingPermits and applicationsInQueue are not set at the same time + if (pendingPermits !== undefined && applicationsInQueue !== undefined) { + throw new InternalServerErrorException( + 'Both pendingPermits and applicationsInQueue cannot be set at the same time.', + ); + } + + // Build initial query to retrieve permit data, including relationships to company, permitData, owner contact details, etc. let permitsQuery = this.permitRepository .createQueryBuilder('permit') .leftJoinAndSelect('permit.company', 'company') @@ -359,6 +404,17 @@ export class ApplicationService { 'applicationOwner.userContact', 'applicationOwnerContact', ); + + // Include cases and the assigned case user only if applications are in queue + if (applicationsInQueue) { + permitsQuery = permitsQuery.innerJoinAndSelect('permit.cases', 'cases'); + permitsQuery = permitsQuery.leftJoinAndSelect( + 'cases.assignedUser', + 'assignedCaseUser', + ); + } + + // Filter permits without permit numbers (i.e., applications) permitsQuery = permitsQuery.where('permit.permitNumber IS NULL'); // Filter by companyId if provided @@ -368,8 +424,23 @@ export class ApplicationService { }); } - // Handle pending permits query condition - if (pendingPermits) { + // Handle various status filters depending on the provided flags + if (applicationsInQueue) { + // If retrieving applications in queue, we filter those with "IN_QUEUE" status and open/in-progress cases + permitsQuery = permitsQuery.andWhere( + 'permit.permitStatus = :permitStatus', + { + permitStatus: ApplicationStatus.IN_QUEUE, + }, + ); + permitsQuery = permitsQuery.andWhere( + 'cases.caseStatusType IN (:...caseStatuses)', + { + caseStatuses: [CaseStatusType.OPEN, CaseStatusType.IN_PROGRESS], + }, + ); + } else if (pendingPermits) { + // Filter applications based on pending permit statuses (e.g., awaiting payment completion) permitsQuery = permitsQuery.andWhere( new Brackets((qb) => { qb.where('permit.permitStatus IN (:...statuses)', { @@ -377,7 +448,8 @@ export class ApplicationService { }); }), ); - } else if (pendingPermits === false) { + } else if (pendingPermits === false || applicationsInQueue === false) { + // Filter active applications based on ACTIVE_APPLICATION_STATUS permitsQuery = permitsQuery.andWhere( new Brackets((qb) => { qb.where('permit.permitStatus IN (:...statuses)', { @@ -385,7 +457,11 @@ export class ApplicationService { }); }), ); - } else if (pendingPermits === undefined) { + } else if ( + pendingPermits === undefined || + applicationsInQueue === undefined + ) { + // Filter all applications based on ALL_APPLICATION_STATUS permitsQuery = permitsQuery.andWhere( new Brackets((qb) => { qb.where('permit.permitStatus IN (:...statuses)', { @@ -395,7 +471,7 @@ export class ApplicationService { ); } - // Filter by userGUID if provided + // Filter by userGUID if provided, targeting the application owner if (userGUID) { permitsQuery = permitsQuery.andWhere( 'applicationOwner.userGUID = :userGUID', @@ -405,6 +481,45 @@ export class ApplicationService { ); } + // Handle search conditions based on specified search column and search string + if (searchColumn) { + // Apply column-specific search filters + switch (searchColumn) { + case ApplicationSearch.PLATE: + permitsQuery = permitsQuery.andWhere( + 'permitData.plate like :searchString', + { + searchString: `%${searchString}%`, + }, + ); + break; + case ApplicationSearch.APPLICATION_NUMBER: + permitsQuery = permitsQuery.andWhere( + 'permit.applicationNumber like :searchString', + { + searchString: `%${searchString}%`, + }, + ); + break; + } + } + + // If only searchString is provided without a specific search column, search across plate and unit number + if (!searchColumn && searchString) { + permitsQuery = permitsQuery.andWhere( + new Brackets((query) => { + query + .where('permitData.plate like :searchString', { + searchString: `%${searchString}%`, + }) + .orWhere('permitData.unitNumber like :searchString', { + searchString: `%${searchString}%`, + }); + }), + ); + } + + // Return the constructed query return permitsQuery; } @@ -767,4 +882,188 @@ export class ApplicationService { // Return the response DTO return deleteDto; } + + @LogAsyncMethodExecution() + async addApplicationToQueue({ + currentUser, + companyId, + applicationId, + }: { + currentUser: IUserJWT; + companyId: number; + applicationId: string; + }): Promise { + const application = await this.findOne(applicationId, companyId); + if (!application) { + throw new DataNotFoundException(); + } else if (!isPermitTypeEligibleForQueue(application.permitType)) { + throwUnprocessableEntityException( + 'Invalid permit type. Ineligible for queue.', + ); + } else if (application.permitStatus !== ApplicationStatus.IN_PROGRESS) { + throwUnprocessableEntityException('Invalid status.'); + } + const { queryRunner } = await getQueryRunner({ + dataSource: this.dataSource, + }); + try { + application.permitStatus = ApplicationStatus.IN_QUEUE; + setBaseEntityProperties({ + entity: application, + currentUser, + update: true, + }); + await queryRunner.manager.save(application); + const result = await this.caseManagementService.openCase({ + currentUser: currentUser, + applicationId, + queryRunner, + }); + await queryRunner.commitTransaction(); + return result; + } catch (error) { + await queryRunner.rollbackTransaction(); + this.logger.error(error); + throw error; + } finally { + await queryRunner.release(); + } + } + + /** + * Updates the status of an application in queue based on the specified activity type. + * The function first checks for the validity of the application before performing any updates or workflow operations. + * + * Procedure steps: + * - If `caseActivityType` is `WITHDRAWN`, it starts the case withdrawal process. + * - If `caseActivityType` is any other state, it completes the case workflow. + * + * Input: + * @param currentUser: User information making the request including JWT details. + * @param companyId: The ID of the company owning the application. + * @param applicationId: Unique identifier for the application to update. + * @param caseActivityType: Type of case activity which determines the flow (e.g., WITHDRAWN, APPROVED). + * @param comment (optional): Additional comments or descriptions associated with the activity. + * + * Output: + * @returns the final result after updating the case or performing the workflow. + * + * Possible exceptions: + * @throws DataNotFoundException: In case the application is not found. + * @throws UnprocessableEntityException: If the permit type/status does not allow queue operations. + */ + @LogAsyncMethodExecution() + async updateApplicationQueueStatus({ + currentUser, + companyId, + applicationId, + caseActivityType, + comment, + }: { + currentUser: IUserJWT; + companyId: number; + applicationId: string; + caseActivityType: CaseActivityType; + comment?: Nullable; + }): Promise { + let result: ReadCaseEvenDto; + const application = await this.findOne(applicationId, companyId); + if (!application) { + throw new DataNotFoundException(); + } else if (!isPermitTypeEligibleForQueue(application.permitType)) { + throwUnprocessableEntityException( + 'Invalid permit type. Ineligible for queue.', + ); + } else if (application.permitStatus !== ApplicationStatus.IN_QUEUE) { + throwUnprocessableEntityException('Invalid status.'); + } + + const { queryRunner } = await getQueryRunner({ + dataSource: this.dataSource, + }); + try { + if (caseActivityType === CaseActivityType.WITHDRAWN) { + result = await this.caseManagementService.caseWithdrawn({ + currentUser, + applicationId, + queryRunner, + }); + } else { + result = await this.caseManagementService.workflowEnd({ + currentUser, + applicationId, + caseActivityType, + comment, + queryRunner, + }); + } + await queryRunner.manager.update( + Permit, + { permitId: applicationId }, + { + permitStatus: + caseActivityType === CaseActivityType.APPROVED + ? ApplicationStatus.IN_CART + : ApplicationStatus.IN_PROGRESS, + updatedDateTime: new Date(), + updatedUser: currentUser.userName, + updatedUserDirectory: currentUser.orbcUserDirectory, + updatedUserGuid: currentUser.userGUID, + }, + ); + await queryRunner.commitTransaction(); + return result; + } catch (error) { + await queryRunner.rollbackTransaction(); + this.logger.error(error); + throw error; + } finally { + await queryRunner.release(); + } + } + + /** + * Assigns an application that is currently in queue to a case manager. + * Performs validation on the application's status and type before assignment. + * + * Input: + * - @param currentUser: IUserJWT - The user performing the operation. + * - @param companyId: number - The ID of the company associated with the application. + * - @param applicationId: string - The ID of the application to be assigned. + * + * Output: + * - @returns Promise - The result from the case assignment process. + * + * Throws exceptions: + * - DataNotFoundException: When the application is not found. + * - UnprocessableEntityException: If the application is ineligible for queue. + * + */ + @LogAsyncMethodExecution() + async assingApplicationInQueue({ + currentUser, + companyId, + applicationId, + }: { + currentUser: IUserJWT; + companyId: number; + applicationId: string; + }): Promise { + const application = await this.findOne(applicationId, companyId); + if (!application) { + throw new DataNotFoundException(); + } else if (!isPermitTypeEligibleForQueue(application.permitType)) { + throwUnprocessableEntityException( + 'Invalid permit type. Ineligible for queue.', + ); + } else if (application.permitStatus !== ApplicationStatus.IN_QUEUE) { + throwUnprocessableEntityException('Invalid status.'); + } + const result = await this.caseManagementService.assignCase({ + currentUser: currentUser, + applicationId, + }); + + return result; + } } diff --git a/vehicles/src/modules/permit-application-payment/application/company-application-queue.controller.ts b/vehicles/src/modules/permit-application-payment/application/company-application-queue.controller.ts new file mode 100644 index 000000000..10ce1ea06 --- /dev/null +++ b/vehicles/src/modules/permit-application-payment/application/company-application-queue.controller.ts @@ -0,0 +1,201 @@ +import { + Body, + Controller, + ForbiddenException, + Param, + Post, + Req, +} from '@nestjs/common'; +import { + ApiBadRequestResponse, + ApiBearerAuth, + ApiInternalServerErrorResponse, + ApiMethodNotAllowedResponse, + ApiNotFoundResponse, + ApiOperation, + ApiTags, + ApiUnprocessableEntityResponse, +} from '@nestjs/swagger'; +import { IUserJWT } from 'src/common/interface/user-jwt.interface'; +import { ApplicationService } from './application.service'; +import { Request } from 'express'; +import { ExceptionDto } from '../../../common/exception/exception.dto'; +import { Permissions } from 'src/common/decorator/permissions.decorator'; + +import { + CLIENT_USER_ROLE_LIST, + IDIRUserRole, +} from 'src/common/enum/user-role.enum'; + +import { doesUserHaveRole } from '../../../common/helper/auth.helper'; +import { CaseActivityType } from '../../../common/enum/case-activity-type.enum'; +import { UpdateCaseActivity } from './dto/request/update-case-activity.dto'; +import { ReadCaseEvenDto } from '../../case-management/dto/response/read-case-event.dto'; +import { ApplicationIdIdPathParamDto } from './dto/request/pathParam/applicationId.path-params.dto'; +import { IsFeatureFlagEnabled } from '../../../common/decorator/is-feature-flag-enabled.decorator'; +@ApiBearerAuth() +@ApiTags('Company Application Queue') +@IsFeatureFlagEnabled('APPLICATION-QUEUE') +@Controller('companies/:companyId/applications') +@ApiNotFoundResponse({ + description: 'The Application Queue Api Not Found Response', + type: ExceptionDto, +}) +@ApiMethodNotAllowedResponse({ + description: 'The Application Queue Api Method Not Allowed Response', + type: ExceptionDto, +}) +@ApiUnprocessableEntityResponse({ + description: 'The Application Queue Entity could not be processed.', + type: ExceptionDto, +}) +@ApiInternalServerErrorResponse({ + description: 'The Application Queue Api Internal Server Error Response', + type: ExceptionDto, +}) +@ApiBadRequestResponse({ + description: 'Bad Request Response', + type: ExceptionDto, +}) +export class CompanyApplicationQueueController { + constructor(private readonly applicationService: ApplicationService) {} + + /** + * Submits a permit application identified by the application ID to a + * processing queue. This method enforces authorization checks based on user + * roles. + * Upon successful submission, the method opens a case in the case + * management service and returns the associated case event information. + * + * @param request - The incoming request containing user information. + * @param companyId - The ID of the company associated with the application. + * @param applicationId - The ID of the application to be submitted to the + * queue. + * @returns The case event information related to the submitted application. + */ + @ApiOperation({ + summary: 'Submit Application to Queue for Further Processing', + description: + 'Submits a permit application identified by the application ID to a processing "queue." ' + + 'Return the case event information or throws exceptions if an error occurs during submission.', + }) + @Permissions({ + allowedBCeIDRoles: CLIENT_USER_ROLE_LIST, + allowedIdirRoles: [ + IDIRUserRole.PPC_CLERK, + IDIRUserRole.SYSTEM_ADMINISTRATOR, + IDIRUserRole.CTPO, + ], + }) + @Post(':applicationId/queue') + async submitAppication( + @Req() request: Request, + @Param() { companyId, applicationId }: ApplicationIdIdPathParamDto, + ): Promise { + const currentUser = request.user as IUserJWT; + const result = await this.applicationService.addApplicationToQueue({ + currentUser, + companyId, + applicationId, + }); + return result; + } + + /** + * Approves, rejects or withdraws a permit application based on the provided case + * activity type and user roles. The method ensures that only users with the + * appropriate roles and permissions can perform these operations. + * + * @param request - The incoming request containing user information. + * @param companyId - The ID of the company associated with the application. + * @param applicationId - The ID of the application to be processed. + * @param caseActivityType - The type of case activity (such as approval or withdrawal). + * @param comment - A comment associated with the case activity. + * @returns The case event information related to the operation. + * + * @throws {ForbiddenException} If the user lacks the necessary privileges to perform the activity. + */ + @ApiOperation({ + summary: 'Approve/Reject/Withdraw Application based on Activity Type', + description: + 'Handles the permit application by approving, rejecting, or withdrawing it ' + + 'based on the provided case activity type. Validates roles and permissions ' + + 'before performing operations and returns the relevant case event information or throws a ' + + 'ForbiddenException if the user lacks sufficient privileges.', + }) + @Permissions({ + allowedBCeIDRoles: CLIENT_USER_ROLE_LIST, + allowedIdirRoles: [ + IDIRUserRole.PPC_CLERK, + IDIRUserRole.SYSTEM_ADMINISTRATOR, + IDIRUserRole.CTPO, + ], + }) + @Post(':applicationId/queue/status') + async approveAppication( + @Req() request: Request, + @Param() { companyId, applicationId }: ApplicationIdIdPathParamDto, + @Body() { caseActivityType, comment }: UpdateCaseActivity, + ): Promise { + const currentUser = request.user as IUserJWT; + + if ( + doesUserHaveRole(currentUser.orbcUserRole, CLIENT_USER_ROLE_LIST) && + caseActivityType !== CaseActivityType.WITHDRAWN + ) { + throw new ForbiddenException( + `User does not have sufficient privileges to perform the activity.`, + ); + } + + const result = await this.applicationService.updateApplicationQueueStatus({ + currentUser, + companyId, + applicationId, + caseActivityType, + comment, + }); + + return result; + } + + /** + * Assigns a permit application identified by the application ID to a + * user for processing. This method enforces authorization checks based on user + * roles. + * + * @param request - The incoming request containing user information. + * @param companyId - The ID of the company associated with the application. + * @param applicationId - The ID of the application to be submitted to the + * queue. + * @returns The case event information related to the submitted application. + */ + @ApiOperation({ + summary: 'Assign Application to Queue for Further Processing', + description: + 'Assigns a permit application identified by the application ID to a processing "queue." ' + + 'Returns the case event information or throws exceptions if an error occurs during assignment.', + }) + @Permissions({ + allowedIdirRoles: [ + IDIRUserRole.PPC_CLERK, + IDIRUserRole.SYSTEM_ADMINISTRATOR, + IDIRUserRole.CTPO, + ], + }) + @Post(':applicationId/queue/assign') + async assignAppication( + @Req() request: Request, + @Param() { companyId, applicationId }: ApplicationIdIdPathParamDto, + ): Promise { + const currentUser = request.user as IUserJWT; + + const result = await this.applicationService.assingApplicationInQueue({ + currentUser, + companyId, + applicationId, + }); + + return result; + } +} diff --git a/vehicles/src/modules/permit-application-payment/application/company-application.controller.ts b/vehicles/src/modules/permit-application-payment/application/company-application.controller.ts index d45725b6f..cfdb8c294 100644 --- a/vehicles/src/modules/permit-application-payment/application/company-application.controller.ts +++ b/vehicles/src/modules/permit-application-payment/application/company-application.controller.ts @@ -112,6 +112,9 @@ export class CompanyApplicationController { pendingPermits: getApplicationQueryParamsDto.pendingPermits, userGUID: userGuid, currentUser: currentUser, + applicationsInQueue: getApplicationQueryParamsDto.applicationsInQueue, + searchColumn: getApplicationQueryParamsDto.searchColumn, + searchString: getApplicationQueryParamsDto.searchString, }); } /** diff --git a/vehicles/src/modules/permit-application-payment/application/dto/request/issue-permit.dto.ts b/vehicles/src/modules/permit-application-payment/application/dto/request/issue-permit.dto.ts index e793f6922..b878975cf 100644 --- a/vehicles/src/modules/permit-application-payment/application/dto/request/issue-permit.dto.ts +++ b/vehicles/src/modules/permit-application-payment/application/dto/request/issue-permit.dto.ts @@ -5,8 +5,7 @@ import { IsNumberString, ArrayMinSize } from 'class-validator'; export class IssuePermitDto { @AutoMap() @ApiProperty({ - description: - 'Application Ids. Note: Bulk issuance is not yet implemented even though we capture multiple Application Ids', + description: 'Application Ids.', isArray: true, type: String, example: ['1'], diff --git a/vehicles/src/modules/permit-application-payment/application/dto/request/pathParam/applicationId.path-params.dto.ts b/vehicles/src/modules/permit-application-payment/application/dto/request/pathParam/applicationId.path-params.dto.ts new file mode 100644 index 000000000..aaf41cd45 --- /dev/null +++ b/vehicles/src/modules/permit-application-payment/application/dto/request/pathParam/applicationId.path-params.dto.ts @@ -0,0 +1,14 @@ +import { ApiProperty } from '@nestjs/swagger'; +import { IsNumberString } from 'class-validator'; +import { CompanyIdPathParamDto } from '../../../../../common/dto/request/pathParam/companyId.path-param.dto'; + +export class ApplicationIdIdPathParamDto extends CompanyIdPathParamDto { + @ApiProperty({ + example: 1, + description: + 'The unique identifier of the application. This field is required.', + required: true, + }) + @IsNumberString() + applicationId: string; +} diff --git a/vehicles/src/modules/permit-application-payment/application/dto/request/queryParam/getApplication.query-params.dto.ts b/vehicles/src/modules/permit-application-payment/application/dto/request/queryParam/getApplication.query-params.dto.ts index ac6b853fa..33ef61b3e 100644 --- a/vehicles/src/modules/permit-application-payment/application/dto/request/queryParam/getApplication.query-params.dto.ts +++ b/vehicles/src/modules/permit-application-payment/application/dto/request/queryParam/getApplication.query-params.dto.ts @@ -6,10 +6,19 @@ import { IsString, Length, Validate, + IsEnum, } from 'class-validator'; import { OrderByConstraint } from '../../../../../../common/constraint/orderby.constraint'; import { PageOptionsDto } from '../../../../../../common/dto/paginate/page-options'; import { ApplicationOrderBy } from '../../../../../../common/enum/orderBy.enum'; +import { Nullable } from '../../../../../../common/types/common'; +import { ApplicationSearch } from '../../../../../../common/enum/application-search.enum'; +import { + ACTIVE_APPLICATION_STATUS, + ALL_APPLICATION_STATUS, +} from '../../../../../../common/enum/application-status.enum'; +import { ApplicationSearchConstraint } from '../../../../../../common/constraint/application-search.constraint'; +import { ACTIVE_APPLICATION_QUEUE_STATUS } from '../../../../../../common/enum/case-status-type.enum'; export class GetApplicationQueryParamsDto extends PageOptionsDto { @ApiProperty({ @@ -24,7 +33,6 @@ export class GetApplicationQueryParamsDto extends PageOptionsDto { 'Multiple sorting rules can be combined using commas. ' + `sortField can have values ${Object.values(ApplicationOrderBy).join(', ')}. ` + 'Syntax: ', - required: false, }) @IsOptional() @@ -35,14 +43,73 @@ export class GetApplicationQueryParamsDto extends PageOptionsDto { @ApiProperty({ description: - 'Setting to false confines the search to only applications awaiting payment, while true limits it to applications that have received payment but are awaiting issuance. If unspecified, all applications, including those awaiting issuance, are also fetched.', + `The search parameter to filter the results. This field is optional. Available values are: ${Object.values(ApplicationSearch).join(', ')}. ` + + 'Warning: When searchColumn is defined, searchString must also be provided, or the query will not execute.', + enum: ApplicationSearch, + example: ApplicationSearch.APPLICATION_NUMBER, + required: false, + }) + @IsOptional() + @Validate(ApplicationSearchConstraint, { + message: 'searchString is required when searchColumn is defined.', + }) + @IsEnum(ApplicationSearch) + searchColumn?: Nullable; + + @ApiProperty({ + example: 'A0-08000508-500', + description: + 'The search string used for querying the database. ' + + 'This field is conditionally required. It is mandatory when a searchColumn is defined. ' + + 'If a searchColumn is not defined, the value is searched against Plate or Unit Number, making the field optional. ' + + 'Warning: Leaving this field empty when searchColumn is defined will result in a validation error.', + required: false, + type: 'string', + }) + @IsOptional() + @IsString() + @Length(1, 100) + searchString?: Nullable; + + @ApiProperty({ + description: + `Setting this property to true limits the search to applications that have already received payment but are still awaiting issuance. ` + + ` Conversely, setting it to false confines the search results to only those applications that are awaiting payment (${Object.values(ACTIVE_APPLICATION_STATUS).join(', ')}). ` + + `If this property is left unspecified, the search will fetch all applications that are in any of the following statuses: ${Object.values(ALL_APPLICATION_STATUS).join(', ')}, which includes those that are awaiting issuance. ` + + 'Caution: It is not permissible to set both the pendingPermits and applicationsInQueue properties at the same time.', + example: true, + required: false, + type: 'boolean', + }) + @IsOptional() + @Transform(({ obj, key }: { obj: Record; key: string }) => { + return obj[key] === 'true' ? true : obj[key] === 'false' ? false : obj[key]; + }) + @Validate(ApplicationSearchConstraint, { + message: + 'Both pendingPermits and applicationsInQueue cannot be set at the same time.', + }) + @IsBoolean() + pendingPermits?: Nullable; + + @ApiProperty({ + description: + `Setting this property true restricts the search results to those applications which are in queue (${Object.values(ACTIVE_APPLICATION_QUEUE_STATUS).join(', ')}). ` + + `Conversely, Setting it to false confines the search results to only those applications that are awaiting payment (${Object.values(ACTIVE_APPLICATION_STATUS).join(', ')}). ` + + `If left unspecified, the system will fetch all applications that are in any of the following statuses: ${Object.values(ALL_APPLICATION_STATUS).join(', ')}, including those awaiting issuance. ` + + 'Caution: You cannot set both pendingPermits and applicationsInQueue properties at the same time.', example: true, required: false, + type: 'boolean', }) @IsOptional() @Transform(({ obj, key }: { obj: Record; key: string }) => { return obj[key] === 'true' ? true : obj[key] === 'false' ? false : obj[key]; }) + @Validate(ApplicationSearchConstraint, { + message: + 'Both pendingPermits and applicationsInQueue cannot be set at the same time.', + }) @IsBoolean() - pendingPermits?: boolean; + applicationsInQueue?: Nullable; } diff --git a/vehicles/src/modules/permit-application-payment/application/dto/request/update-case-activity.dto.ts b/vehicles/src/modules/permit-application-payment/application/dto/request/update-case-activity.dto.ts new file mode 100644 index 000000000..f1cdebbcc --- /dev/null +++ b/vehicles/src/modules/permit-application-payment/application/dto/request/update-case-activity.dto.ts @@ -0,0 +1,34 @@ +import { AutoMap } from '@automapper/classes'; +import { ApiProperty } from '@nestjs/swagger'; +import { + IsEnum, + IsOptional, + IsString, + Length, + Validate, +} from 'class-validator'; +import { CaseActivityType } from '../../../../../common/enum/case-activity-type.enum'; +import { CaseActivityCommentConstraint } from '../../../../../common/constraint/case-activity-comment.constraint'; +import { Nullable } from '../../../../../common/types/common'; + +export class UpdateCaseActivity { + @AutoMap() + @ApiProperty({ + enum: CaseActivityType, + description: 'Friendly name for the case activity type.', + example: CaseActivityType.APPROVED, + }) + @IsEnum(CaseActivityType) + caseActivityType: CaseActivityType; + + @AutoMap() + @ApiProperty({ + description: 'The reason for company suspension.', + example: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit', + }) + @IsOptional() + @Validate(CaseActivityCommentConstraint) + @IsString() + @Length(1, 4000) + comment?: Nullable; +} diff --git a/vehicles/src/modules/permit-application-payment/application/dto/response/read-application-metadata.dto.ts b/vehicles/src/modules/permit-application-payment/application/dto/response/read-application-metadata.dto.ts index 199f50153..643cf8ae5 100644 --- a/vehicles/src/modules/permit-application-payment/application/dto/response/read-application-metadata.dto.ts +++ b/vehicles/src/modules/permit-application-payment/application/dto/response/read-application-metadata.dto.ts @@ -3,6 +3,9 @@ import { ApiProperty } from '@nestjs/swagger'; import { ApplicationStatus } from 'src/common/enum/application-status.enum'; import { PermitApplicationOrigin } from 'src/common/enum/permit-application-origin.enum'; import { PermitType } from 'src/common/enum/permit-type.enum'; +import { ApplicationQueueStatus } from '../../../../../common/enum/case-status-type.enum'; +import { Nullable } from '../../../../../common/types/common'; +import { IDIR_USER_ROLE_LIST } from '../../../../../common/enum/user-role.enum'; export class ReadApplicationMetadataDto { @AutoMap() @@ -124,4 +127,29 @@ export class ReadApplicationMetadataDto { required: false, }) plate: string; + + @AutoMap() + @ApiProperty({ + description: + 'Indicates the current status of the application within the queue.', + example: ApplicationQueueStatus.PENDING_REVIEW, + required: false, + }) + applicationQueueStatus?: Nullable; + + @AutoMap() + @ApiProperty({ + description: `Duration for which the application has been in queue, formatted as hh:mm. This field is only visible to users with the following roles: ${Object.values(IDIR_USER_ROLE_LIST).join(', ')}.`, + example: '01:22', + required: false, + }) + timeInQueue?: Nullable; + + @AutoMap() + @ApiProperty({ + description: `The staff member who has claimed the application in the queue. This field is only visible to users with the following roles: ${Object.values(IDIR_USER_ROLE_LIST).join(', ')}.`, + example: 'JANEDOE', + required: false, + }) + claimedBy?: Nullable; } diff --git a/vehicles/src/modules/permit-application-payment/application/profile/application.profile.ts b/vehicles/src/modules/permit-application-payment/application/profile/application.profile.ts index 9224284ee..48226dcd9 100644 --- a/vehicles/src/modules/permit-application-payment/application/profile/application.profile.ts +++ b/vehicles/src/modules/permit-application-payment/application/profile/application.profile.ts @@ -20,6 +20,13 @@ import { import { doesUserHaveRole } from '../../../../common/helper/auth.helper'; import { Permit } from '../../permit/entities/permit.entity'; +import { differenceBetween } from '../../../../common/helper/date-time.helper'; +import { Nullable } from '../../../../common/types/common'; +import { + ApplicationQueueStatus, + CaseStatusType, +} from '../../../../common/enum/case-status-type.enum'; + @Injectable() export class ApplicationProfile extends AutomapperProfile { constructor(@InjectMapper() mapper: Mapper) { @@ -260,6 +267,85 @@ export class ApplicationProfile extends AutomapperProfile { } }), ), + forMember( + (d) => d.applicationQueueStatus, + mapWithArguments( + ( + s, + { + applicationsInQueue, + }: { applicationsInQueue?: Nullable }, + ) => { + if (applicationsInQueue && s.cases?.length) { + switch (s.cases?.at(0)?.caseStatusType) { + case CaseStatusType.OPEN: + return ApplicationQueueStatus.PENDING_REVIEW; + case CaseStatusType.IN_PROGRESS: + return ApplicationQueueStatus.IN_REVIEW; + case CaseStatusType.CLOSED: + return ApplicationQueueStatus.CLOSED; + } + } + }, + ), + ), + forMember( + (d) => d.timeInQueue, + mapWithArguments( + ( + s, + { + currentUserRole, + currentDateTime, + applicationsInQueue, + }: { + currentUserRole: UserRole; + currentDateTime: Date; + applicationsInQueue?: Nullable; + }, + ) => { + if ( + applicationsInQueue && + doesUserHaveRole(currentUserRole, IDIR_USER_ROLE_LIST) + ) { + const diff = differenceBetween( + s.updatedDateTime.toUTCString(), + currentDateTime.toUTCString(), + 'minutes', + ); + const hours = Math.floor(Math.abs(diff) / 60); + const minutes = Math.floor(Math.abs(diff) % 60); + // Format the output + const formattedHours = String(hours).padStart(2, '0'); + const formattedMinutes = String(minutes).padStart(2, '0'); + return `${formattedHours}:${formattedMinutes}`; + } + }, + ), + ), + forMember( + (d) => d.claimedBy, + mapWithArguments( + ( + s, + { + currentUserRole, + applicationsInQueue, + }: { + currentUserRole: UserRole; + applicationsInQueue?: Nullable; + }, + ) => { + if ( + applicationsInQueue && + doesUserHaveRole(currentUserRole, IDIR_USER_ROLE_LIST) && + s.cases?.length + ) { + return s.cases?.at(0)?.assignedUser?.userName; + } + }, + ), + ), ); createMap( diff --git a/vehicles/src/modules/permit-application-payment/permit/entities/permit.entity.ts b/vehicles/src/modules/permit-application-payment/permit/entities/permit.entity.ts index 78624d4dc..3f99f1e01 100644 --- a/vehicles/src/modules/permit-application-payment/permit/entities/permit.entity.ts +++ b/vehicles/src/modules/permit-application-payment/permit/entities/permit.entity.ts @@ -19,6 +19,8 @@ import { PermitTransaction } from '../../payment/entities/permit-transaction.ent import { PermitIssuedBy } from '../../../../common/enum/permit-issued-by.enum'; import { User } from '../../../company-user-management/users/entities/user.entity'; import { Company } from '../../../company-user-management/company/entities/company.entity'; +import { Case } from '../../../case-management/entities/case.entity'; +import { Nullable } from '../../../../common/types/common'; @Entity({ name: 'permit.ORBC_PERMIT' }) export class Permit extends Base { @@ -239,4 +241,10 @@ export class Permit extends Base { (permitTransaction) => permitTransaction.permit, ) public permitTransactions: PermitTransaction[]; + + @OneToMany(() => Case, (cases) => cases.permit, { + cascade: false, + eager: false, + }) + public cases?: Nullable; } diff --git a/vehicles/src/modules/shopping-cart/shopping-cart.service.ts b/vehicles/src/modules/shopping-cart/shopping-cart.service.ts index 2f5b4fc1f..d7ad5c683 100644 --- a/vehicles/src/modules/shopping-cart/shopping-cart.service.ts +++ b/vehicles/src/modules/shopping-cart/shopping-cart.service.ts @@ -1,10 +1,11 @@ import { Injectable, Logger } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; -import { NotBrackets, Repository, SelectQueryBuilder } from 'typeorm'; +import { In, NotBrackets, Repository, SelectQueryBuilder } from 'typeorm'; import { LogAsyncMethodExecution } from '../../common/decorator/log-async-method-execution.decorator'; import { ApplicationStatus } from '../../common/enum/application-status.enum'; import { Directory } from '../../common/enum/directory.enum'; import { + CLIENT_USER_ROLE_LIST, ClientUserRole, IDIR_USER_ROLE_LIST, UserRole, @@ -18,6 +19,7 @@ import { doesUserHaveRole } from '../../common/helper/auth.helper'; import { InjectMapper } from '@automapper/nestjs'; import { Mapper } from '@automapper/core'; import { ReadShoppingCartDto } from './dto/response/read-shopping-cart.dto'; +import { isPermitTypeEligibleForQueue } from '../../common/helper/permit-application.helper'; @Injectable() export class ShoppingCartService { @@ -43,18 +45,43 @@ export class ShoppingCartService { { applicationIds, companyId }: AddToShoppingCartDto & { companyId: number }, ): Promise { const { orbcUserRole } = currentUser; + const applications = await this.applicationRepository.find({ + where: { + permitId: In(applicationIds), + }, + }); + + const applicationsForQueue = applications + ?.filter(({ permitType }) => isPermitTypeEligibleForQueue(permitType)) + ?.map(({ permitId }) => permitId); + + let shouldConcatResult = false; if ( - orbcUserRole === ClientUserRole.COMPANY_ADMINISTRATOR || - doesUserHaveRole(orbcUserRole, IDIR_USER_ROLE_LIST) + doesUserHaveRole(currentUser.orbcUserRole, CLIENT_USER_ROLE_LIST) && + applicationsForQueue?.length ) { - return await this.updateApplicationStatus( + applicationIds = applicationIds.filter( + (item) => !applicationsForQueue.includes(item), + ); + shouldConcatResult = true; + } + let result: ResultDto; + if ( + applicationIds?.length && + (orbcUserRole === ClientUserRole.COMPANY_ADMINISTRATOR || + doesUserHaveRole(orbcUserRole, IDIR_USER_ROLE_LIST)) + ) { + result = await this.updateApplicationStatus( { applicationIds, companyId }, ApplicationStatus.IN_CART, currentUser, ); - } else if (orbcUserRole === ClientUserRole.PERMIT_APPLICANT) { + } else if ( + applicationIds?.length && + orbcUserRole === ClientUserRole.PERMIT_APPLICANT + ) { const { userGUID } = currentUser; - return await this.updateApplicationStatus( + result = await this.updateApplicationStatus( { applicationIds, companyId, @@ -64,8 +91,12 @@ export class ShoppingCartService { currentUser, ); } else { - return { failure: applicationIds, success: [] }; + result = { failure: applicationIds, success: [] }; + } + if (shouldConcatResult) { + result.failure.push(...applicationsForQueue); } + return result; } /** @@ -288,7 +319,7 @@ export class ShoppingCartService { affected: number; }; if (affected === applicationIds.length) { - success.concat(applicationIds); + success.push(...applicationIds); } else { const selectResult = await this.applicationRepository .createQueryBuilder('application') @@ -300,13 +331,13 @@ export class ShoppingCartService { }) .getMany(); - failure.concat( - selectResult + failure.push( + ...selectResult .filter(({ permitStatus }) => permitStatus !== statusToUpdateTo) .map(({ permitId: applicationId }) => applicationId), ); - success.concat( - applicationIds.filter( + success.push( + ...applicationIds.filter( (applicationId) => !failure.includes(applicationId), ), ); diff --git a/vehicles/src/modules/special-auth/dto/request/update-loa-file.dto.ts b/vehicles/src/modules/special-auth/dto/request/update-loa-file.dto.ts index e629e1a89..ec6b2020e 100644 --- a/vehicles/src/modules/special-auth/dto/request/update-loa-file.dto.ts +++ b/vehicles/src/modules/special-auth/dto/request/update-loa-file.dto.ts @@ -1,3 +1,3 @@ -import { CreateLoaFileDto } from "./create-loa-file.dto"; +import { CreateLoaFileDto } from './create-loa-file.dto'; -export class UpdateLoaFileDto extends CreateLoaFileDto {} \ No newline at end of file +export class UpdateLoaFileDto extends CreateLoaFileDto {} diff --git a/vehicles/src/modules/special-auth/dto/request/update-loa.dto.ts b/vehicles/src/modules/special-auth/dto/request/update-loa.dto.ts index 97406f314..ef0b9c144 100644 --- a/vehicles/src/modules/special-auth/dto/request/update-loa.dto.ts +++ b/vehicles/src/modules/special-auth/dto/request/update-loa.dto.ts @@ -1,3 +1,3 @@ -import { CreateLoaDto } from "./create-loa.dto"; +import { CreateLoaDto } from './create-loa.dto'; -export class UpdateLoaDto extends CreateLoaDto{} \ No newline at end of file +export class UpdateLoaDto extends CreateLoaDto {} diff --git a/vehicles/src/modules/special-auth/entities/loa-detail.entity.ts b/vehicles/src/modules/special-auth/entities/loa-detail.entity.ts index 7cccb9737..14cd335c2 100644 --- a/vehicles/src/modules/special-auth/entities/loa-detail.entity.ts +++ b/vehicles/src/modules/special-auth/entities/loa-detail.entity.ts @@ -41,7 +41,6 @@ export class LoaDetail extends Base { name: 'EXPIRY_DATE', nullable: true, }) - expiryDate?: Date; @AutoMap() diff --git a/vehicles/src/modules/special-auth/profile/loa.profile.ts b/vehicles/src/modules/special-auth/profile/loa.profile.ts index 4c29ee382..6f38ecef7 100644 --- a/vehicles/src/modules/special-auth/profile/loa.profile.ts +++ b/vehicles/src/modules/special-auth/profile/loa.profile.ts @@ -399,8 +399,7 @@ export class LoaProfile extends AutomapperProfile { forMember( (d) => d.expiryDate, mapFrom((s) => { - if(s.expiryDate) - return dayjs(s.expiryDate).format('YYYY-MM-DD'); + if (s.expiryDate) return dayjs(s.expiryDate).format('YYYY-MM-DD'); }), ), forMember( From 9208bbd13bfb537f818fc1ef5c00470a4bafe418 Mon Sep 17 00:00:00 2001 From: Praveen Raju <80779423+praju-aot@users.noreply.github.com> Date: Mon, 9 Sep 2024 14:36:19 -0400 Subject: [PATCH 20/63] ORV2-2636 Add STOS fields to PermitData Json (#1586) --- .../interface/permit.template.interface.ts | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/vehicles/src/common/interface/permit.template.interface.ts b/vehicles/src/common/interface/permit.template.interface.ts index d41cebfb7..ccc551f80 100644 --- a/vehicles/src/common/interface/permit.template.interface.ts +++ b/vehicles/src/common/interface/permit.template.interface.ts @@ -31,6 +31,30 @@ export interface PermitData { mailingAddress: MailingAddress; companyName: string; clientNumber: string; + vehicleConfiguration?: VehicleConfiguration; + applicationNotes?: string; + permittedCommodity?: string; + permittedRoute?: PermittedRoute; +} + +interface VehicleConfiguration { + overallLength: number; + overallWidth: number; + overallHeight: number; + frontProjection: number; + rearProjection: number; + trailers: VehicleDetails[]; +} + +interface PermittedRoute { + routeDetails: string; + manualRoute: ManualRoute; +} + +interface ManualRoute { + origin: string; + destination: string; + highwaySequence: string[]; } interface MailingAddress { From 2d30e13ec7421a5f712ab5339cb548c685413294 Mon Sep 17 00:00:00 2001 From: gchauhan-aot <113390759+gchauhan-aot@users.noreply.github.com> Date: Mon, 9 Sep 2024 12:44:49 -0600 Subject: [PATCH 21/63] Backend policy engine helper to format Application to Policy Application (#1585) Co-authored-by: Praveen Raju <80779423+praju-aot@users.noreply.github.com> --- vehicles/src/common/helper/policy-engine.helper.ts | 13 +++++++++++++ .../interface/policy-application.interface.ts | 6 ++++++ 2 files changed, 19 insertions(+) create mode 100644 vehicles/src/common/helper/policy-engine.helper.ts create mode 100644 vehicles/src/common/interface/policy-application.interface.ts diff --git a/vehicles/src/common/helper/policy-engine.helper.ts b/vehicles/src/common/helper/policy-engine.helper.ts new file mode 100644 index 000000000..1f0bb3874 --- /dev/null +++ b/vehicles/src/common/helper/policy-engine.helper.ts @@ -0,0 +1,13 @@ +import { Permit } from "src/modules/permit-application-payment/permit/entities/permit.entity"; +import { PolicyApplication } from "../interface/policy-application.interface"; +import { PermitData } from "../interface/permit.template.interface"; + +export const convertToPolicyApplication = ( + application: Permit + ): PolicyApplication => { + return { + permitType: application.permitType, + permitData: JSON.parse(application.permitData.permitData) as PermitData, + }; + }; + \ No newline at end of file diff --git a/vehicles/src/common/interface/policy-application.interface.ts b/vehicles/src/common/interface/policy-application.interface.ts new file mode 100644 index 000000000..854080a2c --- /dev/null +++ b/vehicles/src/common/interface/policy-application.interface.ts @@ -0,0 +1,6 @@ +import { PermitData } from "./permit.template.interface"; + +export interface PolicyApplication { + permitType: string; + permitData: PermitData; + } \ No newline at end of file From 318996f7e2051c9f250086722a3ebe3cfc3099d9 Mon Sep 17 00:00:00 2001 From: Praveen Raju <80779423+praju-aot@users.noreply.github.com> Date: Mon, 9 Sep 2024 16:54:47 -0400 Subject: [PATCH 22/63] ORV2-2682 - Staff Manage queue (#1587) --- dops/src/app.service.ts | 16 ++ .../templates/application-approved.email.hbs | 138 ++++++++++++++ .../templates/application-rejected.email.hbs | 179 ++++++++++++++++++ dops/src/enum/cache-key.enum.ts | 2 + dops/src/enum/notification-template.enum.ts | 2 + dops/src/helper/notification.helper.ts | 4 + .../common/enum/notification-template.enum.ts | 2 + ...ication-approved.notification.interface.ts | 5 + ...ication-rejected.notification.interface.ts | 4 + .../interface/notification.interface.ts | 8 +- .../case-management.service.ts | 69 +++++++ .../application/application.service.ts | 73 +++++++ 12 files changed, 501 insertions(+), 1 deletion(-) create mode 100644 dops/src/assets/templates/application-approved.email.hbs create mode 100644 dops/src/assets/templates/application-rejected.email.hbs create mode 100644 vehicles/src/common/interface/application-approved.notification.interface.ts create mode 100644 vehicles/src/common/interface/application-rejected.notification.interface.ts diff --git a/dops/src/app.service.ts b/dops/src/app.service.ts index 2675df541..bd3e60b8e 100644 --- a/dops/src/app.service.ts +++ b/dops/src/app.service.ts @@ -109,6 +109,22 @@ export class AppService { ), ); + await addToCache( + this.cacheManager, + CacheKey.EMAIL_TEMPLATE_APPLICATION_APPROVED, + this.convertFileToString( + assetsPath + 'templates/application-approved.email.hbs', + ), + ); + + await addToCache( + this.cacheManager, + CacheKey.EMAIL_TEMPLATE_APPLICATION_REJECTED, + this.convertFileToString( + assetsPath + 'templates/application-rejected.email.hbs', + ), + ); + const featureFlags = await this.featureFlagsService.findAll(); await addToCache( this.cacheManager, diff --git a/dops/src/assets/templates/application-approved.email.hbs b/dops/src/assets/templates/application-approved.email.hbs new file mode 100644 index 000000000..95945e9da --- /dev/null +++ b/dops/src/assets/templates/application-approved.email.hbs @@ -0,0 +1,138 @@ + + + + + Application Approved + + +
+
+
+
+ motiBCLogo +
+ +
+ +
+
+

+ Application {{ applicationNumber }} for plate {{ plate }} has been + approved and is now ready for purchase in the {{ companyName }} shopping + cart. +

+
+ +
+

+ You can apply for additional permits online at + https://onroutebc.gov.bc.ca/. +

+
+ +
+

+ + THIS EMAIL BOX IS NOT MONITORED AND ANY EMAILS SENT TO IT WILL NOT BE + ANSWERED. IF YOU HAVE ANY QUESTIONS, REQUESTS, PLEASE EMAIL: + + ppcpermit@gov.bc.ca. If you have received this message in error, then please contact + ppcpermit@gov.bc.ca + and then immediately delete/discard this transmission, including all + attachments, without copying, distributing or disclosing same. +

+
+ +
+
+
+
+ onRouteBCLogo +
+ +
+ +

+ Have questions or need help? Check out the + Commercial Vehicle Permits + page or email us at + onRouteBc@gov.bc.ca. +

+ +
+ +

+ Terms of Service + and + Privacy Policy +

+
+
+
+
diff --git a/dops/src/assets/templates/application-rejected.email.hbs b/dops/src/assets/templates/application-rejected.email.hbs new file mode 100644 index 000000000..d6675b516 --- /dev/null +++ b/dops/src/assets/templates/application-rejected.email.hbs @@ -0,0 +1,179 @@ + + + + + Application Rejected + + +
+
+
+
+ motiBCLogo +
+ +
+ +
+
+

+ Reason for rejection: +

+
+

+ {{ rejectedDateTime }} +

+

+ {{ rejectedReason }} +

+
+
+ +
+

+ You can apply for additional permits online at + https://onroutebc.gov.bc.ca/. +

+
+ +
+

+ + THIS EMAIL BOX IS NOT MONITORED AND ANY EMAILS SENT TO IT WILL NOT BE + ANSWERED. IF YOU HAVE ANY QUESTIONS, REQUESTS, PLEASE EMAIL: + + ppcpermit@gov.bc.ca. If you have received this message in error, then please contact + ppcpermit@gov.bc.ca + and then immediately delete/discard this transmission, including all + attachments, without copying, distributing or disclosing same. +

+
+ +
+
+
+
+ onRouteBCLogo +
+ +
+ +

+ Have questions or need help? Check out the + Commercial Vehicle Permits + page or email us at + onRouteBc@gov.bc.ca. +

+ +
+ +

+ Terms of Service + and + Privacy Policy +

+
+
+
+
diff --git a/dops/src/enum/cache-key.enum.ts b/dops/src/enum/cache-key.enum.ts index ab7cf9901..7897b590e 100644 --- a/dops/src/enum/cache-key.enum.ts +++ b/dops/src/enum/cache-key.enum.ts @@ -10,6 +10,8 @@ export enum CacheKey { EMAIL_TEMPLATE_PAYMENT_RECEIPT = 'EMAIL_TEMPLATE_PAYMENT_RECEIPT', EMAIL_TEMPLATE_COMPANY_SUSPEND = 'EMAIL_TEMPLATE_COMPANY_SUSPEND', EMAIL_TEMPLATE_COMPANY_UNSUSPEND = 'EMAIL_TEMPLATE_COMPANY_UNSUSPEND', + EMAIL_TEMPLATE_APPLICATION_APPROVED = 'EMAIL_TEMPLATE_APPLICATION_APPROVED', + EMAIL_TEMPLATE_APPLICATION_REJECTED = 'EMAIL_TEMPLATE_APPLICATION_REJECTED', EMAIL_TEMPLATE_ORBC_STYLE = 'EMAIL_TEMPLATE_ORBC_STYLE', CHES_ACCESS_TOKEN = 'CHES_ACCESS_TOKEN', CDOGS_ACCESS_TOKEN = 'CDOGS_ACCESS_TOKEN', diff --git a/dops/src/enum/notification-template.enum.ts b/dops/src/enum/notification-template.enum.ts index 304f130a4..40439dfa9 100644 --- a/dops/src/enum/notification-template.enum.ts +++ b/dops/src/enum/notification-template.enum.ts @@ -4,4 +4,6 @@ export enum NotificationTemplate { PAYMENT_RECEIPT = 'PAYMENT_RECEIPT', COMPANY_SUSPEND = 'COMPANY_SUSPEND', COMPANY_UNSUSPEND = 'COMPANY_UNSUSPEND', + APPLICATION_APPROVED = 'APPLICATION_APPROVED', + APPLICATION_REJECTED = 'APPLICATION_REJECTED', } diff --git a/dops/src/helper/notification.helper.ts b/dops/src/helper/notification.helper.ts index 4ce435793..5be42710d 100644 --- a/dops/src/helper/notification.helper.ts +++ b/dops/src/helper/notification.helper.ts @@ -39,6 +39,10 @@ export const getCacheKeyforEmailTemplate = ( return CacheKey.EMAIL_TEMPLATE_COMPANY_SUSPEND; case NotificationTemplate.COMPANY_UNSUSPEND: return CacheKey.EMAIL_TEMPLATE_COMPANY_UNSUSPEND; + case NotificationTemplate.APPLICATION_APPROVED: + return CacheKey.EMAIL_TEMPLATE_APPLICATION_APPROVED; + case NotificationTemplate.APPLICATION_REJECTED: + return CacheKey.EMAIL_TEMPLATE_APPLICATION_REJECTED; default: throw new Error('Invalid template name'); } diff --git a/vehicles/src/common/enum/notification-template.enum.ts b/vehicles/src/common/enum/notification-template.enum.ts index 304f130a4..40439dfa9 100644 --- a/vehicles/src/common/enum/notification-template.enum.ts +++ b/vehicles/src/common/enum/notification-template.enum.ts @@ -4,4 +4,6 @@ export enum NotificationTemplate { PAYMENT_RECEIPT = 'PAYMENT_RECEIPT', COMPANY_SUSPEND = 'COMPANY_SUSPEND', COMPANY_UNSUSPEND = 'COMPANY_UNSUSPEND', + APPLICATION_APPROVED = 'APPLICATION_APPROVED', + APPLICATION_REJECTED = 'APPLICATION_REJECTED', } diff --git a/vehicles/src/common/interface/application-approved.notification.interface.ts b/vehicles/src/common/interface/application-approved.notification.interface.ts new file mode 100644 index 000000000..114692a1b --- /dev/null +++ b/vehicles/src/common/interface/application-approved.notification.interface.ts @@ -0,0 +1,5 @@ +export interface ApplicationApprovedNotification { + applicationNumber: string; + plate: string; + companyName: string; +} diff --git a/vehicles/src/common/interface/application-rejected.notification.interface.ts b/vehicles/src/common/interface/application-rejected.notification.interface.ts new file mode 100644 index 000000000..24d1fb3d9 --- /dev/null +++ b/vehicles/src/common/interface/application-rejected.notification.interface.ts @@ -0,0 +1,4 @@ +export interface ApplicationRejectedNotification { + rejectedDateTime: string; + rejectedReason: string; +} diff --git a/vehicles/src/common/interface/notification.interface.ts b/vehicles/src/common/interface/notification.interface.ts index 62f69c0ad..3af464c72 100644 --- a/vehicles/src/common/interface/notification.interface.ts +++ b/vehicles/src/common/interface/notification.interface.ts @@ -1,4 +1,6 @@ import { NotificationTemplate } from '../enum/notification-template.enum'; +import { ApplicationApprovedNotification } from './application-approved.notification.interface'; +import { ApplicationRejectedNotification } from './application-rejected.notification.interface'; import { CompanyDataNotification } from './company-data.notification.interface'; import { ProfileRegistrationDataNotification } from './profile-registration-data.notification.interface'; @@ -9,5 +11,9 @@ export interface INotification { bcc?: string[]; fax?: string[]; templateName: NotificationTemplate; - data?: CompanyDataNotification | ProfileRegistrationDataNotification; + data?: + | CompanyDataNotification + | ProfileRegistrationDataNotification + | ApplicationApprovedNotification + | ApplicationRejectedNotification; } diff --git a/vehicles/src/modules/case-management/case-management.service.ts b/vehicles/src/modules/case-management/case-management.service.ts index 66b21ecc2..12fb49d88 100644 --- a/vehicles/src/modules/case-management/case-management.service.ts +++ b/vehicles/src/modules/case-management/case-management.service.ts @@ -764,4 +764,73 @@ export class CaseManagementService { } } } + + /** + * The method creates a notification event. + * + * @param currentUser - The current user executing the withdrawal action. + * @param queryRunner - Optional, existing QueryRunner instance used in the transaction process. + * @param caseId - Optional, the ID of the case to be withdrawn. Can be used to retrieve the existing case. + * @param originalCaseId - Optional, the original ID of the case to be withdrawn. Useful in lookup scenarios. + * @param applicationId - Optional, the ID of the permit application associated with the case. + * @param existingCase - Optional, the pre-loaded `Case` entity, if + */ + @LogAsyncMethodExecution() + async createNotificationEvent({ + currentUser, + queryRunner, + caseId, + originalCaseId, + applicationId, + existingCase, + }: { + currentUser: IUserJWT; + queryRunner?: Nullable; + caseId?: Nullable; + originalCaseId?: Nullable; + applicationId?: Nullable; + existingCase?: Nullable; + }): Promise { + let localQueryRunner = true; + ({ localQueryRunner, queryRunner } = await getQueryRunner({ + queryRunner, + dataSource: this.dataSource, + })); + try { + if (!existingCase) { + existingCase = await this.findLatest({ + queryRunner, + caseId, + originalCaseId, + applicationId, + }); + } + + let newEvent = this.createEvent( + existingCase, + CaseEventType.NOTIFICATION, + currentUser, + ); + newEvent = await queryRunner.manager.save(newEvent); + + if (localQueryRunner) { + await queryRunner.commitTransaction(); + } + return await this.classMapper.mapAsync( + newEvent, + CaseEvent, + ReadCaseEvenDto, + ); + } catch (error) { + if (localQueryRunner) { + await queryRunner.rollbackTransaction(); + } + this.logger.error(error); + throw error; + } finally { + if (localQueryRunner) { + await queryRunner.release(); + } + } + } } diff --git a/vehicles/src/modules/permit-application-payment/application/application.service.ts b/vehicles/src/modules/permit-application-payment/application/application.service.ts index aeaa42f16..552abcaea 100644 --- a/vehicles/src/modules/permit-application-payment/application/application.service.ts +++ b/vehicles/src/modules/permit-application-payment/application/application.service.ts @@ -65,6 +65,13 @@ import { throwUnprocessableEntityException } from '../../../common/helper/except import { ApplicationSearch } from '../../../common/enum/application-search.enum'; import { CaseStatusType } from '../../../common/enum/case-status-type.enum'; +import { INotificationDocument } from '../../../common/interface/notification-document.interface'; +import { validateEmailandFaxList } from '../../../common/helper/notification.helper'; +import { NotificationTemplate } from '../../../common/enum/notification-template.enum'; +import { PermitData } from '../../../common/interface/permit.template.interface'; +import { ApplicationApprovedNotification } from '../../../common/interface/application-approved.notification.interface'; +import { ApplicationRejectedNotification } from '../../../common/interface/application-rejected.notification.interface'; +import { convertUtcToPt } from '../../../common/helper/date-time.helper'; @Injectable() export class ApplicationService { @@ -1012,6 +1019,72 @@ export class ApplicationService { }, ); await queryRunner.commitTransaction(); + try { + if ( + caseActivityType === CaseActivityType.APPROVED || + caseActivityType === CaseActivityType.REJECTED + ) { + let notificationTemplate: NotificationTemplate; + let subject: string; + let notificationData: + | ApplicationApprovedNotification + | ApplicationRejectedNotification; + + const permitData = JSON.parse( + application.permitData.permitData, + ) as PermitData; + + if (caseActivityType === CaseActivityType.APPROVED) { + notificationTemplate = NotificationTemplate.APPLICATION_APPROVED; + subject = `onRouteBC Permit Application ${application?.applicationNumber} for Plate ${permitData?.vehicleDetails?.plate} Approved`; + notificationData = { + applicationNumber: application?.applicationNumber, + companyName: application?.company?.legalName, + plate: permitData?.vehicleDetails?.plate, + } as ApplicationApprovedNotification; + } else { + notificationTemplate = NotificationTemplate.APPLICATION_REJECTED; + subject = `onRouteBC Permit Application ${application?.applicationNumber} for Plate ${permitData?.vehicleDetails?.plate} Rejected`; + notificationData = { + rejectedDateTime: convertUtcToPt( + new Date(), + 'MMM. D, YYYY, hh:mm a Z', + ), + rejectedReason: comment, + } as ApplicationRejectedNotification; + } + + const emailList = [ + permitData?.contactDetails?.email, + permitData?.contactDetails?.additionalEmail, + application?.company?.email, + ]; + const notificationDocument: INotificationDocument = { + templateName: notificationTemplate, + to: validateEmailandFaxList(emailList), + subject: subject, + data: notificationData, + }; + + await this.dopsService.notificationWithDocumentsFromDops( + currentUser, + notificationDocument, + false, + ); + + await this.caseManagementService.createNotificationEvent({ + currentUser, + applicationId, + queryRunner, + }); + + await queryRunner.commitTransaction(); + } + } catch (error) { + await queryRunner.rollbackTransaction(); + this.logger.error(error); //Swallow Notification error + } + return result; } catch (error) { await queryRunner.rollbackTransaction(); From 86034f8300c47732218f3b7e3ea8072726ad06d9 Mon Sep 17 00:00:00 2001 From: zgong-gov <123983557+zgong-gov@users.noreply.github.com> Date: Mon, 9 Sep 2024 14:22:39 -0700 Subject: [PATCH 23/63] Fix cached application data bug (#1588) --- frontend/src/features/permits/hooks/hooks.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/frontend/src/features/permits/hooks/hooks.ts b/frontend/src/features/permits/hooks/hooks.ts index 6f99df931..218ae5a27 100644 --- a/frontend/src/features/permits/hooks/hooks.ts +++ b/frontend/src/features/permits/hooks/hooks.ts @@ -124,6 +124,7 @@ export const useApplicationDetailsQuery = ( refetchOnMount: "always", // always fetch when component is mounted (ApplicationDashboard page) refetchOnWindowFocus: false, // prevent unnecessary multiple queries on page showing up in foreground enabled: shouldEnableQuery, // does not perform the query at all if permit id is invalid + gcTime: 0, // DO NOT cache the application data as application form/review pages always need latest data }); useEffect(() => { From 0887dfea704625fa2b76918ecd6a37517792a7af Mon Sep 17 00:00:00 2001 From: Praveen Raju <80779423+praju-aot@users.noreply.github.com> Date: Tue, 10 Sep 2024 16:57:34 -0400 Subject: [PATCH 24/63] fix: Add IN_QUEUE status to scheduler. (#1589) --- .../common/enum/application-status.enum.ts | 2 ++ .../src/common/helper/policy-engine.helper.ts | 19 +++++++++---------- .../interface/policy-application.interface.ts | 8 ++++---- .../application/application.service.ts | 2 +- 4 files changed, 16 insertions(+), 15 deletions(-) diff --git a/scheduler/src/modules/common/enum/application-status.enum.ts b/scheduler/src/modules/common/enum/application-status.enum.ts index dfe3d8e94..7b5f5ea27 100644 --- a/scheduler/src/modules/common/enum/application-status.enum.ts +++ b/scheduler/src/modules/common/enum/application-status.enum.ts @@ -5,6 +5,7 @@ export enum ApplicationStatus { IN_PROGRESS = 'IN_PROGRESS', IN_CART = 'IN_CART', REJECTED = 'REJECTED', + IN_QUEUE = 'IN_QUEUE', UNDER_REVIEW = 'UNDER_REVIEW', WAITING_APPROVAL = 'WAITING_APPROVAL', WAITING_PAYMENT = 'WAITING_PAYMENT', @@ -41,4 +42,5 @@ export const ALL_APPLICATION_STATUS: readonly ApplicationStatus[] = [ ApplicationStatus.IN_PROGRESS, ApplicationStatus.WAITING_PAYMENT, ApplicationStatus.PAYMENT_COMPLETE, + ApplicationStatus.IN_QUEUE, ]; diff --git a/vehicles/src/common/helper/policy-engine.helper.ts b/vehicles/src/common/helper/policy-engine.helper.ts index 1f0bb3874..fcf3fd3ba 100644 --- a/vehicles/src/common/helper/policy-engine.helper.ts +++ b/vehicles/src/common/helper/policy-engine.helper.ts @@ -1,13 +1,12 @@ -import { Permit } from "src/modules/permit-application-payment/permit/entities/permit.entity"; -import { PolicyApplication } from "../interface/policy-application.interface"; -import { PermitData } from "../interface/permit.template.interface"; +import { Permit } from 'src/modules/permit-application-payment/permit/entities/permit.entity'; +import { PolicyApplication } from '../interface/policy-application.interface'; +import { PermitData } from '../interface/permit.template.interface'; export const convertToPolicyApplication = ( - application: Permit - ): PolicyApplication => { - return { - permitType: application.permitType, - permitData: JSON.parse(application.permitData.permitData) as PermitData, - }; + application: Permit, +): PolicyApplication => { + return { + permitType: application.permitType, + permitData: JSON.parse(application.permitData.permitData) as PermitData, }; - \ No newline at end of file +}; diff --git a/vehicles/src/common/interface/policy-application.interface.ts b/vehicles/src/common/interface/policy-application.interface.ts index 854080a2c..2cdac9f31 100644 --- a/vehicles/src/common/interface/policy-application.interface.ts +++ b/vehicles/src/common/interface/policy-application.interface.ts @@ -1,6 +1,6 @@ -import { PermitData } from "./permit.template.interface"; +import { PermitData } from './permit.template.interface'; export interface PolicyApplication { - permitType: string; - permitData: PermitData; - } \ No newline at end of file + permitType: string; + permitData: PermitData; +} diff --git a/vehicles/src/modules/permit-application-payment/application/application.service.ts b/vehicles/src/modules/permit-application-payment/application/application.service.ts index 552abcaea..a21a8305e 100644 --- a/vehicles/src/modules/permit-application-payment/application/application.service.ts +++ b/vehicles/src/modules/permit-application-payment/application/application.service.ts @@ -1071,7 +1071,7 @@ export class ApplicationService { notificationDocument, false, ); - + await queryRunner.startTransaction(); await this.caseManagementService.createNotificationEvent({ currentUser, applicationId, From 23fea886bbd959800b25fd5b1d21b54b0cac3938 Mon Sep 17 00:00:00 2001 From: John Fletcher <113134542+john-fletcher-aot@users.noreply.github.com> Date: Wed, 11 Sep 2024 11:36:04 -0700 Subject: [PATCH 25/63] docs: Update documentation for policy engine configuration JSON (#1590) --- .../docs/policy-configuration-reference.md | 420 ++++++++++++++++++ 1 file changed, 420 insertions(+) create mode 100644 policy-engine/docs/policy-configuration-reference.md diff --git a/policy-engine/docs/policy-configuration-reference.md b/policy-engine/docs/policy-configuration-reference.md new file mode 100644 index 000000000..6b166b782 --- /dev/null +++ b/policy-engine/docs/policy-configuration-reference.md @@ -0,0 +1,420 @@ +# Policy Configuration Reference + +## Configuration File Structure +Policy rules are defined in the policy configuration JSON object. Rules include checks for validating permit applications against policy, as well as definitions of all permit types, commodity types, vehicle types, vehicle combinations, and permittable dimensions (weight, size, allowable distances, etc.) + +The JSON configuration structure is described by TypeScript types, starting with types/PolicyDefinition. The reference below goes into more detail about what each of the properties is intended to express. + +### Current configuration properties in use +The below properties (link for more details) are used by the current version of the policy engine. + +* [geographicRegions](#geographicRegions) +* [permitTypes](#permitTypes) +* [commonRules](#commonRules) +* [vehicleTypes](#vehicleTypes) +* [commodities](#commodities) + +### Configuration properties for future use +The below properties (link for more details) are for __potential__ future use of the policy engine, and are listed in this documentation for completeness but should not be relied on yet. + +* [version](#version) +* [globalWeightDefaults](#globalWeightDefaults) +* [globalSizeDefaults](#globalSizeDefaults) +* [vehicleCategories](#vehicleCategories) +* [rangeMatrices](#rangeMatrices) + +## Current Configuration Properties + +### geographicRegions +The geographicRegions property defines all of the distinct regions in the province which may have unique policy rules. For example, a vehicle travelling through the Peace region may have different permittable size dimensions than a vehcicle travelling through Lower Mainland. + +Geographic regions are __not__ used when validating permits which do not require routing (e.g. term oversize permits). + +The spatial geometry of the region itself is not stored in the policy configuration; rather, the regions travelled are returned along with the generated route from the external route planner API. The route planner maintains the link between roads and geographic regions which the policy configuration relies on. + +When applying for a permit which requires a route (such as a single trip oversize) the permit applicant will enter their start and destination locations. The external route planner will generate a route appropriate for the vehicle, and will return that route along with the list of all geographic regions the route crosses. + +The structure of the geographicRegions is as follows: + +```js + geographicRegions: [ + { + id: 'LMN', + name: 'Lower Mainland', + }, + { + id: 'KTN', + name: 'Kootenay', + }, + { + id: 'PCE', + name: 'Peace', + }, + ] +``` +Another 'pseudo' geographic region exists which is every area of the province __not__ covered by one of the other named regions. This 'pseudo' region is typically called 'BC Default' but is not explicitly configured as its own region, though it can have its own set of permittable sizes and weights. See the [commodities](#commodities) section below for details on configuring dimensions for BC Default. + +> [!NOTE] +> The IDs assigned to the geographic regions are arbitrary, they need only be unique. When onRouteBC integrates with the route planner, the geographic region IDs may need to be modified to align with the IDs as returned by the route planner API. Alternately, a separate `key` property may be added for this purpose in future. + +### permitTypes +The permitTypes property defines the rules and properties of all the known permit types. The basic structure is: + +```js + permitTypes: [ + { + id: 'TROS', + name: 'Term Oversize', + routingRequired: false, + weightDimensionRequired: false, + sizeDimensionRequired: false, + commodityRequired: false, + allowedVehicles: [ + 'EXPANDO', + 'FEBGHSE', + 'TRKTRAC', + ], + rules: [ + // ...see rules section... + ], + costRules: [ + //...see cost rules section... + ], + } +``` +Properties of the permit type define whether it requires a driving route, weights, size, and commodity. The term oversize example above does not require any of these. A complex permit such as single trip oversize overweight would require all four. + +The `allowedVehicles` property is required for permit types that are for a single vehicle as opposed to for a vehicle combination (truck and trailers). For permits requiring a vehicle combination such as single trip oversize, the `allowedVehicles` property is not used, instead using configuration inside the commodity property, described in its own section below. + +The `rules` property defines policy rules for the permit type that will be checked during permit validation. There will be many rules for a single permit type, expressing business policy such as 'you may not apply for a permit with a start date in the past', 'the vehicle type being permitted must be one of the allowed vehicles for the permit type', 'a vehicle identification number must be 6 alphanumeric characters', and others. Rules are expressed using the syntax defined by [JSON Rules Engine](https://github.com/cachecontrol/json-rules-engine). See the separate section on [rules](#rules) in this document. + +`costRules` are a special type of rule that define how much a permit costs based on the permit itself. Costs can take into account any property of the permit application such as duration, travel distance, start date, vehicle type, and others. See the separate section on [costRules](#costRules) in this document to understand how they differ from standard [JSON Rules Engine](https://github.com/cachecontrol/json-rules-engine) rules. + +### commonRules +`commonRules` are a collection of standard rules which apply to all permit types. Certain rules such as the requirement to supply a company name for the permit and the requirement to supply a license plate for the permitted vehicle can be configured in this central location. All rules in the `commonRules` array will be validated against any permit in the validation step. + +The basic structure is straightforward, and uses the same rule definition format as the rules defined as part of the permit type. +```js + commonRules: [ + // ...see rules section... + ] +``` + +### vehicleTypes +The `vehicleTypes` property defines all of the known vehicle types, both power units and trailers. The basic structure is: + +```js + vehicleTypes: { + powerUnitTypes: [ + { + id: 'BUSCRUM', + name: 'Buses/Crummies', + category: 'powerunit', + }, + { + id: 'BUSTRLR', + name: 'Inter-City Bus (Pulling Pony Trailer)', + category: 'powerunit', + } + ], + trailerTypes: [ + { + id: 'BOOSTER', + name: 'Boosters', + category: 'accessory', + }, + { + id: 'DBTRBTR', + name: 'Tandem/Tridem Drive B-Train (Super B-Train)', + category: 'trailer', + }, + ], + ] +``` +The example above defines 2 types of power unit and 2 types of trailer that the system knows about. The full configuration will contain all known vehicle types and will be much larger. + +The ID for a vehicle type must be unique in the configuration; that is, a power unit and trailer may not share the same ID. + +> [!NOTE] +> Power unit and trailer types both have a `category` property which is not currently used by the policy engine but will be used for overweight permits when they are developed (different weight allowances when a booster follows a specific category of trailer, for example). + +### commodities +The `commodities` property defines all of the known permittable commodities. In addition to the ID and common name of the commodity, this property defines the allowable vehicle combinations that are allowed to transport the commodity, along with the allowable size and weight of the vehicles. Permittable sizes and weights are configured under `commodities` instead of under `vehicleTypes` because the permittable sizes and weights are dependent on the commodity being carried. + +Here is an example of a single commodity configured in a policy configuration JSON: +```js + commodities: [ + { + id: 'IMCONTN', + name: 'Intermodal Containers', + size: { + powerUnits: [ + { + type: 'TRKTRAC', + trailers: [ + { + type: 'STACTRN', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + fp: 3, + rp: 6.5, + w: 2.9, + l: 27.5, + }, + ], + }, + { + type: 'STBTRAN', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + h: 4.4, + l: 27.5, + }, + ], + }, + { + type: 'HIBOFLT', + jeep: true, + booster: true, + selfIssue: true, + sizeDimensions: [ + { + h: 4.4, + regions: [ + { + region: 'PCE', + h: 5.33, + l: 36, + }, + ], + }, + ], + }, + ], + }, + { + type: 'REGTRCK', + trailers: [ + { + type: 'NONEXXX', + jeep: false, + booster: false, + selfIssue: true, + sizeDimensions: [ + { + h: 4.4, + }, + ], + }, + ], + }, + ], + }, + }, + ] +``` +> [!NOTE] +> The values above do not reflect actual policy, they are for demonstration purposes only. + +#### Size Dimension Set +Size dimensions for a given commodity and vehicle combination are configured in the `size` property of the commodity. + +In the example above, the commodity 'Intermodal Containers' has permittable size dimensions configured. There are two size permittable power unit types for this commodity (TRKTRAC and REGTRCK), with TRKTRAC permitted to pull one of 3 different trailer types. REGTRCK is permitted only to pull the trailer 'NONEXXX', which is a special ID indicating no trailer is being pulled. TODO: link to documentation about 'pseudo' vehicle types and commodity types. + +> [!NOTE] +> Vehicles in the size dimension set are referenced by type. The type must match an ID configured in the `vehicleTypes` property of the policy configuration as a relational data key. + +Size dimensions are configured exclusively on trailers, never on power units. For power units that may be permitted with or without trailers, the special pseudo trailer 'NONEXXX' is used as the configuration point for the power unit on its own. + +There are 5 dimensions that can be configured on a trailer: +* height (defined by `h`) +* length (defined by `l`) +* width (defined by `w`) +* front projection (defined by `fp`) +* rear projection (defined by `rp`) + +When any of these is configured directly on the `sizeDimensions` property it indicates a permittable size for the 'BC Default' geographic area. STACTRN in the example above has permittable maximum sizes for 4 dimensions in BC Default. Configuring separate sizes for other geographic regions is handled with a `regions` property of `sizeDimensions`. HIBOFLT in the example above configures a height and length specific to the PCE geographic region. As with vehicles, the `region` property must match a configured `geographicRegion` ID in the policy configuration file (it is a relational data key). + +If any dimensions are __not__ configured for a trailer, this indicates that the maximum dimension is the __legal__ dimension and extra size is not permitted. + +> [!NOTE] +> The reason `sizeDimensions` is an array instead of a single object is for future flexibility. Size dimensions generally do not need multiple size dimensions for a given trailer; this is for weight dimensions primarily. However, it is possible that in the future a trailer may be permitted extra length if it is following a tridem jeep or has a trailing tridem booster. In this case the configuration will be able to use multiple size dimensions for one trailer. For now however, it can be assumed there will only be a single size dimension in the array. + +##### Jeeps and Boosters +Whether a jeep or a booster is permitted in a vehicle combination for a commodity is configured with the `allowJeep` and `allowBooster` properties. The presence of either a jeep or booster does not change the maximum permittable sizes that have been configured. + +##### Self Issue +Certain vehicle combinations hauling certain commodities may not be 'auto-approved' by the system; they require review by staff. These combinations which are not permitted for self-issuance are indicated with a `selfIssue` value of `false`. + +#### Weight Dimension Set +> [!NOTE] +> Weight dimensions are not configured in the example above because overweight permits have not yet been implemented in the policy engine. + +## rules +Policy rules are defined in `json-rules-engine` format and are validated against permit applications according to the permit type. Rules may be configured as common to all permit types, or specific to permit types. Common policy rules are defined inside the top-level [commonRules](#commonRules) property, while type-specific policy rules are defined inside the `rules` property of the permit type itself, in the top-level [permitTypes](#permitTypes) property. + +The structure of a rule is identical whether configured as common, or permit type-specific. + +Example common and permit type-specific rules are as follows: +```js + commonRules: [ + { + conditions: { + not: { + fact: 'permitData', + operator: 'stringMinimumLength', + value: 1, + path: '$.companyName', + }, + }, + event: { + type: 'violation', + params: { + message: 'Company is required', + code: 'field-validation-error', + fieldReference: 'permitData.companyName', + }, + }, + }, + ], + permitTypes: [ + { + id: 'TROS', + name: 'Term Oversize', + routingRequired: false, + weightDimensionRequired: false, + sizeDimensionRequired: false, + commodityRequired: false, + allowedVehicles: [ + 'STINGER', + 'TOWVEHC', + 'TRKTRAC', + ], + rules: [ + { + conditions: { + all: [ + { + not: { + fact: 'permitData', + operator: 'in', + value: [30, 60, 90, 120, 150, 180, 210, 240, 270, 300, 330], + path: '$.permitDuration', + }, + }, + { + not: { + fact: 'permitData', + operator: 'equal', + value: { + fact: 'daysInPermitYear', + }, + path: '$.permitDuration', + }, + }, + ], + }, + event: { + type: 'violation', + params: { + message: 'Duration must be in 30 day increments or a full year', + code: 'field-validation-error', + fieldReference: 'permitData.permitDuration', + }, + }, + }, + ], + } + ] +``` +A rule consists of a condition (which may itself be multiple separate conditions with a logical operator) and an event that is triggered if the condition evaluates to `true`. Currently in onroute, a true condition always indicates a policy __violation__. In the future, true conditions may indicate other informational messages returned to the calling application, such as a requirement that a supplemental permit is required. See [event](#event) below for more details. + +Refer to the [JSON Rules Engine](https://github.com/cachecontrol/json-rules-engine) documentation about the general structure of rule conditions and events. onRoute-specific notes follow, below. + +### conditions +Facts in conditions are based on the structure of the permit application that will be validated. A permit application will have the following general structure: +```js +{ + permitType: 'TROS', + permitData: { + // ...as saved in the onroute database... + } +} +``` +Due to the structure above, the `fact` property will usually be `permitData` when validating user input from the permit application. The `path` defines what property of `permitData` is being validated. For example, the common rule in the example above is validating `permitData.companyName`. + +#### operators +Besides the default operators from `json-rules-engine`, `onroute-policy-engine` defines additional custom operators: + +* `stringMinimumLength` - returns true if the fact is a string type and has a minimum trimmed length greater than or equal to the supplied value +* `dateLessThan` - returns true if the fact is a date and is earlier than the supplied date value +* `regex` - returns true if the fact matches the supplied regular expression + +#### custom facts +Besides facts that are from the permit application JSON, additional custom facts are available within conditions: + +* `allowedVehicles` - returns an array of vehicle IDs (strings) that are valid for the permit type + * Note this is valid only for permit types that do not require a full vehicle configuration +* `configurationIsValid` - returns true if the vehicle configuration in the permit application is valid as per policy + * Note this is valid only for permit types that require a full vehicle configuration +* `daysInPermitYear` - returns the number of days in the year starting with the permit start date, either 365 or 366 +* `validationDate` - returns the current date at the time of permit validation + +### event +Example: +```js + event: { + type: 'violation', + params: { + message: 'Duration must be in 30 day increments or a full year', + code: 'field-validation-error', + fieldReference: 'permitData.permitDuration', + }, + }, +``` + +Currently in onroute, events define policy violations. For a violation event, the `type` property is always `violation`. The event `params` provide more context about the violation itself: + +* `message` - description of the violation which can be presented to permit applicants +* `code` - type of violation which may be used by the calling application, currently limited to just `field-validation-error` +* `fieldReference` - the field in the permit application which caused the violation, usually but not always the same as the condition fact + +All of these params are technically optional, but omitting them may impact how the calling application (e.g. onroute frontend) can respond to the violation. For example, if the `message` is omitted the frontend can only present a generic error message with no additional context which may not be a good user experience. + +Additional event types which are planned, but not currently used in onroute include: + +* `requirement` +* `warning` +* `information` + +## costRules +The cost of a permit is calculated using a modified type of rule based on the [JSON Rules Engine](https://github.com/cachecontrol/json-rules-engine) rule type. The structure looks like: + +```js + costRules: [ + { + fact: 'costPerMonth', + params: { + cost: 30, + }, + }, + ], +``` + +`costRules` are defined as part of the `permitType` definition. Multiple `costRules` may apply to a specific permit type. For example, a permit may have a fixed cost plus a cost per kilometre driven. In such cases, multiple cost rules are defined in the array. + +> [!NOTE] +> `costRules` are defined as facts alone, with no operator or event. Internally during validation, the `onroute-policy-engine` creates a `cost` event with the calculated cost supplied as a `cost` property of the event params. + +There are currently two cost fact types: + +* `fixedCost` - returns the value of the `cost` param without modification +* `costPerMonth` - returns the product of the number of months duration of the permit and the value of the `cost` param + +As more complex cost rules are required, more cost fact types will be implemented in the `onroute-policy-engine` to accomodate these. \ No newline at end of file From b5cf05ebde857a149f6413901ed0ac1211582539 Mon Sep 17 00:00:00 2001 From: Praveen Raju <80779423+praju-aot@users.noreply.github.com> Date: Thu, 12 Sep 2024 14:44:20 -0400 Subject: [PATCH 26/63] feat: ORV2-2973 - Application Queue resubmit and rejection (#1592) --- .../case-activity-comment.constraint.ts | 6 +- .../case-management.service.ts | 97 ++++++++++++------- .../dto/response/read-case-activity.dto.ts | 37 +++++++ .../profiles/case-management.profile.ts | 35 ++++++- .../application/application.service.ts | 12 +++ .../dto/response/read-application.dto.ts | 9 ++ .../profile/application.profile.ts | 16 +++ 7 files changed, 175 insertions(+), 37 deletions(-) create mode 100644 vehicles/src/modules/case-management/dto/response/read-case-activity.dto.ts diff --git a/vehicles/src/common/constraint/case-activity-comment.constraint.ts b/vehicles/src/common/constraint/case-activity-comment.constraint.ts index 9027d972d..2c7420340 100644 --- a/vehicles/src/common/constraint/case-activity-comment.constraint.ts +++ b/vehicles/src/common/constraint/case-activity-comment.constraint.ts @@ -16,8 +16,8 @@ export class CaseActivityCommentConstraint } ).caseActivityType; // Access the searchString property from the same object - // If CaseActivityType.APPROVED or CaseActivityType.REJECTED , comment should exists - if (caseActivityType !== CaseActivityType.WITHDRAWN && !comment) { + // If CaseActivityType.REJECTED, comment should exists + if (caseActivityType === CaseActivityType.REJECTED && !comment) { return false; } @@ -25,6 +25,6 @@ export class CaseActivityCommentConstraint } defaultMessage() { - return `Comment is required when activity type is ${CaseActivityType.APPROVED} or ${CaseActivityType.REJECTED} `; + return `Comment is required when activity type is ${CaseActivityType.REJECTED} `; } } diff --git a/vehicles/src/modules/case-management/case-management.service.ts b/vehicles/src/modules/case-management/case-management.service.ts index 12fb49d88..3a51b8009 100644 --- a/vehicles/src/modules/case-management/case-management.service.ts +++ b/vehicles/src/modules/case-management/case-management.service.ts @@ -23,6 +23,7 @@ import { CaseNotes } from './entities/case-notes.entity'; import { InjectMapper } from '@automapper/nestjs'; import { Mapper } from '@automapper/core'; import { ReadCaseEvenDto } from './dto/response/read-case-event.dto'; +import { ReadCaseActivityDto } from './dto/response/read-case-activity.dto'; @Injectable() export class CaseManagementService { @@ -32,6 +33,8 @@ export class CaseManagementService { private dataSource: DataSource, @InjectRepository(Case) private readonly caseRepository: Repository, + @InjectRepository(CaseActivity) + private readonly caseActivityRepository: Repository, ) {} /** @@ -126,9 +129,7 @@ export class CaseManagementService { existingCase && existingCase?.caseStatusType !== CaseStatusType.CLOSED ) { - throwUnprocessableEntityException( - 'An active case exists for the given application id', - ); + throwUnprocessableEntityException('Application in queue already.'); } let newCase = new Case(); newCase.caseType = CaseType.DEFAULT; @@ -218,9 +219,7 @@ export class CaseManagementService { if (!existingCase) { throw new DataNotFoundException(); } else if (existingCase.caseStatusType === CaseStatusType.CLOSED) { - throwUnprocessableEntityException( - 'Invalid status. Case is already closed', - ); + throwUnprocessableEntityException('Application no longer available.'); } existingCase.caseStatusType = CaseStatusType.CLOSED; //Rename to CaseStatusType @@ -306,9 +305,7 @@ export class CaseManagementService { if (!existingCase) { throw new DataNotFoundException(); } else if (existingCase.caseStatusType === CaseStatusType.CLOSED) { - throwUnprocessableEntityException( - 'Invalid status. Case is already closed', - ); + throwUnprocessableEntityException('Application no longer available.'); } existingCase.assignedUser = new User(); @@ -402,14 +399,8 @@ export class CaseManagementService { } if (!existingCase) { throw new DataNotFoundException(); - } else if (existingCase.caseStatusType === CaseStatusType.CLOSED) { - throwUnprocessableEntityException( - 'Invalid status. Case is already closed', - ); } else if (existingCase.caseStatusType !== CaseStatusType.OPEN) { - throwUnprocessableEntityException( - 'Cannot start workflow. Invalid status.', - ); + throwUnprocessableEntityException('Application no longer available.'); } existingCase.caseStatusType = CaseStatusType.IN_PROGRESS; @@ -502,14 +493,12 @@ export class CaseManagementService { } if (!existingCase) { throw new DataNotFoundException(); - } else if (existingCase.caseStatusType === CaseStatusType.CLOSED) { + } else if (existingCase.assignedUser?.userGUID !== currentUser.userGUID) { throwUnprocessableEntityException( - 'Invalid status. Case is already closed', + `Application no longer available. This application is claimed by ${existingCase.assignedUser?.userName}`, ); } else if (existingCase.caseStatusType !== CaseStatusType.IN_PROGRESS) { - throwUnprocessableEntityException( - 'Cannot complete workflow. Invalid status.', - ); + throwUnprocessableEntityException('Application no longer available.'); } let caseNotes: CaseNotes; @@ -534,6 +523,8 @@ export class CaseManagementService { newActivity.caseEvent = newEvent; newActivity.caseActivityType = caseActivityType; newActivity.dateTime = new Date(); + newActivity.user = new User(); + newActivity.user.userGUID = currentUser.userGUID; setBaseEntityProperties({ entity: newActivity, currentUser }); if (comment) { newActivity.caseNotes = caseNotes; @@ -616,13 +607,9 @@ export class CaseManagementService { } if (!existingCase) { throw new DataNotFoundException(); - } else if (existingCase.caseStatusType === CaseStatusType.CLOSED) { - throwUnprocessableEntityException( - 'Invalid status. Case is already closed', - ); - } else if (existingCase.caseStatusType === CaseStatusType.IN_PROGRESS) { + } else if (existingCase.caseStatusType !== CaseStatusType.OPEN) { throwUnprocessableEntityException( - 'Unable to withdraw the application in review', + 'Application Status Application(s) have either been withdrawn or are in review by the Provincial Permit Centre.', ); } @@ -638,6 +625,8 @@ export class CaseManagementService { newActivity.caseEvent = newEvent; newActivity.caseActivityType = CaseActivityType.WITHDRAWN; newActivity.dateTime = new Date(); + newActivity.user = new User(); + newActivity.user.userGUID = currentUser.userGUID; setBaseEntityProperties({ entity: newActivity, currentUser }); await queryRunner.manager.save(newActivity); @@ -720,13 +709,8 @@ export class CaseManagementService { } if (!existingCase) { throw new DataNotFoundException(); - } - if (existingCase.caseStatusType === CaseStatusType.CLOSED) { - throwUnprocessableEntityException( - 'Invalid status. Case is already closed', - ); } else if (existingCase.caseStatusType !== CaseStatusType.IN_PROGRESS) { - throwUnprocessableEntityException('Cannot add notes. Invalid status.'); + throwUnprocessableEntityException('Application no longer available.'); } try { let newEvent = this.createEvent( @@ -833,4 +817,51 @@ export class CaseManagementService { } } } + + /** + * Retrieves the activity history for a specific case by fetching and mapping `CaseActivity` records. + * Filters are applied based on the permit's `applicationId` and the specified `caseActivityType`. + * Joins additional details, including user information and associated case notes, for each activity. + * + * @param currentUser - The current user executing the action. + * @param applicationId - The ID of the permit associated with the case. + * @param caseActivityType - The type of case activity to filter. + * @returns A `Promise` containing the list of activities for the specified case. + */ + @LogAsyncMethodExecution() + async fetchActivityHistory({ + currentUser, + applicationId, + caseActivityType, + }: { + currentUser: IUserJWT; + applicationId: Nullable; + caseActivityType: CaseActivityType; + }): Promise { + const caseActivity = await this.caseActivityRepository + .createQueryBuilder('caseActivity') + .innerJoinAndSelect('caseActivity.user', 'user') + .leftJoinAndSelect('caseActivity.caseNotes', 'caseNotes') + .innerJoinAndSelect('caseActivity.case', 'case') + .innerJoinAndSelect('case.permit', 'permit') + .where('permit.id = :applicationId', { applicationId }) + .andWhere('caseActivity.caseActivityType = :caseActivityType', { + caseActivityType, + }) + .orderBy('caseActivity.dateTime', 'DESC') + .getMany(); + + const caseActivityDto = await this.classMapper.mapArrayAsync( + caseActivity, + CaseActivity, + ReadCaseActivityDto, + { + extraArgs: () => ({ + currentUser: currentUser, + }), + }, + ); + + return caseActivityDto; + } } diff --git a/vehicles/src/modules/case-management/dto/response/read-case-activity.dto.ts b/vehicles/src/modules/case-management/dto/response/read-case-activity.dto.ts new file mode 100644 index 000000000..becd1fb65 --- /dev/null +++ b/vehicles/src/modules/case-management/dto/response/read-case-activity.dto.ts @@ -0,0 +1,37 @@ +import { AutoMap } from '@automapper/classes'; +import { ApiProperty } from '@nestjs/swagger'; +import { Nullable } from '../../../../common/types/common'; + +export class ReadCaseActivityDto { + @AutoMap() + @ApiProperty({ + description: 'The unique case acitivty id.', + example: 1, + }) + caseActivityId: number; + + @AutoMap() + @ApiProperty({ + description: + 'The user name or id linked to the activity. This value is returned only when queried by a staff user.', + example: 'JSMITH', + required: false, + }) + userName?: string; + + @AutoMap() + @ApiProperty({ + description: 'The date and time when the activity took place.', + example: '2023-10-11T23:26:51.170Z', + }) + dateTime: string; + + @AutoMap() + @ApiProperty({ + description: 'The reason for activity.', + example: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit', + required: false, + type: 'string', + }) + caseNotes?: Nullable; +} diff --git a/vehicles/src/modules/case-management/profiles/case-management.profile.ts b/vehicles/src/modules/case-management/profiles/case-management.profile.ts index 380c9f0ff..465818f12 100644 --- a/vehicles/src/modules/case-management/profiles/case-management.profile.ts +++ b/vehicles/src/modules/case-management/profiles/case-management.profile.ts @@ -1,8 +1,19 @@ import { AutomapperProfile, InjectMapper } from '@automapper/nestjs'; -import { Mapper, createMap } from '@automapper/core'; +import { + Mapper, + createMap, + forMember, + mapFrom, + mapWithArguments, +} from '@automapper/core'; import { Injectable } from '@nestjs/common'; import { CaseEvent } from '../entities/case-event.entity'; import { ReadCaseEvenDto } from '../dto/response/read-case-event.dto'; +import { CaseActivity } from '../entities/case-activity.entity'; +import { ReadCaseActivityDto } from '../dto/response/read-case-activity.dto'; +import { IUserJWT } from '../../../common/interface/user-jwt.interface'; +import { doesUserHaveRole } from '../../../common/helper/auth.helper'; +import { IDIR_USER_ROLE_LIST } from '../../../common/enum/user-role.enum'; @Injectable() export class CaseManagementProfile extends AutomapperProfile { @@ -13,6 +24,28 @@ export class CaseManagementProfile extends AutomapperProfile { override get profile() { return (mapper: Mapper) => { createMap(mapper, CaseEvent, ReadCaseEvenDto); + + createMap( + mapper, + CaseActivity, + ReadCaseActivityDto, + forMember( + (d) => d.caseNotes, + mapFrom((s) => s?.caseNotes?.comment), + ), + forMember( + (d) => d.userName, + mapWithArguments( + (source, { currentUser }: { currentUser: IUserJWT }) => { + if ( + doesUserHaveRole(currentUser.orbcUserRole, IDIR_USER_ROLE_LIST) + ) { + return source.user?.userName; + } + }, + ), + ), + ); }; } } diff --git a/vehicles/src/modules/permit-application-payment/application/application.service.ts b/vehicles/src/modules/permit-application-payment/application/application.service.ts index a21a8305e..4b5386a0e 100644 --- a/vehicles/src/modules/permit-application-payment/application/application.service.ts +++ b/vehicles/src/modules/permit-application-payment/application/application.service.ts @@ -72,6 +72,7 @@ import { PermitData } from '../../../common/interface/permit.template.interface' import { ApplicationApprovedNotification } from '../../../common/interface/application-approved.notification.interface'; import { ApplicationRejectedNotification } from '../../../common/interface/application-rejected.notification.interface'; import { convertUtcToPt } from '../../../common/helper/date-time.helper'; +import { ReadCaseActivityDto } from '../../case-management/dto/response/read-case-activity.dto'; @Injectable() export class ApplicationService { @@ -270,6 +271,16 @@ export class ApplicationService { companyId?: number, ): Promise { const application = await this.findOne(applicationId, companyId); + let readCaseActivityList: ReadCaseActivityDto[]; + if (isPermitTypeEligibleForQueue(application?.permitType)) { + readCaseActivityList = + await this.caseManagementService.fetchActivityHistory({ + applicationId, + currentUser, + caseActivityType: CaseActivityType.REJECTED, + }); + } + const readPermitApplicationdto = await this.classMapper.mapAsync( application, Permit, @@ -277,6 +288,7 @@ export class ApplicationService { { extraArgs: () => ({ currentUserRole: currentUser?.orbcUserRole, + readCaseActivityList: readCaseActivityList, }), }, ); diff --git a/vehicles/src/modules/permit-application-payment/application/dto/response/read-application.dto.ts b/vehicles/src/modules/permit-application-payment/application/dto/response/read-application.dto.ts index 704e11fa5..eb0bf471a 100644 --- a/vehicles/src/modules/permit-application-payment/application/dto/response/read-application.dto.ts +++ b/vehicles/src/modules/permit-application-payment/application/dto/response/read-application.dto.ts @@ -4,6 +4,7 @@ import { ApplicationStatus } from 'src/common/enum/application-status.enum'; import { PermitApplicationOrigin } from 'src/common/enum/permit-application-origin.enum'; import { PermitApprovalSource } from 'src/common/enum/permit-approval-source.enum'; import { PermitType } from 'src/common/enum/permit-type.enum'; +import { ReadCaseActivityDto } from '../../../../case-management/dto/response/read-case-activity.dto'; export class ReadApplicationDto { @AutoMap() @@ -128,4 +129,12 @@ export class ReadApplicationDto { required: false, }) applicant: string; + + @AutoMap() + @ApiProperty({ + description: 'Application rejection history', + type: [ReadCaseActivityDto], + required: false, + }) + rejectionHistory?: ReadCaseActivityDto[]; } diff --git a/vehicles/src/modules/permit-application-payment/application/profile/application.profile.ts b/vehicles/src/modules/permit-application-payment/application/profile/application.profile.ts index 48226dcd9..d85a45442 100644 --- a/vehicles/src/modules/permit-application-payment/application/profile/application.profile.ts +++ b/vehicles/src/modules/permit-application-payment/application/profile/application.profile.ts @@ -26,6 +26,7 @@ import { ApplicationQueueStatus, CaseStatusType, } from '../../../../common/enum/case-status-type.enum'; +import { ReadCaseActivityDto } from '../../../case-management/dto/response/read-case-activity.dto'; @Injectable() export class ApplicationProfile extends AutomapperProfile { @@ -207,6 +208,21 @@ export class ApplicationProfile extends AutomapperProfile { } }), ), + forMember( + (d) => d.rejectionHistory, + mapWithArguments( + ( + s, + { + readCaseActivityList, + }: { readCaseActivityList: ReadCaseActivityDto[] }, + ) => { + if (readCaseActivityList?.length) { + return readCaseActivityList; + } + }, + ), + ), ); createMap( From d60f72083732b57ddf227ea3a507fef9723a3b1b Mon Sep 17 00:00:00 2001 From: John Fletcher <113134542+john-fletcher-aot@users.noreply.github.com> Date: Thu, 12 Sep 2024 12:14:36 -0700 Subject: [PATCH 27/63] feat: Add sample policy configuration JSON, and add documentation (#1591) Co-authored-by: Praveen Raju <80779423+praju-aot@users.noreply.github.com> --- .../dbo.ORBC_POLICY_CONFIGURATION.Table.sql | 6 ++ .../scripts/utility/refresh-sample-data.sh | 2 + .../docs/validation-result-reference.md | 89 +++++++++++++++++++ .../src/_examples/validate-invalid-tros.ts | 22 +++++ 4 files changed, 119 insertions(+) create mode 100644 database/mssql/scripts/sampledata/dbo.ORBC_POLICY_CONFIGURATION.Table.sql create mode 100644 policy-engine/docs/validation-result-reference.md create mode 100644 policy-engine/src/_examples/validate-invalid-tros.ts diff --git a/database/mssql/scripts/sampledata/dbo.ORBC_POLICY_CONFIGURATION.Table.sql b/database/mssql/scripts/sampledata/dbo.ORBC_POLICY_CONFIGURATION.Table.sql new file mode 100644 index 000000000..0c4c5bff1 --- /dev/null +++ b/database/mssql/scripts/sampledata/dbo.ORBC_POLICY_CONFIGURATION.Table.sql @@ -0,0 +1,6 @@ +SET NOCOUNT ON +GO +INSERT [dbo].[ORBC_POLICY_CONFIGURATION] (EFFECTIVE_DATE, IS_DRAFT, CHANGE_DESCRIPTION, POLICY_JSON) +VALUES (GETUTCDATE(), 'N', N'In-progress sample policy configuration', +N'{"version":"2024.03.18.001","geographicRegions":[{"id":"LMN","name":"Lower Mainland"},{"id":"KTN","name":"Kootenay"},{"id":"PCE","name":"Peace"}],"rangeMatrices":[{"id":"annualFeeCV","name":"Annual licensing fee for commercial vehicle","matrix":[{"min":0,"max":500,"value":42},{"min":501,"max":1000,"value":49},{"min":1001,"max":1500,"value":60},{"min":1501,"max":2000,"value":74},{"min":2001,"max":2500,"value":85},{"min":2501,"max":3000,"value":97},{"min":3001,"max":3500,"value":108},{"min":3501,"max":4000,"value":127},{"min":4001,"max":4500,"value":147},{"min":4501,"max":5000,"value":173},{"min":5001,"max":5500,"value":193},{"min":5501,"max":6000,"value":213},{"min":6001,"max":6500,"value":230},{"min":6501,"max":7000,"value":250},{"min":7001,"max":7500,"value":266},{"min":7501,"max":8000,"value":292},{"min":8001,"max":8500,"value":320},{"min":8501,"max":9000,"value":347},{"min":9001,"max":9500,"value":376},{"min":9501,"max":10000,"value":395},{"min":10001,"max":10500,"value":416},{"min":10501,"max":11000,"value":437},{"min":11001,"max":11500,"value":450},{"min":11501,"max":12000,"value":469},{"min":12001,"max":12500,"value":488},{"min":12501,"max":13000,"value":502},{"min":13001,"max":13500,"value":526},{"min":13501,"max":14000,"value":553},{"min":14001,"max":14500,"value":580},{"min":14501,"max":15000,"value":607},{"min":15001,"max":15500,"value":638},{"min":15501,"max":16000,"value":680},{"min":16001,"max":16500,"value":721},{"min":16501,"max":17000,"value":761},{"min":17001,"max":17500,"value":806},{"min":17501,"max":18000,"value":837},{"min":18001,"max":18500,"value":861},{"min":18501,"max":19000,"value":890},{"min":19001,"max":19500,"value":917},{"min":19501,"max":20000,"value":944},{"min":20001,"max":20500,"value":977},{"min":20501,"max":21000,"value":1003},{"min":21001,"max":21500,"value":1030},{"min":21501,"max":22000,"value":1057},{"min":22001,"max":22500,"value":1084},{"min":22501,"max":23000,"value":1111},{"min":23001,"max":23500,"value":1140},{"min":23501,"max":24000,"value":1170},{"min":24001,"max":24500,"value":1199},{"min":24501,"max":25000,"value":1239},{"min":25001,"max":25500,"value":1285},{"min":25501,"max":26000,"value":1326},{"min":26001,"max":26500,"value":1367},{"min":26501,"max":27000,"value":1395},{"min":27001,"max":27500,"value":1424},{"min":27501,"max":28000,"value":1450},{"min":28001,"max":28500,"value":1479},{"min":28501,"max":29000,"value":1505},{"min":29001,"max":29500,"value":1534},{"min":29501,"max":30000,"value":1565},{"min":30001,"max":31000,"value":1591},{"min":31001,"max":32000,"value":1644},{"min":32001,"max":33000,"value":1696},{"min":33001,"max":34000,"value":1751},{"min":34001,"max":35000,"value":1805},{"min":35001,"max":36000,"value":1890},{"min":36001,"max":37000,"value":2018},{"min":37001,"max":38000,"value":2088},{"min":38001,"max":39000,"value":2159},{"min":39001,"max":40000,"value":2229},{"min":40001,"max":41000,"value":2300},{"min":41001,"max":42000,"value":2373},{"min":42001,"max":43000,"value":2445},{"min":43001,"max":44000,"value":2514},{"min":44001,"max":45000,"value":2585},{"min":45001,"max":46000,"value":2690},{"min":46001,"max":47000,"value":2799},{"min":47001,"max":48000,"value":2871},{"min":48001,"max":49000,"value":2940},{"min":49001,"max":50000,"value":3012},{"min":50001,"max":51000,"value":3061},{"min":51001,"max":52000,"value":3127},{"min":52001,"max":53000,"value":3192},{"min":53001,"max":54000,"value":3257},{"min":54001,"max":55000,"value":3322},{"min":55001,"max":56000,"value":3387},{"min":56001,"max":57000,"value":3452},{"min":57001,"max":58000,"value":3516},{"min":58001,"max":59000,"value":3581},{"min":59001,"max":60000,"value":3647},{"min":60001,"max":61000,"value":3710},{"min":61001,"max":62000,"value":3775},{"min":62001,"max":63000,"value":3840},{"min":63001,"max":63500,"value":3905}]},{"id":"annualFeePassenger","name":"Annual licensing fee for commercial passenger vehicle","matrix":[{"min":0,"max":500,"value":40},{"min":501,"max":1000,"value":47},{"min":1001,"max":1500,"value":57},{"min":1501,"max":2000,"value":70},{"min":2001,"max":2500,"value":81},{"min":2501,"max":3000,"value":92},{"min":3001,"max":3500,"value":103},{"min":3501,"max":4000,"value":121},{"min":4001,"max":4500,"value":140},{"min":4501,"max":5000,"value":165},{"min":5001,"max":5500,"value":184},{"min":5501,"max":6000,"value":203},{"min":6001,"max":6500,"value":219},{"min":6501,"max":7000,"value":238},{"min":7001,"max":7500,"value":253},{"min":7501,"max":8000,"value":278},{"min":8001,"max":8500,"value":305},{"min":8501,"max":9000,"value":330},{"min":9001,"max":9500,"value":358},{"min":9501,"max":10000,"value":376},{"min":10001,"max":10500,"value":396},{"min":10501,"max":11000,"value":416},{"min":11001,"max":11500,"value":429},{"min":11501,"max":12000,"value":447},{"min":12001,"max":12500,"value":465},{"min":12501,"max":13000,"value":478},{"min":13001,"max":13500,"value":501},{"min":13501,"max":14000,"value":527},{"min":14001,"max":14500,"value":552},{"min":14501,"max":15000,"value":578},{"min":15001,"max":15500,"value":608},{"min":15501,"max":16000,"value":648},{"min":16001,"max":16500,"value":687},{"min":16501,"max":17000,"value":725},{"min":17001,"max":17500,"value":768},{"min":17501,"max":18000,"value":797},{"min":18001,"max":18500,"value":820},{"min":18501,"max":19000,"value":848},{"min":19001,"max":19500,"value":873},{"min":19501,"max":20000,"value":899},{"min":20001,"max":20500,"value":930},{"min":20501,"max":21000,"value":955},{"min":21001,"max":21500,"value":981},{"min":21501,"max":22000,"value":1007},{"min":22001,"max":22500,"value":1032},{"min":22501,"max":23000,"value":1058},{"min":23001,"max":23500,"value":1086},{"min":23501,"max":24000,"value":1114},{"min":24001,"max":24500,"value":1142},{"min":24501,"max":25000,"value":1180},{"min":25001,"max":25500,"value":1224},{"min":25501,"max":26000,"value":1263},{"min":26001,"max":26500,"value":1302},{"min":26501,"max":27000,"value":1329},{"min":27001,"max":27500,"value":1356},{"min":27501,"max":28000,"value":1381},{"min":28001,"max":28500,"value":1409},{"min":28501,"max":29000,"value":1433},{"min":29001,"max":29500,"value":1461},{"min":29501,"max":30000,"value":1490},{"min":30001,"max":31000,"value":1516},{"min":31001,"max":32000,"value":1569},{"min":32001,"max":33000,"value":1621},{"min":33001,"max":34000,"value":1676},{"min":34001,"max":35000,"value":1730},{"min":35001,"max":36000,"value":1815},{"min":36001,"max":37000,"value":1943},{"min":37001,"max":38000,"value":2013},{"min":38001,"max":39000,"value":2084},{"min":39001,"max":40000,"value":2154},{"min":40001,"max":41000,"value":2225},{"min":41001,"max":42000,"value":2298},{"min":42001,"max":43000,"value":2370},{"min":43001,"max":44000,"value":2439},{"min":44001,"max":45000,"value":2510},{"min":45001,"max":46000,"value":2615},{"min":46001,"max":47000,"value":2724},{"min":47001,"max":48000,"value":2796},{"min":48001,"max":49000,"value":2865},{"min":49001,"max":50000,"value":2937},{"min":50001,"max":51000,"value":2986},{"min":51001,"max":52000,"value":3052},{"min":52001,"max":53000,"value":3117},{"min":53001,"max":54000,"value":3182},{"min":54001,"max":55000,"value":3247},{"min":55001,"max":56000,"value":3312},{"min":56001,"max":57000,"value":3377},{"min":57001,"max":58000,"value":3441},{"min":58001,"max":59000,"value":3506},{"min":59001,"max":60000,"value":3572},{"min":60001,"max":61000,"value":3635},{"min":61001,"max":62000,"value":3700},{"min":62001,"max":63000,"value":3765},{"min":63001,"max":63500,"value":3830}]},{"id":"annualFeeIndustrial","name":"Annual licensing fee for an industrial machine","matrix":[{"min":0,"max":2000,"value":45},{"min":2001,"max":5000,"value":69},{"min":5001,"max":7000,"value":110},{"min":7001,"max":9000,"value":164},{"min":9001,"max":11000,"value":216},{"min":11001,"value":260}]},{"id":"annualFeeFarm","name":"Annual licensing fee for farm vehicle","matrix":[{"min":0,"max":500,"value":30},{"min":501,"max":1000,"value":40},{"min":1001,"max":1500,"value":47},{"min":1501,"max":2000,"value":55},{"min":2001,"max":2500,"value":77},{"min":2501,"max":3000,"value":101},{"min":3001,"max":3500,"value":142},{"min":3501,"max":4000,"value":181},{"min":4001,"max":4500,"value":207},{"min":4501,"max":5000,"value":243},{"min":5001,"max":5500,"value":278},{"min":5501,"max":6000,"value":322},{"min":6001,"max":6500,"value":355},{"min":6501,"max":7000,"value":396},{"min":7001,"max":7500,"value":427},{"min":7501,"max":8000,"value":473},{"min":8001,"max":8500,"value":524},{"min":8501,"max":9000,"value":558},{"min":9001,"max":9500,"value":596},{"min":9501,"max":10000,"value":633},{"min":10001,"max":10500,"value":669},{"min":10501,"max":11000,"value":711},{"min":11001,"max":11500,"value":744},{"min":11501,"max":12000,"value":784},{"min":12001,"max":12500,"value":824},{"min":12501,"max":13000,"value":863},{"min":13001,"max":13500,"value":883},{"min":13501,"max":14000,"value":899},{"min":14001,"max":14500,"value":919},{"min":14501,"max":15000,"value":940},{"min":15001,"max":15500,"value":960},{"min":15501,"max":16000,"value":979},{"min":16001,"max":16500,"value":997},{"min":16501,"max":17000,"value":1017},{"min":17001,"max":17500,"value":1036},{"min":17501,"max":18000,"value":1056},{"min":18001,"max":18500,"value":1076},{"min":18501,"max":19000,"value":1096},{"min":19001,"max":19500,"value":1114},{"min":19501,"max":20000,"value":1134},{"min":20001,"max":20500,"value":1154},{"min":20501,"max":21000,"value":1174},{"min":21001,"max":21500,"value":1192},{"min":21501,"max":22000,"value":1211},{"min":22001,"max":22500,"value":1231},{"min":22501,"max":23000,"value":1251},{"min":23001,"max":23500,"value":1270},{"min":23501,"max":24000,"value":1289},{"min":24001,"max":24400,"value":1309}]}],"commonRules":[{"conditions":{"not":{"fact":"permitData","operator":"stringMinimumLength","value":1,"path":"$.companyName"}},"event":{"type":"violation","params":{"message":"Company is required","code":"field-validation-error","fieldReference":"permitData.companyName"}}},{"conditions":{"not":{"fact":"permitData","operator":"stringMinimumLength","value":1,"path":"$.contactDetails.firstName"}},"event":{"type":"violation","params":{"message":"Contact first name is required","code":"field-validation-error","fieldReference":"permitData.contactDetails.firstName"}}},{"conditions":{"not":{"fact":"permitData","operator":"stringMinimumLength","value":1,"path":"$.contactDetails.lastName"}},"event":{"type":"violation","params":{"message":"Contact last name is required","code":"field-validation-error","fieldReference":"permitData.contactDetails.lastName"}}},{"conditions":{"not":{"fact":"permitData","operator":"stringMinimumLength","value":1,"path":"$.contactDetails.phone1"}},"event":{"type":"violation","params":{"message":"Contact phone number is required","code":"field-validation-error","fieldReference":"permitData.contactDetails.phone1"}}},{"conditions":{"not":{"fact":"permitData","operator":"stringMinimumLength","value":1,"path":"$.contactDetails.email"}},"event":{"type":"violation","params":{"message":"Company contact email is required","code":"field-validation-error","fieldReference":"permitData.contactDetails.email"}}},{"conditions":{"any":[{"fact":"permitData","operator":"dateLessThan","value":{"fact":"validationDate"},"path":"$.startDate"}]},"event":{"type":"violation","params":{"message":"Permit start date cannot be in the past","code":"field-validation-error","fieldReference":"permitData.startDate"}}},{"conditions":{"not":{"fact":"permitData","operator":"regex","value":"^[a-zA-Z0-9]{6}$","path":"$.vehicleDetails.vin"}},"event":{"type":"violation","params":{"message":"Vehicle Identification Number (vin) must be 6 alphanumeric characters","code":"field-validation-error","fieldReference":"permitData.vehicleDetails.vin"}}},{"conditions":{"not":{"fact":"permitData","operator":"stringMinimumLength","value":1,"path":"$.vehicleDetails.plate"}},"event":{"type":"violation","params":{"message":"Vehicle plate is required","code":"field-validation-error","fieldReference":"permitData.vehicleDetails.plate"}}},{"conditions":{"not":{"fact":"permitData","operator":"stringMinimumLength","value":1,"path":"$.vehicleDetails.make"}},"event":{"type":"violation","params":{"message":"Vehicle make is required","code":"field-validation-error","fieldReference":"permitData.vehicleDetails.make"}}},{"conditions":{"not":{"fact":"permitData","operator":"greaterThan","value":1900,"path":"$.vehicleDetails.year"}},"event":{"type":"violation","params":{"message":"Vehicle year is required","code":"field-validation-error","fieldReference":"permitData.vehicleDetails.year"}}},{"conditions":{"not":{"fact":"permitData","operator":"stringMinimumLength","value":1,"path":"$.vehicleDetails.countryCode"}},"event":{"type":"violation","params":{"message":"Vehicle country of registration is required","code":"field-validation-error","fieldReference":"permitData.vehicleDetails.countryCode"}}}],"permitTypes":[{"id":"TROS","name":"Term Oversize","routingRequired":false,"weightDimensionRequired":false,"sizeDimensionRequired":false,"commodityRequired":false,"allowedVehicles":["BOOSTER","DOLLIES","EXPANDO","FEBGHSE","FECVYER","FEDRMMX","FEPNYTR","FESEMTR","FEWHELR","FLOATTR","FULLLTL","HIBOEXP","HIBOFLT","JEEPSRG","LOGDGLG","LOGFULL","LOGNTAC","LOGOWBK","LOGSMEM","LOGTNDM","LOGTRIX","ODTRLEX","OGOSFDT","PLATFRM","POLETRL","PONYTRL","REDIMIX","SEMITRL","STBTRAN","STCHIPS","STCRANE","STINGAT","STLOGNG","STNTSHC","STREEFR","STSDBDK","STSTNGR","STWHELR","STWIDWH","BUSTRLR","CONCRET","DDCKBUS","GRADERS","LOGGING","LOGOFFH","LWBTRCT","OGBEDTK","OGOILSW","PICKRTT","PLOWBLD","REGTRCK","STINGER","TOWVEHC","TRKTRAC"],"rules":[{"conditions":{"all":[{"not":{"fact":"permitData","operator":"in","value":[30,60,90,120,150,180,210,240,270,300,330],"path":"$.permitDuration"}},{"not":{"fact":"permitData","operator":"equal","value":{"fact":"daysInPermitYear"},"path":"$.permitDuration"}}]},"event":{"type":"violation","params":{"message":"Duration must be in 30 day increments or a full year","code":"field-validation-error","fieldReference":"permitData.permitDuration"}}},{"conditions":{"not":{"fact":"permitData","path":"$.vehicleDetails.vehicleSubType","operator":"in","value":{"fact":"allowedVehicles"}}},"event":{"type":"violation","params":{"message":"Vehicle type not permittable for this permit type","code":"field-validation-error","fieldReference":"permitData.vehicleDetails.vehicleSubType"}}}],"costRules":[{"fact":"costPerMonth","params":{"cost":30}}]},{"id":"TROW","name":"Term Overweight","routingRequired":false,"weightDimensionRequired":false,"sizeDimensionRequired":false,"commodityRequired":false,"allowedVehicles":["DOLLIES","FEBGHSE","FECVYER","FEDRMMX","FEPNYTR","FESEMTR","FEWHELR","REDIMIX","CONCRET","CRAFTAT","CRAFTMB","GRADERS","MUNFITR","OGOILSW","OGSERVC","OGSRRAH","PICKRTT","TOWVEHC"],"rules":[{"conditions":{"all":[{"not":{"fact":"permitData","path":"$.permitDuration","operator":"in","value":[30,60,90,120,150,180,210,240,270,300,330]}},{"not":{"fact":"permitData","path":"$.permitDuration","operator":"equal","value":{"fact":"daysInPermitYear"}}}]},"event":{"type":"violation","params":{"message":"Duration must be in 30 day increments or a full year","code":"field-validation-error","fieldReference":"permitData.permitDuration"}}},{"conditions":{"not":{"fact":"permitData","path":"$.vehicleDetails.vehicleSubType","operator":"in","value":{"fact":"allowedVehicles"}}},"event":{"type":"violation","params":{"message":"Vehicle type not permittable for this permit type","code":"field-validation-error","fieldReference":"permitData.vehicleDetails.vehicleSubType"}}}],"costRules":[{"fact":"costPerMonth","params":{"cost":100}}]},{"id":"STOS","name":"Single Trip Oversize","routingRequired":true,"weightDimensionRequired":false,"sizeDimensionRequired":true,"commodityRequired":true,"allowedCommodities":["EMPTYXX","BRGBEAM","AUTOCRR","BRSHCUT"],"allowedVehicles":["DOLLIES","FEBGHSE","FECVYER","FEDRMMX","FEPNYTR","FESEMTR","FEWHELR","REDIMIX","CONCRET","CRAFTAT","CRAFTMB","GRADERS","MUNFITR","OGOILSW","OGSERVC","OGSRRAH","PICKRTT","TOWVEHC"],"rules":[{"conditions":{"any":[{"not":{"fact":"permitData","operator":"lessThanInclusive","value":7,"path":"$.permitDuration"}},{"not":{"fact":"permitData","operator":"greaterThan","value":0,"path":"$.permitDuration"}}]},"event":{"type":"violation","params":{"message":"Duration must be 7 days or less","code":"field-validation-error","fieldReference":"permitData.permitDuration"}}},{"conditions":{"not":{"fact":"configurationIsValid","operator":"equal","value":true}},"event":{"type":"violation","params":{"message":"Vehicle configuration is not permittable for this commodity","code":"field-validation-error","fieldReference":"permitData.vehicleConfiguration.trailers"}}}],"costRules":[{"fact":"fixedCost","params":{"cost":15}}]}],"globalWeightDefaults":{"powerUnits":[],"trailers":[]},"vehicleCategories":{"trailerCategories":[{"id":"trailer","name":"Default trailer category"},{"id":"accessory","name":"Accessory trailer such as jeep or booster, to be used alongside other trailers. Not permittable on its own as a trailer in a combination."},{"id":"pseudo","name":"Placeholder for a trailer in a combination with no trailer (such as when a brushcutter is permitted with no trailer)."}],"powerUnitCategories":[{"id":"powerunit","name":"Default power unit category"}]},"vehicleTypes":{"powerUnitTypes":[{"id":"BUSCRUM","name":"Buses/Crummies","category":"powerunit"},{"id":"BUSTRLR","name":"Inter-City Bus (Pulling Pony Trailer)","category":"powerunit"},{"id":"CONCRET","name":"Concrete Pumper Trucks","category":"powerunit"},{"id":"CRAFTAT","name":"Cranes, Rubber-Tired Loaders, Firetrucks - All Terrain","category":"powerunit"},{"id":"CRAFTMB","name":"Cranes, Rubber-Tired Loaders, Firetrucks - Mobile","category":"powerunit"},{"id":"DDCKBUS","name":"Double Decker Buses","category":"powerunit"},{"id":"FARMVEH","name":"Farm Vehicles","category":"powerunit"},{"id":"GRADERS","name":"Fixed Equipment - Trucks/Graders etc.","category":"powerunit"},{"id":"LCVRMDB","name":"Long Combination Vehicles (LCV) - Rocky Mountain Doubles","category":"powerunit"},{"id":"LCVTPDB","name":"Long Combination Vehicles (LCV) - Turnpike Doubles","category":"powerunit"},{"id":"LOGGING","name":"Logging Trucks","category":"powerunit"},{"id":"LOGOFFH","name":"Logging Trucks - Off-Highway","category":"powerunit"},{"id":"LWBTRCT","name":"Long Wheelbase Truck Tractors Exceeding 6.2 m up to 7.25 m","category":"powerunit"},{"id":"MUNFITR","name":"Municipal Fire Trucks","category":"powerunit"},{"id":"OGBEDTK","name":"Oil and Gas - Bed Trucks","category":"powerunit"},{"id":"OGOILSW","name":"Oil and Gas - Oilfield Sows","category":"powerunit"},{"id":"OGSERVC","name":"Oil and Gas - Service Rigs","category":"powerunit"},{"id":"OGSRRAH","name":"Oil and Gas - Service Rigs and Rathole Augers Only Equipped with Heavy Front Projected Crane (must exceed 14,000 kg tare weight)","category":"powerunit"},{"id":"PICKRTT","name":"Picker Truck Tractors","category":"powerunit"},{"id":"PLOWBLD","name":"Trucks Equipped with Front or Underbody Plow Blades","category":"powerunit"},{"id":"PUTAXIS","name":"Taxis","category":"powerunit"},{"id":"REGTRCK","name":"Trucks","category":"powerunit"},{"id":"SCRAPER","name":"Scrapers","category":"powerunit"},{"id":"SPAUTHV","name":"Specially Authorized Vehicles","category":"powerunit"},{"id":"STINGER","name":"Truck Tractors - Stinger Steered","category":"powerunit"},{"id":"TOWVEHC","name":"Tow Vehicles","category":"powerunit"},{"id":"TRKTRAC","name":"Truck Tractors","category":"powerunit"}],"trailerTypes":[{"id":"BOOSTER","name":"Boosters","category":"accessory"},{"id":"DBTRBTR","name":"Tandem/Tridem Drive B-Train (Super B-Train)","category":"trailer"},{"id":"DOLLIES","name":"Dollies","category":"trailer"},{"id":"EXPANDO","name":"Expando Semi-Trailers","category":"trailer"},{"id":"FEBGHSE","name":"Fixed Equipment - Portable Asphalt Baghouses","category":"trailer"},{"id":"FECVYER","name":"Fixed Equipment - Conveyors (Semi-Trailers)","category":"trailer"},{"id":"FECVYPT","name":"Fixed Equipment - Conveyors (Pony Trailers)","category":"trailer"},{"id":"FEDRMMX","name":"Fixed Equipment - Counter Flow Asphalt Drum Mixers","category":"trailer"},{"id":"FEPNYTR","name":"Fixed Equipment - Pony Trailers","category":"trailer"},{"id":"FESEMTR","name":"Fixed Equipment - Semi-Trailers","category":"trailer"},{"id":"FEWHELR","name":"Fixed Equipment - Wheeler Semi-Trailers","category":"wheeler"},{"id":"FLOATTR","name":"Float Trailers","category":"wheeler"},{"id":"FULLLTL","name":"Full Trailers","category":"trailer"},{"id":"HIBOEXP","name":"Semi-Trailers - Hiboys/Expandos","category":"trailer"},{"id":"HIBOFLT","name":"Semi-Trailers - Hiboys/Flat Decks","category":"trailer"},{"id":"JEEPSRG","name":"Jeeps","category":"accessory"},{"id":"LOGDGLG","name":"Legacy Logging Trailer Combinations - Tandem Pole Trailers, Dogloggers","category":"trailer"},{"id":"LOGLGCY","name":"Legacy Logging Trailer Combinations","category":"trailer"},{"id":"LOGFULL","name":"Logging Trailer - Full Trailers, Tri Axle, Quad Axle","category":"trailer"},{"id":"LOGNTAC","name":"Legacy Logging Trailer Combinations - Non-TAC B-Trains","category":"trailer"},{"id":"LOGOWBK","name":"Logging Trailer - Overwidth Bunks","category":"trailer"},{"id":"LOGSMEM","name":"Logging Semi-Trailer - Empty, 3.2 m Bunks","category":"trailer"},{"id":"LOGTNDM","name":"Legacy Logging Trailer Combinations - Single Axle Jeeps, Tandem Axle Pole Trailers, Dogloggers","category":"trailer"},{"id":"LOGTRIX","name":"Legacy Logging Trailer Combinations - Single Axle Jeeps, Tri Axle Trailers","category":"trailer"},{"id":"MHMBSHG","name":"Manufactured Homes, Modular Buildings, Structures and Houseboats (> 5.0 m OAW) with Attached Axles","category":"trailer"},{"id":"MHMBSHL","name":"Manufactured Homes, Modular Buildings, Structures and Houseboats (<= 5.0 m OAW) with Attached Axles","category":"trailer"},{"id":"ODTRLEX","name":"Overdimensional Trailers and Semi-Trailers (For Export)","category":"trailer"},{"id":"OGOSFDT","name":"Oil and Gas - Oversize Oilfield Flat Deck Semi-Trailers","category":"trailer"},{"id":"PLATFRM","name":"Platform Trailers","category":"trailer"},{"id":"PMHWAAX","name":"Park Model Homes with Attached Axles","category":"trailer"},{"id":"POLETRL","name":"Pole Trailers","category":"trailer"},{"id":"PONYTRL","name":"Pony Trailers","category":"trailer"},{"id":"REDIMIX","name":"Ready Mix Concrete Pump Semi-Trailers","category":"trailer"},{"id":"SEMITRL","name":"Semi-Trailers","category":"trailer"},{"id":"STACTRN","name":"Semi-Trailers - A-Trains and C-Trains","category":"trailer"},{"id":"STBTRAN","name":"Semi-Trailers - B-Trains","category":"trailer"},{"id":"STCHIPS","name":"Semi-Trailers - Walled B-Trains (Chip Trucks)","category":"trailer"},{"id":"STCRANE","name":"Semi-Trailers with Crane","category":"trailer"},{"id":"STINGAT","name":"Stinger Steered Automobile Transporters","category":"trailer"},{"id":"STLOGNG","name":"Semi-Trailers - Logging","category":"trailer"},{"id":"STNTSHC","name":"Semi-Trailers - Non-Tac Short Chassis","category":"trailer"},{"id":"STREEFR","name":"Semi-Trailers - Insulated Vans with Reefer/Refrigeration Units","category":"trailer"},{"id":"STROPRT","name":"Steering Trailers - Manned","category":"trailer"},{"id":"STRSELF","name":"Steering Trailers - Self/Remote","category":"trailer"},{"id":"STSDBDK","name":"Semi-Trailers - Single Drop, Double Drop, Step Decks, Lowbed, Expandos, etc.","category":"trailer"},{"id":"STSTEER","name":"Semi-Trailers - Steering Trailers","category":"trailer"},{"id":"STSTNGR","name":"Semi-Trailers - Stinger Steered Automobile Transporters","category":"trailer"},{"id":"STWDTAN","name":"Semi-Trailers - Spread Tandems","category":"trailer"},{"id":"STWHELR","name":"Semi-Trailers - Wheelers","category":"trailer"},{"id":"STWIDWH","name":"Semi-Trailers - Wide Wheelers","category":"trailer"},{"id":"NONEXXX","name":"None","category":"pseudo"}]},"commodities":[{"id":"NONEXXX","name":"None","size":{"powerUnits":[{"type":"CONCRET","trailers":[{"type":"NONEXXX","jeep":false,"booster":true,"selfIssue":true,"sizeDimensions":[{"fp":3,"rp":6.5,"l":15.5}]}]},{"type":"CRAFTAT","trailers":[{"type":"DOLLIES","jeep":false,"booster":false,"selfIssue":true,"sizeDimensions":[{"fp":10,"rp":6.5,"w":3.8,"h":4.3,"l":25}]},{"type":"NONEXXX","jeep":false,"booster":false,"selfIssue":true,"sizeDimensions":[{"fp":10,"rp":6.5,"w":3.8,"h":4.3,"l":14,"regions":[{"region":"PCE","l":15}]}]}]},{"type":"CRAFTMB","trailers":[{"type":"DOLLIES","jeep":false,"booster":false,"selfIssue":true,"sizeDimensions":[{"fp":10,"rp":6.5,"w":3.8,"h":4.3,"l":25}]},{"type":"NONEXXX","jeep":false,"booster":false,"selfIssue":true,"sizeDimensions":[{"fp":10,"rp":6.5,"w":3.8,"h":4.3,"l":14,"regions":[{"region":"PCE","l":15}]}]}]},{"type":"DDCKBUS","trailers":[{"type":"NONEXXX","jeep":false,"booster":false,"selfIssue":true,"sizeDimensions":[{"h":4.42,"regions":[{"region":"LMN","h":4.3},{"region":"KTN","h":4.3},{"region":"PCE","h":4.3}]}]}]},{"type":"GRADERS","trailers":[{"type":"FEPNYTR","jeep":false,"booster":false,"selfIssue":true,"sizeDimensions":[{"rp":4,"w":3.2,"h":4.3,"l":31}]},{"type":"NONEXXX","jeep":false,"booster":false,"selfIssue":false,"sizeDimensions":[{"w":3.5,"h":4.4,"l":12.5,"regions":[{"region":"LMN","h":4.3},{"region":"KTN","h":4.3},{"region":"PCE","h":5.33}]}]}]},{"type":"BUSTRLR","trailers":[{"type":"PONYTRL","jeep":false,"booster":false,"selfIssue":false,"sizeDimensions":[{}]}]},{"type":"LOGOFFH","trailers":[{"type":"STLOGNG","jeep":false,"booster":false,"selfIssue":true,"sizeDimensions":[{"fp":3,"rp":6.5,"w":4.4}]}]},{"type":"LCVRMDB","trailers":[{"type":"SEMITRL","jeep":false,"booster":false,"selfIssue":false,"sizeDimensions":[{"l":32,"regions":[{"region":"PCE","l":31}]}]}]},{"type":"LCVTPDB","trailers":[{"type":"SEMITRL","jeep":false,"booster":false,"selfIssue":true,"sizeDimensions":[{"l":41}]}]},{"type":"LWBTRCT","trailers":[{"type":"SEMITRL","jeep":true,"booster":true,"selfIssue":false,"sizeDimensions":[{"w":2.6,"h":4.15,"l":23}]}]},{"type":"PICKRTT","trailers":[{"type":"NONEXXX","jeep":false,"booster":false,"selfIssue":true,"sizeDimensions":[{"fp":3,"w":2.6,"h":4.15,"l":16}]},{"type":"STCRANE","jeep":true,"booster":true,"selfIssue":true,"sizeDimensions":[{"fp":3,"rp":6.5,"w":2.6,"h":4.15,"l":25}]},{"type":"STROPRT","jeep":true,"booster":true,"selfIssue":true,"sizeDimensions":[{"w":5,"h":4.88,"l":40,"regions":[{"region":"PCE","h":5.33}]}]},{"type":"STRSELF","jeep":true,"booster":true,"selfIssue":true,"sizeDimensions":[{"w":5,"h":4.88,"l":36,"regions":[{"region":"PCE","h":5.33}]}]}]},{"type":"SCRAPER","trailers":[{"type":"NONEXXX","jeep":false,"booster":false,"selfIssue":true,"sizeDimensions":[{"l":12.5}]}]},{"type":"TRKTRAC","trailers":[{"type":"FECVYER","jeep":true,"booster":true,"selfIssue":true,"sizeDimensions":[{"fp":4,"rp":9.5,"w":3.8,"h":4.72,"l":31,"regions":[{"region":"PCE","h":5.33}]}]},{"type":"FEDRMMX","jeep":true,"booster":true,"selfIssue":true,"sizeDimensions":[{"fp":3,"rp":6.5,"w":3.8,"h":4.72,"l":31,"regions":[{"region":"PCE","h":5.33}]}]},{"type":"FEBGHSE","jeep":true,"booster":true,"selfIssue":false,"sizeDimensions":[{"fp":3,"rp":6.5,"w":4.26,"h":4.72,"l":31,"regions":[{"region":"PCE","h":5.33}]}]},{"type":"FESEMTR","jeep":true,"booster":true,"selfIssue":false,"sizeDimensions":[{"fp":3,"rp":6.5,"w":3.8,"h":4.72,"l":31,"regions":[{"region":"PCE","h":5.33}]}]},{"type":"FEWHELR","jeep":true,"booster":true,"selfIssue":true,"sizeDimensions":[{"w":5,"h":4.88,"l":31,"regions":[{"region":"PCE","h":5.33}]}]},{"type":"ODTRLEX","jeep":false,"booster":false,"selfIssue":false,"sizeDimensions":[{"w":3.65}]},{"type":"REDIMIX","jeep":true,"booster":true,"selfIssue":true,"sizeDimensions":[{"fp":3,"rp":6.5}]},{"type":"HIBOFLT","jeep":true,"booster":true,"selfIssue":true,"sizeDimensions":[{"fp":3,"rp":6.5,"h":4.3,"l":31,"regions":[{"region":"PCE","h":5.33}]}]},{"type":"STREEFR","jeep":false,"booster":false,"selfIssue":true,"sizeDimensions":[{"h":4.3}]},{"type":"STNTSHC","jeep":false,"booster":false,"selfIssue":true,"sizeDimensions":[{}]},{"type":"STSDBDK","jeep":true,"booster":true,"selfIssue":true,"sizeDimensions":[{"fp":3,"rp":6.5,"w":3.2,"h":4.3,"l":27.5,"regions":[{"region":"PCE","l":32}]}]},{"type":"STROPRT","jeep":true,"booster":true,"selfIssue":true,"sizeDimensions":[{"h":4.15,"l":40}]},{"type":"STRSELF","jeep":true,"booster":true,"selfIssue":true,"sizeDimensions":[{"l":36}]}]},{"type":"REGTRCK","trailers":[{"type":"FECVYPT","jeep":false,"booster":false,"selfIssue":true,"sizeDimensions":[{"fp":4,"rp":9.5,"w":3.2,"h":4.3,"l":31}]},{"type":"FEPNYTR","jeep":false,"booster":false,"selfIssue":true,"sizeDimensions":[{"rp":4,"w":3.2,"h":4.3,"l":31}]},{"type":"FULLLTL","jeep":false,"booster":false,"selfIssue":true,"sizeDimensions":[{"rp":6.5,"w":3.8,"h":4.3,"regions":[{"region":"PCE","h":5.33}]}]},{"type":"MHMBSHL","jeep":false,"booster":false,"selfIssue":true,"sizeDimensions":[{"fp":1,"rp":6.9,"h":4.88,"l":31.5,"regions":[{"region":"PCE","h":5.33,"l":36}]}]},{"type":"MHMBSHG","jeep":false,"booster":false,"selfIssue":true,"sizeDimensions":[{"fp":1,"rp":6.9,"h":4.88,"l":31.5,"regions":[{"region":"PCE","h":5.33,"l":36}]}]},{"type":"NONEXXX","jeep":false,"booster":false,"selfIssue":true,"sizeDimensions":[{"fp":1,"rp":6.5,"w":3.2,"h":4.3,"l":16,"regions":[{"region":"PCE","h":4.4}]}]},{"type":"ODTRLEX","jeep":false,"booster":false,"selfIssue":true,"sizeDimensions":[{"w":3.65}]},{"type":"PMHWAAX","jeep":false,"booster":false,"selfIssue":true,"sizeDimensions":[{"fp":3,"rp":6.9,"w":4.4,"h":4.88,"l":31.5,"regions":[{"region":"PCE","h":5.33}]}]},{"type":"PONYTRL","jeep":false,"booster":false,"selfIssue":true,"sizeDimensions":[{"rp":6.5,"w":3.2,"h":4.3,"regions":[{"region":"PCE","h":5.33}]}]}]},{"type":"PLOWBLD","trailers":[{"type":"NONEXXX","jeep":false,"booster":false,"selfIssue":true,"sizeDimensions":[{"w":3.2}]}]}]}},{"id":"DOGLOGG","name":"Doglogger/Sjostrum Trailers (decked)","size":{"powerUnits":[{"type":"TRKTRAC","trailers":[{"type":"NONEXXX","jeep":false,"booster":false,"selfIssue":true,"sizeDimensions":[{"rp":5,"l":13.5}]}]}]}},{"id":"GRTBBUK","name":"Grader, Tractor Blades, Buckets","size":{"powerUnits":[{"type":"GRADERS","trailers":[{"type":"NONEXXX","jeep":false,"booster":false,"selfIssue":true,"sizeDimensions":[{"w":4.4}]}]}]}},{"id":"HAYRACK","name":"Hayrack Semi-Trailer with a Folded Chassis/Empty Piggyback","size":{"powerUnits":[{"type":"TRKTRAC","trailers":[{"type":"STLOGNG","jeep":false,"booster":false,"selfIssue":true,"sizeDimensions":[{"rp":5,"h":4.15}]}]}]}},{"id":"IMCONTN","name":"Intermodal Containers","size":{"powerUnits":[{"type":"TRKTRAC","trailers":[{"type":"STACTRN","jeep":false,"booster":false,"selfIssue":true,"sizeDimensions":[{"h":4.4,"l":26}]},{"type":"STBTRAN","jeep":false,"booster":false,"selfIssue":true,"sizeDimensions":[{"h":4.4,"l":27.5}]},{"type":"HIBOFLT","jeep":true,"booster":true,"selfIssue":true,"sizeDimensions":[{"h":4.4}]}]},{"type":"REGTRCK","trailers":[{"type":"NONEXXX","jeep":false,"booster":false,"selfIssue":true,"sizeDimensions":[{"h":4.4}]}]}]}},{"id":"IMCONWS","name":"Intermodal Containers without Sides","size":{"powerUnits":[{"type":"TRKTRAC","trailers":[{"type":"STSDBDK","jeep":true,"booster":true,"selfIssue":true,"sizeDimensions":[{"w":4.4,"h":4.72}]}]}]}},{"id":"LPBOOMS","name":"Logs, Poles And Boomsticks (Up To 20.1)","size":{"powerUnits":[{"type":"TRKTRAC","trailers":[{"type":"FULLLTL","jeep":false,"booster":false,"selfIssue":true,"sizeDimensions":[{"fp":3,"rp":6.5,"w":2.9,"l":27.5}]},{"type":"LOGLGCY","jeep":false,"booster":false,"selfIssue":true,"sizeDimensions":[{"fp":3,"rp":5,"w":2.6,"l":25}]},{"type":"POLETRL","jeep":true,"booster":false,"selfIssue":true,"sizeDimensions":[{"fp":3,"rp":6.5,"w":2.9,"l":27.5}]},{"type":"STACTRN","jeep":false,"booster":false,"selfIssue":true,"sizeDimensions":[{"fp":3,"rp":6.5,"w":2.9,"l":26}]},{"type":"STBTRAN","jeep":false,"booster":false,"selfIssue":true,"sizeDimensions":[{"fp":3,"rp":6.5,"w":2.9,"l":27.5}]},{"type":"HIBOFLT","jeep":false,"booster":false,"selfIssue":true,"sizeDimensions":[{"fp":3,"rp":6.5,"w":2.9,"l":25}]},{"type":"STLOGNG","jeep":false,"booster":false,"selfIssue":true,"sizeDimensions":[{"fp":3,"rp":6.5,"w":2.9,"l":25}]}]}]}},{"id":"LPBOOML","name":"Logs, Poles And Boomsticks (Over 20.1)","size":{"powerUnits":[{"type":"TRKTRAC","trailers":[{"type":"LOGFULL","jeep":false,"booster":false,"selfIssue":false,"sizeDimensions":[{"fp":10,"rp":10,"l":40}]},{"type":"POLETRL","jeep":true,"booster":true,"selfIssue":false,"sizeDimensions":[{"fp":8,"rp":9,"l":40}]},{"type":"STROPRT","jeep":true,"booster":true,"selfIssue":true,"sizeDimensions":[{"fp":10,"rp":10,"l":40}]},{"type":"STRSELF","jeep":true,"booster":true,"selfIssue":true,"sizeDimensions":[{"fp":10,"rp":10,"l":36}]}]}]}},{"id":"MFHOMES","name":"Manufactured Homes, Modular Buildings, Structures and Houseboats (<= 5.0 m OAW)","size":{"powerUnits":[{"type":"TRKTRAC","trailers":[{"type":"SEMITRL","jeep":true,"booster":true,"selfIssue":false,"sizeDimensions":[{"fp":3,"rp":7.5,"h":4.88,"l":31.5,"regions":[{"region":"PCE","h":5.33,"l":36}]}]},{"type":"STSDBDK","jeep":true,"booster":true,"selfIssue":false,"sizeDimensions":[{"fp":3,"rp":7.5,"h":4.88,"l":31.5,"regions":[{"region":"PCE","h":5.33,"l":36}]}]}]},{"type":"REGTRCK","trailers":[{"type":"DOLLIES","jeep":false,"booster":false,"selfIssue":false,"sizeDimensions":[{"fp":1,"rp":6.9,"h":4.88,"l":31.5,"regions":[{"region":"PCE","h":5.33,"l":36}]}]},{"type":"FLOATTR","jeep":false,"booster":false,"selfIssue":false,"sizeDimensions":[{"fp":1,"rp":6.9,"h":4.57,"l":31.5,"regions":[{"region":"PCE","h":5.33,"l":36}]}]},{"type":"PONYTRL","jeep":false,"booster":false,"selfIssue":false,"sizeDimensions":[{"fp":1,"rp":6.9,"h":4.88,"l":31.5,"regions":[{"region":"PCE","h":5.33,"l":36}]}]}]}]}},{"id":"MFHOMEL","name":"Manufactured Homes, Modular Buildings, Structures and Houseboats (> 5.0 m OAW)","size":{"powerUnits":[{"type":"TRKTRAC","trailers":[{"type":"SEMITRL","jeep":true,"booster":true,"selfIssue":false,"sizeDimensions":[{"fp":3,"rp":7.5,"h":4.88,"l":31.5,"regions":[{"region":"PCE","h":5.33,"l":36}]}]},{"type":"STSDBDK","jeep":true,"booster":true,"selfIssue":false,"sizeDimensions":[{"fp":3,"rp":7.5,"h":4.88,"l":31.5,"regions":[{"region":"PCE","h":5.33,"l":36}]}]}]},{"type":"REGTRCK","trailers":[{"type":"DOLLIES","jeep":false,"booster":false,"selfIssue":false,"sizeDimensions":[{"fp":1,"rp":6.9,"h":4.88,"l":31.5,"regions":[{"region":"PCE","h":5.33,"l":36}]}]},{"type":"FLOATTR","jeep":false,"booster":false,"selfIssue":false,"sizeDimensions":[{"fp":1,"rp":6.9,"h":4.57,"l":31.5,"regions":[{"region":"PCE","h":5.33,"l":36}]}]},{"type":"PONYTRL","jeep":false,"booster":false,"selfIssue":false,"sizeDimensions":[{"fp":1,"rp":6.9,"h":4.88,"l":31.5,"regions":[{"region":"PCE","h":5.33,"l":36}]}]}]}]}},{"id":"PARKMHS","name":"Park Model Homes","size":{"powerUnits":[{"type":"REGTRCK","trailers":[{"type":"DOLLIES","jeep":false,"booster":false,"selfIssue":false,"sizeDimensions":[{"fp":3,"rp":6.9,"w":4.4,"h":4.88,"l":31.5,"regions":[{"region":"PCE","h":5.33}]}]},{"type":"FLOATTR","jeep":false,"booster":false,"selfIssue":false,"sizeDimensions":[{"fp":3,"rp":6.9,"w":4.4,"h":4.88,"l":31.5,"regions":[{"region":"PCE","h":5.33}]}]},{"type":"PONYTRL","jeep":false,"booster":false,"selfIssue":false,"sizeDimensions":[{"fp":3,"rp":6.9,"w":4.4,"h":4.88,"l":31.5,"regions":[{"region":"PCE","h":5.33}]}]}]}]}},{"id":"PIPESTL","name":"Pipe And Steel Products (Rebar, Pilings, Reinforcing Steel, Etc.)","size":{"powerUnits":[{"type":"TRKTRAC","trailers":[{"type":"HIBOEXP","jeep":true,"booster":true,"selfIssue":true,"sizeDimensions":[{"fp":3,"rp":6.5,"w":3.2,"h":4.3,"l":31}]},{"type":"HIBOFLT","jeep":true,"booster":true,"selfIssue":true,"sizeDimensions":[{"fp":3,"rp":6.5,"w":3.2,"h":4.3,"l":27.5}]},{"type":"STSTEER","jeep":true,"booster":true,"selfIssue":true,"sizeDimensions":[{"fp":3,"rp":6.5,"w":3.2,"h":4.3,"l":36}]},{"type":"STROPRT","jeep":true,"booster":true,"selfIssue":false,"sizeDimensions":[{"fp":3,"rp":6.5,"w":3.2,"h":4.3,"l":40}]}]}]}},{"id":"REDUCBL","name":"Reducible Loads","size":{"powerUnits":[{"type":"TRKTRAC","trailers":[{"type":"STLOGNG","jeep":false,"booster":false,"selfIssue":true,"sizeDimensions":[{"w":3.2,"h":4.15,"l":27.5}]},{"type":"PLATFRM","jeep":true,"booster":true,"selfIssue":false,"sizeDimensions":[{"w":3.2,"h":4.3,"l":27.5,"regions":[{"region":"PCE","h":5.33}]}]},{"type":"SEMITRL","jeep":true,"booster":true,"selfIssue":true,"sizeDimensions":[{"w":3.2,"h":4.3,"l":27.5,"regions":[{"region":"PCE","h":5.33}]}]},{"type":"STACTRN","jeep":false,"booster":false,"selfIssue":true,"sizeDimensions":[{"w":3.2,"h":4.3,"l":26,"regions":[{"region":"PCE","h":5.33}]}]},{"type":"STBTRAN","jeep":false,"booster":false,"selfIssue":true,"sizeDimensions":[{"w":3.2,"h":4.3,"l":27.5,"regions":[{"region":"PCE","h":5.33}]}]},{"type":"HIBOEXP","jeep":true,"booster":true,"selfIssue":true,"sizeDimensions":[{"w":3.2,"h":4.3,"l":27.5,"regions":[{"region":"PCE","h":5.33}]}]},{"type":"HIBOFLT","jeep":true,"booster":true,"selfIssue":true,"sizeDimensions":[{"w":3.2,"h":4.3,"l":27.5,"regions":[{"region":"PCE","h":5.33}]}]},{"type":"STSDBDK","jeep":true,"booster":true,"selfIssue":true,"sizeDimensions":[{"w":3.2,"h":4.3,"l":27.5,"regions":[{"region":"PCE","h":5.33}]}]},{"type":"STSTEER","jeep":true,"booster":true,"selfIssue":true,"sizeDimensions":[{"w":3.2,"h":4.3,"l":27.5,"regions":[{"region":"PCE","h":5.33}]}]},{"type":"STWHELR","jeep":true,"booster":true,"selfIssue":false,"sizeDimensions":[{"w":3.2,"h":4.3,"l":27.5,"regions":[{"region":"PCE","h":5.33}]}]},{"type":"STWIDWH","jeep":true,"booster":true,"selfIssue":false,"sizeDimensions":[{"w":3.2,"h":4.3,"l":27.5,"regions":[{"region":"PCE","h":5.33}]}]},{"type":"STCRANE","jeep":true,"booster":true,"selfIssue":true,"sizeDimensions":[{"w":3.2,"h":4.3,"l":27.5,"regions":[{"region":"PCE","h":5.33}]}]},{"type":"STROPRT","jeep":true,"booster":true,"selfIssue":false,"sizeDimensions":[{"w":3.2,"h":4.3,"l":40,"regions":[{"region":"PCE","h":5.33}]}]},{"type":"STRSELF","jeep":true,"booster":true,"selfIssue":true,"sizeDimensions":[{"w":3.2,"h":4.3,"l":36,"regions":[{"region":"PCE","h":5.33}]}]}]},{"type":"PICKRTT","trailers":[{"type":"SEMITRL","jeep":true,"booster":true,"selfIssue":true,"sizeDimensions":[{"fp":3,"w":3.2,"h":4.3,"l":27.5,"regions":[{"region":"PCE","h":5.33}]}]},{"type":"HIBOEXP","jeep":true,"booster":true,"selfIssue":true,"sizeDimensions":[{"fp":3,"w":3.2,"h":4.3,"l":27.5,"regions":[{"region":"PCE","h":5.33}]}]},{"type":"HIBOFLT","jeep":true,"booster":true,"selfIssue":true,"sizeDimensions":[{"fp":3,"w":3.2,"h":4.3,"l":27.5,"regions":[{"region":"PCE","h":5.33}]}]},{"type":"STSDBDK","jeep":true,"booster":true,"selfIssue":true,"sizeDimensions":[{"fp":3,"w":3.2,"h":4.3,"l":27.5,"regions":[{"region":"PCE","h":5.33}]}]}]},{"type":"STINGER","trailers":[{"type":"SEMITRL","jeep":false,"booster":false,"selfIssue":true,"sizeDimensions":[{"fp":1,"rp":1.2,"h":4.3,"l":25,"regions":[{"region":"PCE","h":5.33}]}]},{"type":"STSTNGR","jeep":false,"booster":false,"selfIssue":true,"sizeDimensions":[{"fp":1,"rp":1.2,"h":4.3,"l":25,"regions":[{"region":"PCE","h":5.33}]}]}]},{"type":"REGTRCK","trailers":[{"type":"DOLLIES","jeep":false,"booster":false,"selfIssue":true,"sizeDimensions":[{"fp":1,"rp":6.5,"w":3.2,"h":4.3,"l":25,"regions":[{"region":"PCE","h":4.4}]}]},{"type":"FULLLTL","jeep":false,"booster":false,"selfIssue":true,"sizeDimensions":[{"fp":1,"rp":6.5,"w":3.2,"h":4.3,"l":25,"regions":[{"region":"PCE","h":4.4}]}]},{"type":"NONEXXX","jeep":false,"booster":false,"selfIssue":true,"sizeDimensions":[{"fp":1,"rp":6.5,"w":3.2,"h":4.3,"l":16,"regions":[{"region":"PCE","h":4.4}]}]},{"type":"PONYTRL","jeep":false,"booster":false,"selfIssue":true,"sizeDimensions":[{"fp":1,"rp":6.5,"w":3.2,"h":4.3,"l":25,"regions":[{"region":"PCE","h":4.4}]}]}]}]}},{"id":"SCRAPER","name":"Scraper on Dollies","size":{"powerUnits":[{"type":"TRKTRAC","trailers":[{"type":"DOLLIES","jeep":true,"booster":false,"selfIssue":false,"sizeDimensions":[{"w":3.2,"h":4.3,"l":25,"regions":[{"region":"PCE","h":4.4}]}]}]}]}},{"id":"OILFILD","name":"Oil Field Equipment","size":{"powerUnits":[{"type":"OGBEDTK","trailers":[{"type":"EXPANDO","jeep":true,"booster":true,"selfIssue":true,"sizeDimensions":[{"fp":3,"rp":6.5,"h":4.3,"l":27.5}]},{"type":"NONEXXX","jeep":false,"booster":false,"selfIssue":true,"sizeDimensions":[{"rp":5,"w":3.3,"h":4.3,"l":14}]},{"type":"OGOSFDT","jeep":true,"booster":true,"selfIssue":true,"sizeDimensions":[{"fp":3,"rp":6.5,"w":3.3,"h":4.3,"l":23}]}]},{"type":"OGOILSW","trailers":[{"type":"NONEXXX","jeep":false,"booster":false,"selfIssue":true,"sizeDimensions":[{"rp":5,"w":3.2,"h":4.3,"l":15}]},{"type":"HIBOFLT","jeep":true,"booster":true,"selfIssue":true,"sizeDimensions":[{"fp":3,"rp":6.5,"w":3.2,"h":4.3,"l":25}]}]},{"type":"OGSERVC","trailers":[{"type":"NONEXXX","jeep":false,"booster":false,"selfIssue":true,"sizeDimensions":[{"fp":10,"rp":6.5,"w":3.8,"h":4.3,"l":15}]},{"type":"PONYTRL","jeep":false,"booster":false,"selfIssue":true,"sizeDimensions":[{"fp":10,"rp":6.5,"w":3.8,"h":4.3,"l":23}]}]},{"type":"OGSRRAH","trailers":[{"type":"NONEXXX","jeep":false,"booster":false,"selfIssue":true,"sizeDimensions":[{"fp":10,"rp":6.5,"w":2.9,"h":4.15,"l":15.5}]},{"type":"PONYTRL","jeep":false,"booster":false,"selfIssue":true,"sizeDimensions":[{"fp":10,"rp":6.5,"w":2.9,"h":4.15,"l":23}]}]},{"type":"TRKTRAC","trailers":[{"type":"OGOSFDT","jeep":true,"booster":true,"selfIssue":true,"sizeDimensions":[{"fp":3,"rp":6.5,"w":3.3,"h":4.3,"l":23}]}]}]}},{"id":"JPTRLOG","name":"Tandem Jeep/Pole Trailer Loaded on Logging Truck","size":{"powerUnits":[{"type":"TRKTRAC","trailers":[{"type":"NONEXXX","jeep":false,"booster":false,"selfIssue":true,"sizeDimensions":[{"rp":5,"w":2.9,"h":4.3}]}]},{"type":"REGTRCK","trailers":[{"type":"NONEXXX","jeep":false,"booster":false,"selfIssue":true,"sizeDimensions":[{"rp":5,"w":2.9,"h":4.3}]}]}]}},{"id":"TOWDISB","name":"Tow Trucks And Disabled Vehicles","size":{"powerUnits":[{"type":"TOWVEHC","trailers":[{"type":"NONEXXX","jeep":false,"booster":false,"selfIssue":true,"sizeDimensions":[{"h":4.3,"l":27.5}]}]}]}},{"id":"TRQDLOG","name":"Tri-Axle or Quad Axle Full Trailer Loaded on Logging Truck","size":{"powerUnits":[{"type":"TRKTRAC","trailers":[{"type":"NONEXXX","jeep":false,"booster":false,"selfIssue":true,"sizeDimensions":[{"rp":5,"h":4.3,"l":13.5}]}]},{"type":"REGTRCK","trailers":[{"type":"NONEXXX","jeep":false,"booster":false,"selfIssue":true,"sizeDimensions":[{"rp":5,"h":4.3,"l":13.5}]}]}]}},{"id":"WOODCHP","name":"Wood Chips, Residuals","size":{"powerUnits":[{"type":"TRKTRAC","trailers":[{"type":"STBTRAN","jeep":false,"booster":false,"selfIssue":true,"sizeDimensions":[{"h":4.45,"l":27.5}]}]}]}},{"id":"EMPTYXX","name":"Empty","size":{"powerUnits":[{"type":"TRKTRAC","trailers":[{"type":"LOGOWBK","jeep":false,"booster":false,"selfIssue":true,"sizeDimensions":[{"fp":0,"rp":0,"w":3.2}]},{"type":"PLATFRM","jeep":true,"booster":true,"selfIssue":false,"sizeDimensions":[{"w":3.2,"h":4.88,"l":27.5,"regions":[{"region":"PCE","h":5.33}]}]},{"type":"HIBOEXP","jeep":true,"booster":true,"selfIssue":true,"sizeDimensions":[{"fp":3,"rp":6.5,"l":31}]},{"type":"HIBOFLT","jeep":true,"booster":true,"selfIssue":true,"sizeDimensions":[{"fp":3,"rp":6.5,"l":27.5}]},{"type":"STSDBDK","jeep":true,"booster":true,"selfIssue":true,"sizeDimensions":[{"fp":3,"rp":6.5,"w":3.2,"l":31}]},{"type":"STWHELR","jeep":true,"booster":true,"selfIssue":false,"sizeDimensions":[{"w":3.2,"h":4.88,"l":27.5,"regions":[{"region":"PCE","h":5.33}]}]},{"type":"STWIDWH","jeep":true,"booster":true,"selfIssue":false,"sizeDimensions":[{"w":3.2,"h":4.88,"l":27.5,"regions":[{"region":"PCE","h":5.33}]}]},{"type":"STCRANE","jeep":true,"booster":true,"selfIssue":true,"sizeDimensions":[{"w":3.2,"h":4.88,"l":27.5,"regions":[{"region":"PCE","h":5.33}]}]}]},{"type":"PICKRTT","trailers":[{"type":"OGOSFDT","jeep":true,"booster":true,"selfIssue":true,"sizeDimensions":[{"fp":3,"rp":6.5,"w":3.2,"h":4.3,"l":23}]},{"type":"PLATFRM","jeep":true,"booster":true,"selfIssue":false,"sizeDimensions":[{"w":3.2,"h":4.88,"l":27.5,"regions":[{"region":"PCE","h":5.33}]}]},{"type":"HIBOEXP","jeep":true,"booster":true,"selfIssue":true,"sizeDimensions":[{"fp":3,"rp":6.5,"l":25,"regions":[{"region":"PCE","l":27.5}]}]},{"type":"STWHELR","jeep":true,"booster":true,"selfIssue":false,"sizeDimensions":[{"w":3.2,"h":4.88,"l":27.5,"regions":[{"region":"PCE","h":5.33}]}]},{"type":"STWIDWH","jeep":true,"booster":true,"selfIssue":false,"sizeDimensions":[{"w":3.2,"h":4.88,"l":27.5,"regions":[{"region":"PCE","h":5.33}]}]},{"type":"STCRANE","jeep":true,"booster":true,"selfIssue":true,"sizeDimensions":[{"w":3.2,"h":4.88,"l":27.5,"regions":[{"region":"PCE","h":5.33}]}]}]}]}},{"id":"GRBBINS","name":"Garbage Bins","size":{"powerUnits":[{"type":"REGTRCK","trailers":[{"type":"FULLLTL","jeep":false,"booster":false,"selfIssue":true,"sizeDimensions":[{"fp":3,"rp":6.5}]},{"type":"NONEXXX","jeep":false,"booster":false,"selfIssue":true,"sizeDimensions":[{"fp":3,"rp":6.5}]},{"type":"PONYTRL","jeep":false,"booster":false,"selfIssue":true,"sizeDimensions":[{"fp":3,"rp":6.5}]}]}]}},{"id":"LAMBEAM","name":"Laminated Beams","size":{"powerUnits":[{"type":"TRKTRAC","trailers":[{"type":"POLETRL","jeep":true,"booster":true,"selfIssue":true,"sizeDimensions":[{"fp":3,"rp":6.5,"l":40}]},{"type":"HIBOEXP","jeep":true,"booster":true,"selfIssue":true,"sizeDimensions":[{"fp":3,"rp":6.5,"l":31}]}]}]}},{"id":"HAYLREC","name":"Hay Bales Large Rectangular","size":{"powerUnits":[{"type":"TRKTRAC","trailers":[{"type":"STACTRN","jeep":false,"booster":false,"selfIssue":true,"sizeDimensions":[{"w":3.05,"h":4.3,"l":26,"regions":[{"region":"PCE","h":4.8}]}]},{"type":"STBTRAN","jeep":false,"booster":false,"selfIssue":true,"sizeDimensions":[{"w":3.05,"h":4.3,"l":27.5,"regions":[{"region":"PCE","h":4.8}]}]},{"type":"HIBOFLT","jeep":true,"booster":true,"selfIssue":true,"sizeDimensions":[{"fp":3,"rp":6.5,"w":3.05,"h":4.4,"regions":[{"region":"LMN","h":4.3},{"region":"KTN","h":4.3},{"region":"PCE","h":4.8}]}]},{"type":"STSDBDK","jeep":true,"booster":true,"selfIssue":true,"sizeDimensions":[{"fp":3,"rp":6.5,"w":3.05,"h":4.3,"regions":[{"region":"PCE","h":4.8}]}]}]},{"type":"REGTRCK","trailers":[{"type":"FULLLTL","jeep":false,"booster":false,"selfIssue":true,"sizeDimensions":[{"rp":4,"w":3.05,"h":4.3,"regions":[{"region":"PCE","h":4.8}]}]},{"type":"NONEXXX","jeep":false,"booster":false,"selfIssue":true,"sizeDimensions":[{"w":3.05,"h":4.3,"regions":[{"region":"PCE","h":4.8}]}]},{"type":"PONYTRL","jeep":false,"booster":false,"selfIssue":true,"sizeDimensions":[{"rp":4,"w":3.05,"h":4.3,"regions":[{"region":"PCE","h":4.8}]}]}]}]}},{"id":"HAYROND","name":"Hay Bales Round","size":{"powerUnits":[{"type":"TRKTRAC","trailers":[{"type":"STACTRN","jeep":false,"booster":false,"selfIssue":true,"sizeDimensions":[{"w":3.5,"h":4.3,"l":26,"regions":[{"region":"PCE","w":3.84,"h":4.8}]}]},{"type":"STBTRAN","jeep":false,"booster":false,"selfIssue":true,"sizeDimensions":[{"w":3.5,"h":4.3,"l":27.5,"regions":[{"region":"PCE","w":3.84,"h":4.8}]}]},{"type":"HIBOFLT","jeep":true,"booster":true,"selfIssue":true,"sizeDimensions":[{"fp":3,"rp":6.5,"w":3.5,"h":4.3,"regions":[{"region":"PCE","w":3.84,"h":4.8}]}]},{"type":"STSDBDK","jeep":true,"booster":true,"selfIssue":true,"sizeDimensions":[{"fp":3,"rp":6.5,"w":3.5,"h":4.3,"regions":[{"region":"PCE","w":3.84,"h":4.8}]}]}]},{"type":"REGTRCK","trailers":[{"type":"FULLLTL","jeep":false,"booster":false,"selfIssue":true,"sizeDimensions":[{"rp":4,"w":3.5,"h":4.3,"regions":[{"region":"PCE","w":3.84,"h":4.8}]}]},{"type":"NONEXXX","jeep":false,"booster":false,"selfIssue":true,"sizeDimensions":[{"w":3.5,"h":4.3,"regions":[{"region":"PCE","w":3.84,"h":4.8}]}]},{"type":"PONYTRL","jeep":false,"booster":false,"selfIssue":true,"sizeDimensions":[{"rp":4,"w":3.5,"h":4.3,"regions":[{"region":"PCE","w":3.84,"h":4.8}]}]}]}]}},{"id":"HAYSREC","name":"Hay Bales Small Rectangular","size":{"powerUnits":[{"type":"TRKTRAC","trailers":[{"type":"STACTRN","jeep":false,"booster":false,"selfIssue":true,"sizeDimensions":[{"w":3.05,"h":4.3,"l":26,"regions":[{"region":"PCE","h":4.8}]}]},{"type":"STBTRAN","jeep":false,"booster":false,"selfIssue":true,"sizeDimensions":[{"w":3.05,"h":4.3,"l":27.5,"regions":[{"region":"PCE","h":4.8}]}]},{"type":"HIBOFLT","jeep":true,"booster":true,"selfIssue":true,"sizeDimensions":[{"fp":3,"rp":6.5,"w":3.05,"h":4.3,"regions":[{"region":"PCE","h":4.8}]}]},{"type":"STSDBDK","jeep":true,"booster":true,"selfIssue":true,"sizeDimensions":[{"fp":3,"rp":6.5,"w":3.05,"h":4.3,"regions":[{"region":"PCE","h":4.8}]}]}]},{"type":"REGTRCK","trailers":[{"type":"FULLLTL","jeep":false,"booster":false,"selfIssue":true,"sizeDimensions":[{"rp":4,"w":3.05,"h":4.3,"regions":[{"region":"PCE","h":4.8}]}]},{"type":"NONEXXX","jeep":false,"booster":false,"selfIssue":true,"sizeDimensions":[{"w":3.05,"h":4.3,"regions":[{"region":"PCE","h":4.8}]}]},{"type":"PONYTRL","jeep":false,"booster":false,"selfIssue":true,"sizeDimensions":[{"rp":4,"w":3.05,"h":4.3,"regions":[{"region":"PCE","h":4.8}]}]}]}]}},{"id":"BRGBEAM","name":"Bridge Beams","size":{"powerUnits":[{"type":"TRKTRAC","trailers":[{"type":"POLETRL","jeep":true,"booster":false,"selfIssue":true,"sizeDimensions":[{"fp":3,"rp":6.5,"l":31}]}]}]}},{"id":"NONREDU","name":"Non-Reducible Loads","size":{"powerUnits":[{"type":"TRKTRAC","trailers":[{"type":"STLOGNG","jeep":false,"booster":false,"selfIssue":false,"sizeDimensions":[{"w":3.8,"h":4.15,"l":27.5}]},{"type":"PLATFRM","jeep":true,"booster":true,"selfIssue":false,"sizeDimensions":[{"w":5,"h":4.88,"l":27.5,"regions":[{"region":"PCE","h":5.33}]}]},{"type":"SEMITRL","jeep":true,"booster":true,"selfIssue":true,"sizeDimensions":[{"w":5,"h":4.88,"l":27.5,"regions":[{"region":"PCE","h":5.33}]}]},{"type":"STACTRN","jeep":false,"booster":false,"selfIssue":true,"sizeDimensions":[{"w":5,"h":4.4,"l":26,"regions":[{"region":"PCE","h":5.33}]}]},{"type":"STBTRAN","jeep":false,"booster":false,"selfIssue":true,"sizeDimensions":[{"w":5,"h":4.4,"l":27.5,"regions":[{"region":"PCE","h":5.33}]}]},{"type":"HIBOEXP","jeep":true,"booster":true,"selfIssue":true,"sizeDimensions":[{"w":5,"h":4.4,"l":27.5,"regions":[{"region":"PCE","h":5.33}]}]},{"type":"HIBOFLT","jeep":true,"booster":true,"selfIssue":true,"sizeDimensions":[{"w":5,"h":4.4,"l":27.5,"regions":[{"region":"PCE","h":5.33}]}]},{"type":"STSDBDK","jeep":true,"booster":true,"selfIssue":true,"sizeDimensions":[{"w":5,"h":4.88,"l":27.5,"regions":[{"region":"PCE","h":5.33}]}]},{"type":"STSTEER","jeep":true,"booster":true,"selfIssue":false,"sizeDimensions":[{"w":5,"h":4.88,"l":27.5,"regions":[{"region":"PCE","h":5.33}]}]},{"type":"STWHELR","jeep":true,"booster":true,"selfIssue":true,"sizeDimensions":[{"w":5,"h":4.88,"l":27.5,"regions":[{"region":"PCE","h":5.33}]}]},{"type":"STWIDWH","jeep":true,"booster":true,"selfIssue":true,"sizeDimensions":[{"w":5,"h":4.88,"l":27.5,"regions":[{"region":"PCE","h":5.33}]}]},{"type":"STCRANE","jeep":true,"booster":true,"selfIssue":true,"sizeDimensions":[{"w":5,"h":4.88,"l":27.5,"regions":[{"region":"PCE","h":5.33}]}]},{"type":"STROPRT","jeep":true,"booster":true,"selfIssue":true,"sizeDimensions":[{"w":5,"h":4.88,"l":40,"regions":[{"region":"PCE","h":5.33}]}]},{"type":"STRSELF","jeep":true,"booster":true,"selfIssue":true,"sizeDimensions":[{"w":5,"h":4.88,"l":36,"regions":[{"region":"PCE","h":5.33}]}]}]},{"type":"PICKRTT","trailers":[{"type":"OGOSFDT","jeep":true,"booster":true,"selfIssue":false,"sizeDimensions":[{"fp":3,"rp":6.5,"w":3.3,"h":4.3,"l":23}]},{"type":"SEMITRL","jeep":true,"booster":true,"selfIssue":true,"sizeDimensions":[{"fp":3,"w":5,"h":4.88,"l":25,"regions":[{"region":"PCE","h":5.33}]}]},{"type":"HIBOEXP","jeep":true,"booster":true,"selfIssue":true,"sizeDimensions":[{"fp":3,"w":5,"h":4.4,"l":25,"regions":[{"region":"PCE","h":5.33}]}]},{"type":"HIBOFLT","jeep":true,"booster":true,"selfIssue":true,"sizeDimensions":[{"fp":3,"w":5,"h":4.4,"l":25,"regions":[{"region":"PCE","h":5.33}]}]},{"type":"STSDBDK","jeep":true,"booster":true,"selfIssue":false,"sizeDimensions":[{"fp":3,"w":5,"h":4.88,"l":25,"regions":[{"region":"PCE","h":5.33}]}]},{"type":"STSTEER","jeep":true,"booster":true,"selfIssue":true,"sizeDimensions":[{"w":5,"h":4.88,"l":27.5,"regions":[{"region":"PCE","h":5.33}]}]},{"type":"STWHELR","jeep":true,"booster":true,"selfIssue":false,"sizeDimensions":[{"w":5,"h":4.88,"l":27.5,"regions":[{"region":"PCE","h":5.33}]}]},{"type":"STWIDWH","jeep":true,"booster":true,"selfIssue":true,"sizeDimensions":[{"w":5,"h":4.88,"l":27.5,"regions":[{"region":"PCE","h":5.33}]}]},{"type":"STCRANE","jeep":true,"booster":true,"selfIssue":true,"sizeDimensions":[{"w":5,"h":4.88,"l":27.5,"regions":[{"region":"PCE","h":5.33}]}]},{"type":"STROPRT","jeep":true,"booster":true,"selfIssue":true,"sizeDimensions":[{"w":5,"h":4.88,"l":40,"regions":[{"region":"PCE","h":5.33}]}]},{"type":"STRSELF","jeep":true,"booster":true,"selfIssue":true,"sizeDimensions":[{"w":5,"h":4.88,"l":36,"regions":[{"region":"PCE","h":5.33}]}]}]},{"type":"STINGER","trailers":[{"type":"SEMITRL","jeep":false,"booster":false,"selfIssue":false,"sizeDimensions":[{"fp":1,"rp":1.2,"h":4.88,"l":25,"regions":[{"region":"PCE","h":5.33}]}]},{"type":"STSTNGR","jeep":false,"booster":false,"selfIssue":true,"sizeDimensions":[{"fp":1,"rp":1.2,"h":4.88,"l":25,"regions":[{"region":"PCE","h":5.33}]}]}]},{"type":"REGTRCK","trailers":[{"type":"DOLLIES","jeep":false,"booster":false,"selfIssue":true,"sizeDimensions":[{"fp":1,"rp":6.5,"w":5,"h":4.88,"l":25,"regions":[{"region":"PCE","h":5.33}]}]},{"type":"FULLLTL","jeep":false,"booster":false,"selfIssue":true,"sizeDimensions":[{"fp":1,"rp":6.5,"w":5,"h":4.88,"l":25,"regions":[{"region":"PCE","h":5.33}]}]},{"type":"NONEXXX","jeep":false,"booster":false,"selfIssue":true,"sizeDimensions":[{"fp":1,"rp":6.5,"w":5,"h":4.88,"l":16,"regions":[{"region":"PCE","h":5.33}]}]},{"type":"PONYTRL","jeep":false,"booster":false,"selfIssue":true,"sizeDimensions":[{"fp":1,"rp":6.5,"w":5,"h":4.88,"l":25,"regions":[{"region":"PCE","h":5.33}]}]}]}]}},{"id":"AUTOCRR","name":"Auto Carrier, Campers And Boats (Stinger Steered Transporters Only)","size":{"powerUnits":[{"type":"STINGER","trailers":[{"type":"STSTNGR","jeep":false,"booster":false,"selfIssue":true,"sizeDimensions":[{"fp":1,"rp":1.2,"h":4.4,"l":25,"regions":[{"region":"LMN","h":4.3},{"region":"KTN","h":4.3},{"region":"PCE","h":4.88}]}]}]}]}},{"id":"HAYRNPR","name":"Hay Bales (Round) Peace River Only","size":{"powerUnits":[{"type":"TRKTRAC","trailers":[{"type":"STACTRN","jeep":false,"booster":false,"selfIssue":true,"sizeDimensions":[{"w":3.5,"h":4.3,"l":26,"regions":[{"region":"PCE","w":3.84,"h":4.8}]}]},{"type":"STBTRAN","jeep":false,"booster":false,"selfIssue":true,"sizeDimensions":[{"w":3.5,"h":4.3,"regions":[{"region":"PCE","w":3.84,"h":4.8}]}]},{"type":"HIBOFLT","jeep":true,"booster":true,"selfIssue":true,"sizeDimensions":[{"fp":3,"rp":6.5,"w":3.5,"h":4.3,"regions":[{"region":"PCE","w":3.84,"h":4.8}]}]},{"type":"STSDBDK","jeep":true,"booster":true,"selfIssue":true,"sizeDimensions":[{"fp":3,"rp":6.5,"w":3.5,"h":4.3,"regions":[{"region":"PCE","w":3.84,"h":4.8}]}]}]},{"type":"REGTRCK","trailers":[{"type":"FULLLTL","jeep":false,"booster":false,"selfIssue":true,"sizeDimensions":[{"rp":4,"w":3.5,"h":4.3,"regions":[{"region":"PCE","w":3.84,"h":4.8}]}]},{"type":"NONEXXX","jeep":false,"booster":false,"selfIssue":true,"sizeDimensions":[{"w":3.5,"h":4.3,"regions":[{"region":"PCE","w":3.84,"h":4.8}]}]},{"type":"PONYTRL","jeep":false,"booster":false,"selfIssue":true,"sizeDimensions":[{"rp":4,"w":3.5,"h":4.3,"regions":[{"region":"PCE","w":3.84,"h":4.8}]}]}]}]}},{"id":"BRSHCUT","name":"Brushcutters (Peace Only)","size":{"powerUnits":[{"type":"TRKTRAC","trailers":[{"type":"SEMITRL","jeep":false,"booster":false,"selfIssue":true,"sizeDimensions":[{"fp":3,"rp":6.5,"regions":[{"region":"PCE","w":4.57,"h":5.33}]}]},{"type":"STSDBDK","jeep":true,"booster":true,"selfIssue":true,"sizeDimensions":[{"fp":3,"rp":6.5,"regions":[{"region":"PCE","w":4.57,"h":5.33}]}]}]},{"type":"REGTRCK","trailers":[{"type":"NONEXXX","jeep":false,"booster":false,"selfIssue":true,"sizeDimensions":[{"regions":[{"region":"PCE","w":4.57,"h":5.33}]}]},{"type":"PONYTRL","jeep":false,"booster":false,"selfIssue":true,"sizeDimensions":[{"regions":[{"region":"PCE","w":3.8,"h":5.33}]}]}]}]}},{"id":"FIXEDEQ","name":"Fixed Equipment","size":{"powerUnits":[{"type":"TRKTRAC","trailers":[{"type":"FECVYER","jeep":true,"booster":true,"selfIssue":true,"sizeDimensions":[{"fp":4,"rp":9.5,"w":3.8,"h":4.72,"l":31,"regions":[{"region":"PCE","h":5.33}]}]},{"type":"FEDRMMX","jeep":true,"booster":true,"selfIssue":true,"sizeDimensions":[{"fp":3,"rp":6.5,"w":3.8,"h":4.72,"l":31,"regions":[{"region":"PCE","h":5.33}]}]},{"type":"FEBGHSE","jeep":true,"booster":true,"selfIssue":true,"sizeDimensions":[{"fp":3,"rp":6.5,"w":4.26,"h":4.72,"l":31,"regions":[{"region":"PCE","h":5.33}]}]},{"type":"FESEMTR","jeep":true,"booster":true,"selfIssue":true,"sizeDimensions":[{"fp":3,"rp":6.5,"w":3.8,"h":4.72,"l":31,"regions":[{"region":"PCE","h":5.33}]}]},{"type":"FEWHELR","jeep":true,"booster":true,"selfIssue":false,"sizeDimensions":[{"fp":3,"rp":6.5,"w":3.8,"h":4.72,"l":31,"regions":[{"region":"PCE","h":5.33}]}]}]},{"type":"REGTRCK","trailers":[{"type":"FECVYPT","jeep":false,"booster":false,"selfIssue":true,"sizeDimensions":[{"fp":4,"rp":9.5,"w":3.2,"h":4.3,"l":31}]},{"type":"FEDRMMX","jeep":false,"booster":false,"selfIssue":true,"sizeDimensions":[{"fp":3,"rp":6.5,"w":3.8,"h":4.72,"l":31,"regions":[{"region":"PCE","h":5.33}]}]},{"type":"FEPNYTR","jeep":false,"booster":false,"selfIssue":true,"sizeDimensions":[{"rp":4,"w":3.2,"h":4.3,"l":31}]},{"type":"FEBGHSE","jeep":false,"booster":false,"selfIssue":true,"sizeDimensions":[{"fp":3,"rp":6.5,"w":4.26,"h":4.72,"l":31}]}]}]}}],"globalSizeDefaults":{"fp":3,"rp":6.5,"w":2.6,"h":4.15,"l":31}}') +GO \ No newline at end of file diff --git a/database/mssql/scripts/utility/refresh-sample-data.sh b/database/mssql/scripts/utility/refresh-sample-data.sh index 022bf96f4..01b5b8ee1 100644 --- a/database/mssql/scripts/utility/refresh-sample-data.sh +++ b/database/mssql/scripts/utility/refresh-sample-data.sh @@ -14,6 +14,7 @@ sqlcmd -C -U ${ORBC_USER} -P "${ORBC_PASS}" -S ${ORBC_SERVER} -d ${ORBC_DATABASE sqlcmd -C -U ${ORBC_USER} -P "${ORBC_PASS}" -S ${ORBC_SERVER} -d ${ORBC_DATABASE} -Q "SET NOCOUNT ON; DELETE FROM dbo.ORBC_COMPANY" sqlcmd -C -U ${ORBC_USER} -P "${ORBC_PASS}" -S ${ORBC_SERVER} -d ${ORBC_DATABASE} -Q "SET NOCOUNT ON; DELETE FROM dbo.ORBC_CONTACT" sqlcmd -C -U ${ORBC_USER} -P "${ORBC_PASS}" -S ${ORBC_SERVER} -d ${ORBC_DATABASE} -Q "SET NOCOUNT ON; DELETE FROM dbo.ORBC_ADDRESS" +sqlcmd -C -U ${ORBC_USER} -P "${ORBC_PASS}" -S ${ORBC_SERVER} -d ${ORBC_DATABASE} -Q "SET NOCOUNT ON; DELETE FROM dbo.ORBC_POLICY_CONFIGURATION" echo "Finished deleting existing sample data" echo "Loading sample data...please wait" @@ -25,6 +26,7 @@ sqlcmd -C -U ${ORBC_USER} -P "${ORBC_PASS}" -S ${ORBC_SERVER} -d ${ORBC_DATABASE sqlcmd -C -U ${ORBC_USER} -P "${ORBC_PASS}" -S ${ORBC_SERVER} -d ${ORBC_DATABASE} -i ${SCRIPT_DIR}/sampledata/dbo.ORBC_POWER_UNIT.Table.sql sqlcmd -C -U ${ORBC_USER} -P "${ORBC_PASS}" -S ${ORBC_SERVER} -d ${ORBC_DATABASE} -i ${SCRIPT_DIR}/sampledata/dbo.ORBC_TRAILER.Table.sql sqlcmd -C -U ${ORBC_USER} -P "${ORBC_PASS}" -S ${ORBC_SERVER} -d ${ORBC_DATABASE} -i ${SCRIPT_DIR}/sampledata/dbo.ORBC_FEATURE_FLAG.Table.sql +sqlcmd -C -U ${ORBC_USER} -P "${ORBC_PASS}" -S ${ORBC_SERVER} -d ${ORBC_DATABASE} -i ${SCRIPT_DIR}/sampledata/dbo.ORBC_POLICY_CONFIGURATION.Table.sql echo "Setting credit account sequence restart to current timestamp (used only for lower environments)" sqlcmd -C -U ${ORBC_USER} -P "${ORBC_PASS}" -S ${ORBC_SERVER} -d ${ORBC_DATABASE} -i ${SCRIPT_DIR}/sampledata/permit.ORBC_CREDIT_ACCOUNT_NUMBER_SEQ.sql diff --git a/policy-engine/docs/validation-result-reference.md b/policy-engine/docs/validation-result-reference.md new file mode 100644 index 000000000..005dfcfaa --- /dev/null +++ b/policy-engine/docs/validation-result-reference.md @@ -0,0 +1,89 @@ +# Policy Validation Result Reference + +## Validating a Permit Application +Permits are validated with the policy engine by supplying the permit JSON to the `validate` method of an instantiated policy object. A policy object is instantiated by passing a policy configuration JSON object to the `Policy` constructor. Refer to the Policy Configuration Reference documentation for information about the structure of the policy configuration JSON object. + +The `validate` method returns an object of type `ValidationResults` which has 5 properties: `violations`, `requirements`, `warnings`, `information`, and `cost`. Each of these properties is an array of `ValidationResult` objects. + +Currently in onroute only the `violations` and `cost` properties are used. In the future, `requirements`, `warnings`, and `information` will be added. For now those properties may be ignored. + +### Valid Permit Applications +A valid permit application is one whose `ValidationResults` has an empty `violations` array. That is, no policy violations were found in the permit application. Here is an example: + +```js +{ + "violations": [], + "requirements": [], + "warnings": [], + "information": [], + "cost": [ + { + "type": "cost", + "code": "cost-value", + "message": "Calculated permit cost", + "cost": 30 + } + ] +} +``` + +## Violations +If at least one `ValidationResult` is present in the `violations` property of the result, the permit application has failed the policy check. + +The `ValidationResult` will typically contain information about what the nature of the violation was. Here is an example: + +```js + "violations": [ + { + "type": "violation", + "code": "field-validation-error", + "message": "Duration must be in 30 day increments or a full year", + "fieldReference": "permitData.permitDuration" + } + ], +``` +In the example above, the permit duration in the permit application JSON was 31 days, which is invalid according to the rules specified for the permit type (TROS in this case). + +All of the properties of the violation are configured directly in the policy configuration JSON file, and are taken verbatim from there. To change the message presented for this violation, simply update the policy configuration JSON. + +### type +Violation `ValidationResult` objects will always have a type of `violation`. + +### code +The `code` property indicates the nature of the violation, which may be used by the calling application. For example, a `field-validation-error` may cause the frontend form to highlight the form element and present the message underneath in red text. + +### message +The `message` property is a friendly description of the cause of the violation. + +### fieldReference +The `fieldReference` property indicates the specific field which caused the violation, and can be used in conjunction with `code` to provide context to a user in the frontend. + +## Cost +To calculate the cost of a permit, validate it using the policy engine's `validate` method. The validation result will include a `cost` property specifying the cost of the permit. + +Any permit with a cost greater than zero will have at least one `ValidationResult` in the `cost` array of the `ValidationResults` object. Here is an example of a valid one year term oversize permit: + +```js +{ + "violations": [], + "requirements": [], + "warnings": [], + "information": [], + "cost": [ + { + "type": "cost", + "code": "cost-value", + "message": "Calculated permit cost", + "cost": 360 + } + ] +} +``` +The `type` will always be `cost`, `code` will always be `cost-value`, and `message` will always be `Calculated permit cost`. These may be ignored. + +The `cost` property indicates the permit cost in Canadian dollars, based on the details in the permit application itself. + +It is possible that there are multiple `cost` results. In this case, it is up to the calling application to add all of the `cost` properties together for a final permit cost. + +> [!NOTE] +> The reason there may be multiple `cost` results is that some permit types have both a fixed cost (minimum permit cost) as well as a cost based on kilometres driven. Since these are calculated independently they are added separately to the `cost` array. Typically there is no need for the onroute application to break down the permit cost into its constituent parts so only the sum is used. \ No newline at end of file diff --git a/policy-engine/src/_examples/validate-invalid-tros.ts b/policy-engine/src/_examples/validate-invalid-tros.ts new file mode 100644 index 000000000..c9c054a0f --- /dev/null +++ b/policy-engine/src/_examples/validate-invalid-tros.ts @@ -0,0 +1,22 @@ +import { Policy } from 'onroute-policy-engine'; +import { PermitAppInfo } from 'onroute-policy-engine/enum'; +import { masterPolicyConfig } from '../_test/policy-config/master.sample'; +import { validTros30Day } from '../_test/permit-app/valid-tros-30day'; +import dayjs from 'dayjs'; + +async function start() { + const policy: Policy = new Policy(masterPolicyConfig); + + // Set startDate to today + validTros30Day.permitData.startDate = dayjs().format( + PermitAppInfo.PermitDateFormat.toString(), + ); + + // Set duration to 31 days (an invalid duration) + validTros30Day.permitData.permitDuration = 31; + + const validationResult2 = await policy.validate(validTros30Day); + console.log(JSON.stringify(validationResult2, null, ' ')); +} + +start(); From 55176514e947722313f5e5bbd8e36e2a8d5c8130 Mon Sep 17 00:00:00 2001 From: zgong-gov <123983557+zgong-gov@users.noreply.github.com> Date: Fri, 13 Sep 2024 13:06:36 -0700 Subject: [PATCH 28/63] ORV2-1504: Applying for no-fee permits (#1595) Co-authored-by: gchauhan-aot --- .../features/permits/helpers/feeSummary.ts | 6 ++ .../Amend/components/AmendPermitFinish.tsx | 1 + .../pages/Application/ApplicationReview.tsx | 16 +++++- .../components/form/PermitForm.tsx | 20 ++----- .../components/pay/ChoosePaymentMethod.scss | 1 + .../components/review/PermitReview.tsx | 15 +---- .../tests/ApplicationReview.test.tsx | 22 ++----- .../pages/ShoppingCart/ShoppingCartPage.scss | 1 + .../pages/ShoppingCart/ShoppingCartPage.tsx | 57 +++++++++++++------ .../components/ShoppingCartItem.tsx | 4 +- .../hooks/useCheckOutdatedCart.ts | 3 +- .../ShoppingCart/hooks/useShoppingCart.ts | 18 +++++- .../permits/pages/Void/FinishVoid.tsx | 4 +- .../pages/Void/components/VoidPermitForm.tsx | 22 ++++++- .../src/features/permits/types/CartItem.ts | 3 +- .../src/common/helper/permit-fee.helper.ts | 32 +++++++++-- .../payment/payment.service.ts | 33 ++++++++--- .../dto/response/read-shopping-cart.dto.ts | 8 +-- .../profile/shopping-cart.profile.ts | 4 +- 19 files changed, 180 insertions(+), 90 deletions(-) diff --git a/frontend/src/features/permits/helpers/feeSummary.ts b/frontend/src/features/permits/helpers/feeSummary.ts index 61927211b..560f96c85 100644 --- a/frontend/src/features/permits/helpers/feeSummary.ts +++ b/frontend/src/features/permits/helpers/feeSummary.ts @@ -107,6 +107,8 @@ export const calculateAmountToRefund = ( currPermitType: PermitType, ) => { const netPaid = calculateNetAmount(permitHistory); + if (isZeroAmount(netPaid)) return 0; // If total paid is $0 (eg. no-fee permits), then refund nothing + const feeForCurrDuration = calculateFeeByDuration(currPermitType, currDuration); return netPaid - feeForCurrDuration; }; @@ -128,12 +130,16 @@ export const isZeroAmount = (amount: number) => { */ export const calculateAmountForVoid = ( permit: Permit, + transactionHistory: PermitHistory[], ) => { const permitState = getPermitState(permit); if (permitState === PERMIT_STATES.EXPIRED) { return 0; } + const netAmountPaid = calculateNetAmount(transactionHistory); + if (isZeroAmount(netAmountPaid)) return 0; // If existing net paid is $0 (eg. no-fee permits), then refund nothing + const daysLeft = daysLeftBeforeExpiry(permit); const intervalDays = getDurationIntervalDays(permit.permitType); return calculateFeeByDuration( diff --git a/frontend/src/features/permits/pages/Amend/components/AmendPermitFinish.tsx b/frontend/src/features/permits/pages/Amend/components/AmendPermitFinish.tsx index e3d0f8b0f..28cbe8d59 100644 --- a/frontend/src/features/permits/pages/Amend/components/AmendPermitFinish.tsx +++ b/frontend/src/features/permits/pages/Amend/components/AmendPermitFinish.tsx @@ -18,6 +18,7 @@ import { DEFAULT_PERMIT_TYPE } from "../../../types/PermitType"; export const AmendPermitFinish = () => { const navigate = useNavigate(); const { companyId } = useParams(); + const { permit, amendmentApplication, diff --git a/frontend/src/features/permits/pages/Application/ApplicationReview.tsx b/frontend/src/features/permits/pages/Application/ApplicationReview.tsx index 87c926847..e6e04bbda 100644 --- a/frontend/src/features/permits/pages/Application/ApplicationReview.tsx +++ b/frontend/src/features/permits/pages/Application/ApplicationReview.tsx @@ -18,6 +18,8 @@ import { usePowerUnitSubTypesQuery } from "../../../manageVehicles/hooks/powerUn import { useTrailerSubTypesQuery } from "../../../manageVehicles/hooks/trailers"; import { useFetchSpecialAuthorizations } from "../../../settings/hooks/specialAuthorizations"; import { applyLCVToApplicationData } from "../../helpers/getDefaultApplicationFormData"; +import { calculateFeeByDuration } from "../../helpers/feeSummary"; +import { DEFAULT_PERMIT_TYPE } from "../../types/PermitType"; import { APPLICATIONS_ROUTES, APPLICATION_STEPS, @@ -38,11 +40,22 @@ export const ApplicationReview = () => { const { data: specialAuth } = useFetchSpecialAuthorizations(companyId); const isLcvDesignated = Boolean(specialAuth?.isLcvAllowed); + const isNoFeePermitType = Boolean(specialAuth?.noFeeType); const { data: companyInfo } = useCompanyInfoQuery(); const doingBusinessAs = companyInfo?.alternateName; - const applicationData = applyLCVToApplicationData(applicationContextData, isLcvDesignated); + const applicationData = applyLCVToApplicationData( + applicationContextData, + isLcvDesignated, + ); + + const fee = isNoFeePermitType + ? "0" + : `${calculateFeeByDuration( + getDefaultRequiredVal(DEFAULT_PERMIT_TYPE, applicationData?.permitType), + getDefaultRequiredVal(0, applicationData?.permitData?.permitDuration), + )}`; const { setSnackBar } = useContext(SnackBarContext); const { refetchCartCount } = useContext(CartContext); @@ -166,6 +179,7 @@ export const ApplicationReview = () => { applicationData?.permitData?.vehicleDetails?.saveVehicle } doingBusinessAs={doingBusinessAs} + calculatedFee={fee} /> diff --git a/frontend/src/features/permits/pages/Application/components/form/PermitForm.tsx b/frontend/src/features/permits/pages/Application/components/form/PermitForm.tsx index 33e4c7d40..11356c1b1 100644 --- a/frontend/src/features/permits/pages/Application/components/form/PermitForm.tsx +++ b/frontend/src/features/permits/pages/Application/components/form/PermitForm.tsx @@ -19,7 +19,6 @@ import { LCV_CONDITION } from "../../../../constants/constants"; import { sortConditions } from "../../../../helpers/conditions"; import { getStartOfDate } from "../../../../../../common/helpers/formatDate"; import { getExpiryDate } from "../../../../helpers/permitState"; -import { calculateFeeByDuration } from "../../../../helpers/feeSummary"; import { PowerUnit, Trailer, @@ -91,10 +90,6 @@ export const PermitForm = (props: PermitFormProps) => { setValue("permitData.expiryDate", dayjs(expiry)); }; - const handleSetFee = (fee: string) => { - setValue("permitData.feeSummary", fee); - }; - const isLcvDesignated = props.isLcvDesignated; const ineligiblePowerUnitSubtypes = getIneligiblePowerUnitSubtypes(permitType) .filter(subtype => !isLcvDesignated || !isVehicleSubtypeLCV(subtype.typeCode)); @@ -105,10 +100,7 @@ export const PermitForm = (props: PermitFormProps) => { handleSetExpiryDate(expiryDate); }, [expiryDate]); - // Update fee summary whenever duration or permit type changes - useEffect(() => { - handleSetFee(`${calculateFeeByDuration(permitType, permitDuration)}`); - }, [permitDuration, permitType]); + const isAmendAction = props.isAmendAction; const vehicleSubtype = vehicleFormData.vehicleSubType; useEffect(() => { @@ -117,7 +109,7 @@ export const PermitForm = (props: PermitFormProps) => { && permitConditions.some(({ condition }: PermitCondition) => condition === LCV_CONDITION.condition) ) { // If vehicle subtype in the form isn't LCV but conditions have LCV, - // then remove that LCV condition from the form + // then remove that LCV condition from the form handleSetConditions(permitConditions.filter( ({ condition }: PermitCondition) => condition !== LCV_CONDITION.condition, )); @@ -137,13 +129,13 @@ export const PermitForm = (props: PermitFormProps) => { @@ -154,7 +146,7 @@ export const PermitForm = (props: PermitFormProps) => { expiryDate={expiryDate} conditionsInPermit={permitConditions} durationOptions={props.durationOptions} - disableStartDate={props.isAmendAction} + disableStartDate={isAmendAction} permitType={permitType} pastStartDateStatus={props.pastStartDateStatus} includeLcvCondition={isLcvDesignated && isVehicleSubtypeLCV(vehicleFormData.vehicleSubType)} diff --git a/frontend/src/features/permits/pages/Application/components/pay/ChoosePaymentMethod.scss b/frontend/src/features/permits/pages/Application/components/pay/ChoosePaymentMethod.scss index 389c67953..d8ddd842d 100644 --- a/frontend/src/features/permits/pages/Application/components/pay/ChoosePaymentMethod.scss +++ b/frontend/src/features/permits/pages/Application/components/pay/ChoosePaymentMethod.scss @@ -1,5 +1,6 @@ .choose-payment-method { & &__title { + padding-top: 0; padding-bottom: 1.5rem; font-size: 1.5rem; } diff --git a/frontend/src/features/permits/pages/Application/components/review/PermitReview.tsx b/frontend/src/features/permits/pages/Application/components/review/PermitReview.tsx index 95c79459f..054d334db 100644 --- a/frontend/src/features/permits/pages/Application/components/review/PermitReview.tsx +++ b/frontend/src/features/permits/pages/Application/components/review/PermitReview.tsx @@ -12,9 +12,7 @@ import { ReviewFeeSummary } from "./ReviewFeeSummary"; import { ReviewActions } from "./ReviewActions"; import { CompanyProfile } from "../../../../../manageProfile/types/manageProfile"; import { VehicleSubType } from "../../../../../manageVehicles/types/Vehicle"; -import { DEFAULT_PERMIT_TYPE, PermitType } from "../../../../types/PermitType"; -import { calculateFeeByDuration } from "../../../../helpers/feeSummary"; -import { getDefaultRequiredVal } from "../../../../../../common/helpers/util"; +import { PermitType } from "../../../../types/PermitType"; import { Nullable } from "../../../../../../common/types/common"; import { PermitContactDetails } from "../../../../types/PermitContactDetails"; import { PermitVehicleDetails } from "../../../../types/PermitVehicleDetails"; @@ -48,18 +46,11 @@ interface PermitReviewProps { onAddToCart?: () => Promise; showChangedFields?: boolean; oldFields?: Nullable>; - calculatedFee?: Nullable; + calculatedFee: string; doingBusinessAs?: Nullable; } export const PermitReview = (props: PermitReviewProps) => { - const feeSummary = props.calculatedFee - ? props.calculatedFee - : `${calculateFeeByDuration( - getDefaultRequiredVal(DEFAULT_PERMIT_TYPE, props.permitType), - getDefaultRequiredVal(0, props.permitDuration), - )}`; - return ( @@ -108,7 +99,7 @@ export const PermitReview = (props: PermitReviewProps) => { isChecked={props.allChecked} setIsChecked={props.setAllChecked} permitType={props.permitType} - fee={feeSummary} + fee={props.calculatedFee} /> {props.children} diff --git a/frontend/src/features/permits/pages/Application/tests/ApplicationReview.test.tsx b/frontend/src/features/permits/pages/Application/tests/ApplicationReview.test.tsx index 52346fd91..09b10e1f6 100644 --- a/frontend/src/features/permits/pages/Application/tests/ApplicationReview.test.tsx +++ b/frontend/src/features/permits/pages/Application/tests/ApplicationReview.test.tsx @@ -408,24 +408,14 @@ describe("Review and Confirm Application Details", () => { it("should display proper fee summary", async () => { // Arrange and Act - const applicationData = { - ...defaultApplicationData, - permitData: { - ...defaultApplicationData.permitData, - feeSummary: `${calculateFeeByDuration( - defaultApplicationData.permitType, - defaultApplicationData.permitData.permitDuration, - )}`, - }, - }; - renderTestComponent(applicationData); + renderTestComponent(defaultApplicationData); // Assert - const { - permitType, - permitData: { feeSummary }, - } = applicationData; - const permitTypeStr = permitTypeDisplayText(permitType); + const feeSummary = `${calculateFeeByDuration( + defaultApplicationData.permitType, + defaultApplicationData.permitData.permitDuration, + )}`; + const permitTypeStr = permitTypeDisplayText(defaultApplicationData.permitType); expect(await feeSummaryPermitType()).toHaveTextContent(permitTypeStr); expect(await feeSummaryPrice()).toHaveTextContent(`$${feeSummary}.00`); expect(await feeSummaryTotal()).toHaveTextContent(`$${feeSummary}.00`); diff --git a/frontend/src/features/permits/pages/ShoppingCart/ShoppingCartPage.scss b/frontend/src/features/permits/pages/ShoppingCart/ShoppingCartPage.scss index 14cbc61fe..769684187 100644 --- a/frontend/src/features/permits/pages/ShoppingCart/ShoppingCartPage.scss +++ b/frontend/src/features/permits/pages/ShoppingCart/ShoppingCartPage.scss @@ -22,6 +22,7 @@ background-color: $bc-white; display: flex; flex-direction: column; + padding-top: 1.5rem; .choose-payment-method { margin-bottom: 2.5rem; diff --git a/frontend/src/features/permits/pages/ShoppingCart/ShoppingCartPage.tsx b/frontend/src/features/permits/pages/ShoppingCart/ShoppingCartPage.tsx index 6f16130a1..475c4a838 100644 --- a/frontend/src/features/permits/pages/ShoppingCart/ShoppingCartPage.tsx +++ b/frontend/src/features/permits/pages/ShoppingCart/ShoppingCartPage.tsx @@ -136,28 +136,32 @@ export const ShoppingCartPage = () => { }, []); useEffect(() => { + // transaction is undefined when payment endpoint has not been requested + // ie. "Pay Now" button has not been pressed if (typeof transaction !== "undefined") { - if (!isStaffActingAsCompany) { - // CV Client - if (!transaction?.url) { - // Failed to generate transaction url - navigate(SHOPPING_CART_ROUTES.DETAILS(true)); - } else { - window.open(transaction.url, "_self"); - } - } else if (!transaction) { - // Staff payment failed + if (!transaction) { + // Payment failed - ie. transaction object is null navigate(SHOPPING_CART_ROUTES.DETAILS(true)); - } else { - // Staff payment transaction created successfully, proceed to issue permit + } else if (isFeeZero || isStaffActingAsCompany) { + // If purchase was for no-fee permits, or if staff payment transaction was created successfully, + // simply proceed to issue permits issuePermitMutation.mutate([...selectedIds]); // also update the cart and cart count cartQuery.refetch(); refetchCartCount(); + } else { + // CV Client payment, anticipate PayBC transaction url + if (!transaction?.url) { + // Failed to generate transaction url + navigate(SHOPPING_CART_ROUTES.DETAILS(true)); + } else { + // Redirect to PayBC transaction url to continue payment + window.open(transaction.url, "_self"); + } } } - }, [transaction, isStaffActingAsCompany]); + }, [transaction, isStaffActingAsCompany, isFeeZero]); useEffect(() => { const issueFailed = hasPermitsActionFailed(issueResults); @@ -248,11 +252,30 @@ export const ShoppingCartPage = () => { }); }; + // Paying for no-fee permits + const handlePayForNoFee = () => { + startTransactionMutation.mutate({ + transactionTypeId: TRANSACTION_TYPES.P, + paymentMethodTypeCode: PAYMENT_METHOD_TYPE_CODE.NP, + applicationDetails: [ + ...selectedApplications.map((application) => ({ + applicationId: application.applicationId, + transactionAmount: 0, + })), + ], + }); + }; + const handlePay = (paymentMethodData: PaymentMethodData) => { if (startTransactionMutation.isPending) return; const { paymentMethod, additionalPaymentData } = paymentMethodData; + if (isFeeZero) { + handlePayForNoFee(); + return; + } + if (paymentMethod === PAYMENT_METHOD_TYPE_CODE.ICEPAY) { const { cardType, icepayTransactionId } = additionalPaymentData as IcepayPaymentData; @@ -365,9 +388,11 @@ export const ShoppingCartPage = () => { - + {!isFeeZero ? ( + + ) : null} {paymentFailed ? : null} diff --git a/frontend/src/features/permits/pages/ShoppingCart/components/ShoppingCartItem.tsx b/frontend/src/features/permits/pages/ShoppingCart/components/ShoppingCartItem.tsx index 694a17380..1689e3535 100644 --- a/frontend/src/features/permits/pages/ShoppingCart/components/ShoppingCartItem.tsx +++ b/frontend/src/features/permits/pages/ShoppingCart/components/ShoppingCartItem.tsx @@ -1,7 +1,7 @@ import { Checkbox } from "@mui/material"; import "./ShoppingCartItem.scss"; -import { CartItem } from "../../../types/CartItem"; +import { SelectableCartItem } from "../../../types/CartItem"; import { DATE_FORMATS, toLocal } from "../../../../../common/helpers/formatDate"; import { CustomActionLink } from "../../../../../common/components/links/CustomActionLink"; import { feeSummaryDisplayText } from "../../../helpers/feeSummary"; @@ -14,7 +14,7 @@ export const ShoppingCartItem = ({ onDeselect, onEditCartItem, }: { - cartItemData: CartItem; + cartItemData: SelectableCartItem; isSelected: boolean; isDisabled?: boolean; onSelect: (id: string) => void; diff --git a/frontend/src/features/permits/pages/ShoppingCart/hooks/useCheckOutdatedCart.ts b/frontend/src/features/permits/pages/ShoppingCart/hooks/useCheckOutdatedCart.ts index 441e91f93..a3d54577e 100644 --- a/frontend/src/features/permits/pages/ShoppingCart/hooks/useCheckOutdatedCart.ts +++ b/frontend/src/features/permits/pages/ShoppingCart/hooks/useCheckOutdatedCart.ts @@ -24,7 +24,6 @@ export const useCheckOutdatedCart = ( // Reset old cart items whenever radio button filter is changed setOldCartItems([]); }, [ - //showAllApplications cartFilterChanged ]); @@ -40,7 +39,7 @@ export const useCheckOutdatedCart = ( const outdatedApplicationNumbers = getOutdatedCartItems( oldCartItems, - getDefaultRequiredVal([], fetchedCartItems),//cartItems), + getDefaultRequiredVal([], fetchedCartItems), ).map(cartItem => cartItem.applicationNumber); return { diff --git a/frontend/src/features/permits/pages/ShoppingCart/hooks/useShoppingCart.ts b/frontend/src/features/permits/pages/ShoppingCart/hooks/useShoppingCart.ts index 7255e9793..652026301 100644 --- a/frontend/src/features/permits/pages/ShoppingCart/hooks/useShoppingCart.ts +++ b/frontend/src/features/permits/pages/ShoppingCart/hooks/useShoppingCart.ts @@ -4,16 +4,28 @@ import { CartContext } from "../../../context/CartContext"; import { useFetchCart, useRemoveFromCart } from "../../../hooks/cart"; import { SelectableCartItem } from "../../../types/CartItem"; import { getDefaultRequiredVal } from "../../../../../common/helpers/util"; +import { useFetchSpecialAuthorizations } from "../../../../settings/hooks/specialAuthorizations"; +import { calculateFeeByDuration } from "../../../helpers/feeSummary"; export const useShoppingCart = ( companyId: string, enableCartFilter: boolean, ) => { const { refetchCartCount } = useContext(CartContext); + + // Cart filter state const [showAllApplications, setShowAllApplications] = useState(enableCartFilter); + + // Interacting with backend for cart const removeFromCartMutation = useRemoveFromCart(); const cartQuery = useFetchCart(companyId, showAllApplications); const { data: cartItems } = cartQuery; + + // Check if no-fee permit type is designated + const { data: specialAuth } = useFetchSpecialAuthorizations(companyId); + const isNoFeePermitType = Boolean(specialAuth?.noFeeType); + + // Cart item state const [cartItemSelection, setCartItemSelection] = useState([]); const cartItemsTotalCount = cartItemSelection.length; const selectedTotalFee = cartItemSelection @@ -35,9 +47,12 @@ export const useShoppingCart = ( ...cartItem, selected: true, // all selected by default isSelectable: true, // add user permission check (ie. CA can't select staff cart items) + fee: isNoFeePermitType + ? 0 + : calculateFeeByDuration(cartItem.permitType, cartItem.duration), })), ); - }, [cartItems]); + }, [cartItems, isNoFeePermitType]); const selectedItemsCount = cartItemSelection.filter(cartItem => cartItem.selected).length; @@ -88,6 +103,7 @@ export const useShoppingCart = ( cartItemSelection, selectedTotalFee, showAllApplications, + isNoFeePermitType, toggleSelectAll, handleCartFilterChange, handleSelectItem, diff --git a/frontend/src/features/permits/pages/Void/FinishVoid.tsx b/frontend/src/features/permits/pages/Void/FinishVoid.tsx index 80453e594..608a72907 100644 --- a/frontend/src/features/permits/pages/Void/FinishVoid.tsx +++ b/frontend/src/features/permits/pages/Void/FinishVoid.tsx @@ -42,9 +42,9 @@ export const FinishVoid = ({ isValidTransaction(history.paymentMethodTypeCode, history.pgApproved), ); - const amountToRefund = !permit + const amountToRefund = !permit || transactionHistory.length === 0 ? 0 - : -1 * calculateAmountForVoid(permit); + : -1 * calculateAmountForVoid(permit, transactionHistory); const { mutation: voidPermitMutation, voidResults } = useVoidPermit(); diff --git a/frontend/src/features/permits/pages/Void/components/VoidPermitForm.tsx b/frontend/src/features/permits/pages/Void/components/VoidPermitForm.tsx index c82465f3d..68128c983 100644 --- a/frontend/src/features/permits/pages/Void/components/VoidPermitForm.tsx +++ b/frontend/src/features/permits/pages/Void/components/VoidPermitForm.tsx @@ -15,7 +15,8 @@ import { useVoidPermit } from "../hooks/useVoidPermit"; import { mapToRevokeRequestData } from "../helpers/mapper"; import { Nullable } from "../../../../../common/types/common"; import { hasPermitsActionFailed } from "../../../helpers/permitState"; -import { getDefaultRequiredVal } from "../../../../../common/helpers/util"; +import { applyWhenNotNullable, getDefaultRequiredVal } from "../../../../../common/helpers/util"; +import { usePermitHistoryQuery } from "../../../hooks/hooks"; import { CustomFormComponent, getErrorMessage, @@ -26,6 +27,7 @@ import { invalidPhoneLength, requiredMessage, } from "../../../../../common/helpers/validationMessages"; +import { isValidTransaction } from "../../../helpers/payment"; const FEATURE = "void-permit"; @@ -46,6 +48,22 @@ export const VoidPermitForm = ({ const { mutation: revokePermitMutation, voidResults } = useVoidPermit(); + const { data: permitHistory } = usePermitHistoryQuery( + permit?.originalPermitId, + applyWhenNotNullable( + id => `${id}`, + permit?.companyId, + ), + ); + + const transactionHistory = getDefaultRequiredVal([], permitHistory) + .filter((history) => + isValidTransaction(history.paymentMethodTypeCode, history.pgApproved), + ); + + const amountToRefund = !permit || transactionHistory.length === 0 + ? 0 : -1 * calculateAmountForVoid(permit, transactionHistory); + useEffect(() => { const revokeFailed = hasPermitsActionFailed(voidResults); if (revokeFailed) { @@ -57,8 +75,6 @@ export const VoidPermitForm = ({ } }, [voidResults]); - const amountToRefund = !permit ? 0 : -1 * calculateAmountForVoid(permit); - const { control, getValues, diff --git a/frontend/src/features/permits/types/CartItem.ts b/frontend/src/features/permits/types/CartItem.ts index afdc35d37..fdf8ffe94 100644 --- a/frontend/src/features/permits/types/CartItem.ts +++ b/frontend/src/features/permits/types/CartItem.ts @@ -17,12 +17,13 @@ export interface CartItem { plate: string; startDate: string; expiryDate: string; - fee: number; + duration: number; }; export interface SelectableCartItem extends CartItem { selected: boolean; isSelectable: boolean; + fee: number; } export interface CartActionResponse extends PermitsActionResponse {} diff --git a/vehicles/src/common/helper/permit-fee.helper.ts b/vehicles/src/common/helper/permit-fee.helper.ts index 76c84ec35..a774b0473 100644 --- a/vehicles/src/common/helper/permit-fee.helper.ts +++ b/vehicles/src/common/helper/permit-fee.helper.ts @@ -16,6 +16,7 @@ import { import { differenceBetween } from './date-time.helper'; import * as dayjs from 'dayjs'; import { ApplicationStatus } from '../enum/application-status.enum'; +import { Nullable } from '../types/common'; /** * Calculates the permit fee based on the application and old amount. @@ -25,7 +26,11 @@ import { ApplicationStatus } from '../enum/application-status.enum'; * @throws {NotAcceptableException} If the duration is invalid for TROS permit type. * @throws {BadRequestException} If the permit type is not recognized. */ -export const permitFee = (application: Permit, oldAmount?: number): number => { +export const permitFee = ( + application: Permit, + isNoFee?: Nullable, + oldAmount?: Nullable, +): number => { let duration = calculateDuration(application); switch (application.permitType) { case PermitType.TERM_OVERSIZE: { @@ -55,6 +60,7 @@ export const permitFee = (application: Permit, oldAmount?: number): number => { TROS_TERM, oldAmount, application.permitStatus, + isNoFee, ); } case PermitType.TERM_OVERWEIGHT: { @@ -84,6 +90,7 @@ export const permitFee = (application: Permit, oldAmount?: number): number => { TROW_TERM, oldAmount, application.permitStatus, + isNoFee, ); } default: @@ -147,14 +154,27 @@ export const currentPermitFee = ( duration: number, pricePerTerm: number, allowedPermitTerm: number, - oldAmount?: number, - permitStatus?: ApplicationStatus, + oldAmount?: Nullable, + permitStatus?: Nullable, + isNoFee?: Nullable, ): number => { - let permitTerms = Math.ceil(duration / allowedPermitTerm); // ex: if duraion is 40 days then charge for 60 days. + // Calculate the number of permit terms based on the duration + const permitTerms = + permitStatus === ApplicationStatus.VOIDED + ? Math.floor(duration / allowedPermitTerm) + : Math.ceil(duration / allowedPermitTerm); + + // Special fee calculation for void permit if (permitStatus === ApplicationStatus.VOIDED) { - permitTerms = Math.floor(duration / allowedPermitTerm); //ex: if duration is 40 days then refund only 30 days. - return pricePerTerm * permitTerms * -1; + // If the permit status is voided, return a refund of 0 for permit with no fees, or return the applicable refund amount + return oldAmount === 0 ? 0 : -pricePerTerm * permitTerms; } + // For non void new application (exclude amendment application), if no fee applies, set the price per term to 0 for new application + if ((isNoFee && oldAmount === undefined) || oldAmount === 0) + return 0; + if (oldAmount === undefined) + oldAmount = 0; + // Calculate fee for non void permit. return oldAmount > 0 ? pricePerTerm * permitTerms - oldAmount : pricePerTerm * permitTerms + oldAmount; diff --git a/vehicles/src/modules/permit-application-payment/payment/payment.service.ts b/vehicles/src/modules/permit-application-payment/payment/payment.service.ts index 7a67ee750..c876c6148 100644 --- a/vehicles/src/modules/permit-application-payment/payment/payment.service.ts +++ b/vehicles/src/modules/permit-application-payment/payment/payment.service.ts @@ -62,6 +62,7 @@ import { throwUnprocessableEntityException, } from '../../../common/helper/exception.helper'; import { isFeatureEnabled } from '../../../common/helper/common.helper'; +import { SpecialAuth } from 'src/modules/special-auth/entities/special-auth.entity'; @Injectable() export class PaymentService { @@ -254,7 +255,9 @@ export class PaymentService { createTransactionDto?.paymentMethodTypeCode !== PaymentMethodTypeEnum.WEB && createTransactionDto?.paymentMethodTypeCode !== - PaymentMethodTypeEnum.ACCOUNT + PaymentMethodTypeEnum.ACCOUNT && + createTransactionDto?.paymentMethodTypeCode !== + PaymentMethodTypeEnum.NO_PAYMENT ) { throwUnprocessableEntityException( 'Invalid payment method type for the user', @@ -781,16 +784,30 @@ export class PaymentService { application.originalPermitId, queryRunner, ); - - if (application.permitStatus === ApplicationStatus.VOIDED) { - const newAmount = permitFee(application); - return newAmount; - } - const oldAmount = calculatePermitAmount(permitPaymentHistory); - const fee = permitFee(application, oldAmount); + const isNoFee = await this.findNoFee( + application.company.companyId, + queryRunner, + ); + const oldAmount = permitPaymentHistory.length > 0?calculatePermitAmount(permitPaymentHistory):undefined; + const fee = permitFee(application, isNoFee, oldAmount); return fee; } + @LogAsyncMethodExecution() + async findNoFee( + companyId: number, + queryRunner: QueryRunner, + ): Promise { + const specialAuth = await queryRunner.manager + .createQueryBuilder() + .select('specialAuth') + .from(SpecialAuth, 'specialAuth') + .innerJoinAndSelect('specialAuth.company', 'company') + .where('company.companyId = :companyId', { companyId: companyId }) + .getOne(); + return specialAuth ? (specialAuth.noFeeType ? true : false) : false; + } + @LogAsyncMethodExecution() async findPermitHistory( originalPermitId: string, diff --git a/vehicles/src/modules/shopping-cart/dto/response/read-shopping-cart.dto.ts b/vehicles/src/modules/shopping-cart/dto/response/read-shopping-cart.dto.ts index 6d1a07d36..1329c9050 100644 --- a/vehicles/src/modules/shopping-cart/dto/response/read-shopping-cart.dto.ts +++ b/vehicles/src/modules/shopping-cart/dto/response/read-shopping-cart.dto.ts @@ -77,14 +77,14 @@ export class ReadShoppingCartDto { @AutoMap() @ApiProperty({ - description: 'The permit start date.', + description: 'The permit expiry date.', example: '2023-07-04T19:12:22Z', }) expiryDate: string; @ApiProperty({ - description: 'The permit fee', - example: 200, + description: 'The permit duration', + example: 30, }) - fee: number; + duration: number; } diff --git a/vehicles/src/modules/shopping-cart/profile/shopping-cart.profile.ts b/vehicles/src/modules/shopping-cart/profile/shopping-cart.profile.ts index 785f23463..2edc05701 100644 --- a/vehicles/src/modules/shopping-cart/profile/shopping-cart.profile.ts +++ b/vehicles/src/modules/shopping-cart/profile/shopping-cart.profile.ts @@ -49,12 +49,12 @@ export class ShoppingCartProfile extends AutomapperProfile { mapFrom((s) => s?.applicationOwner?.userGUID), ), forMember( - (d) => d.fee, + (d) => d.duration, mapFrom((s) => { const parsedPermitData = JSON.parse( s?.permitData?.permitData, ) as PermitData; - return +parsedPermitData?.feeSummary; + return +parsedPermitData?.permitDuration; }), ), forMember( From aeb77707c8dd0a9e7cfcc41eaf04afbc9ddfd3d4 Mon Sep 17 00:00:00 2001 From: gchauhan-aot <113390759+gchauhan-aot@users.noreply.github.com> Date: Mon, 16 Sep 2024 10:34:44 -0600 Subject: [PATCH 29/63] ORV2 1504 Sonar Issue Fix (#1597) Co-authored-by: zgong-gov --- .../permit-application-payment/payment/payment.service.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vehicles/src/modules/permit-application-payment/payment/payment.service.ts b/vehicles/src/modules/permit-application-payment/payment/payment.service.ts index c876c6148..d0af3097b 100644 --- a/vehicles/src/modules/permit-application-payment/payment/payment.service.ts +++ b/vehicles/src/modules/permit-application-payment/payment/payment.service.ts @@ -805,7 +805,7 @@ export class PaymentService { .innerJoinAndSelect('specialAuth.company', 'company') .where('company.companyId = :companyId', { companyId: companyId }) .getOne(); - return specialAuth ? (specialAuth.noFeeType ? true : false) : false; + return !!specialAuth && !!specialAuth.noFeeType; } @LogAsyncMethodExecution() From b86eeb4c2345db001046bc5f918750661916b154 Mon Sep 17 00:00:00 2001 From: glen-aot <160973940+glen-aot@users.noreply.github.com> Date: Mon, 16 Sep 2024 12:04:28 -0700 Subject: [PATCH 30/63] ORV2-2824 - FE: Update status - Change leave application warning modal (#1598) Co-authored-by: GlenAOT <160973940+GlenAOT@users.noreply.github.com> --- .../permits/components/dialog/LeaveApplicationDialog.scss | 4 ++-- .../permits/components/dialog/LeaveApplicationDialog.tsx | 7 ++----- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/frontend/src/features/permits/components/dialog/LeaveApplicationDialog.scss b/frontend/src/features/permits/components/dialog/LeaveApplicationDialog.scss index d29860836..930f7d6df 100644 --- a/frontend/src/features/permits/components/dialog/LeaveApplicationDialog.scss +++ b/frontend/src/features/permits/components/dialog/LeaveApplicationDialog.scss @@ -6,7 +6,7 @@ flex-direction: row; align-items: center; padding: 1em; - color: orbcStyles.$bc-messages-gold-text; + color: orbcStyles.$bc-black; background-color: orbcStyles.$bc-background-light-grey; font-size: 1.2rem; } @@ -19,7 +19,7 @@ justify-content: center; align-items: center; border-radius: 50%; - background-color: orbcStyles.$bc-messages-gold-text; + background-color: orbcStyles.$bc-black; margin-right: 0.5em; .warning-icon { diff --git a/frontend/src/features/permits/components/dialog/LeaveApplicationDialog.tsx b/frontend/src/features/permits/components/dialog/LeaveApplicationDialog.tsx index 394a8f858..546e248b7 100644 --- a/frontend/src/features/permits/components/dialog/LeaveApplicationDialog.tsx +++ b/frontend/src/features/permits/components/dialog/LeaveApplicationDialog.tsx @@ -31,17 +31,14 @@ export const LeaveApplicationDialog = ({ Are you sure you want to leave?
-

- You have unsaved changes. If you leave, all your changes will be lost. -

-

This action cannot be undone.

+

Your application progress will be lost if you haven't saved.

+
+ + ); +}; diff --git a/frontend/src/features/permits/components/permit-list/ApplicationInReviewStatusChip.scss b/frontend/src/features/permits/components/permit-list/ApplicationInReviewStatusChip.scss new file mode 100644 index 000000000..c9bb6ae56 --- /dev/null +++ b/frontend/src/features/permits/components/permit-list/ApplicationInReviewStatusChip.scss @@ -0,0 +1,17 @@ +@import "../../../../themes/orbcStyles"; + +.permit-chip { + display: inline-block; + margin-left: 0.5rem; + + &--pending-review { + background-color: $bc-messages-blue-background; + color: $bc-primary-blue; + } + + &--in-review { + background-color: $bc-messages-gold-background; + color: $bc-messages-gold-text; + } + +} diff --git a/frontend/src/features/permits/components/permit-list/ApplicationInReviewStatusChip.tsx b/frontend/src/features/permits/components/permit-list/ApplicationInReviewStatusChip.tsx new file mode 100644 index 000000000..38c57682e --- /dev/null +++ b/frontend/src/features/permits/components/permit-list/ApplicationInReviewStatusChip.tsx @@ -0,0 +1,65 @@ +import "./ApplicationInReviewStatusChip.scss"; +import { OnRouteBCChip } from "../../../../common/components/chip/OnRouteBCChip"; + +import { + APPLICATION_QUEUE_STATUSES, + ApplicationQueueStatus, +} from "../../types/ApplicationQueueStatus"; + +/** + * Returns the theme name for the chip based on the permit status. + * If the permit is inactive or expired, a chip has to be displayed + * beside the permit number. + * @param applicationQueueStatus string representing the permit status + * @returns A string representing the theme name for the chip + */ +const getTheme = (applicationQueueStatus?: ApplicationQueueStatus) => { + switch (applicationQueueStatus) { + case APPLICATION_QUEUE_STATUSES.PENDING_REVIEW: + return "pending-review"; + case APPLICATION_QUEUE_STATUSES.IN_REVIEW: + return "in-review"; + case APPLICATION_QUEUE_STATUSES.CLOSED: + return "closed"; + default: + return undefined; + } +}; + +/** + * Returns the text corresponding to the status of a permit. + * @param permitStatus string representing the permit status + * @returns Display text string corresponding to permit status + */ +const getStatusText = ( + applicationQueueStatus?: ApplicationQueueStatus, +): string => { + switch (applicationQueueStatus) { + case APPLICATION_QUEUE_STATUSES.PENDING_REVIEW: + return "Pending Review"; + case APPLICATION_QUEUE_STATUSES.IN_REVIEW: + return "In Review"; + case APPLICATION_QUEUE_STATUSES.CLOSED: + return "Closed"; + default: + return ""; + } +}; +/** + * A simple chip component to be displayed beside the permit number. + */ +export const ApplicationInReviewStatusChip = ({ + applicationQueueStatus, +}: { + applicationQueueStatus?: ApplicationQueueStatus; +}) => { + const chipTheme = getTheme(applicationQueueStatus); + return chipTheme ? ( + + ) : null; +}; + +ApplicationInReviewStatusChip.displayName = "ApplicationInReviewStatusChip"; diff --git a/frontend/src/features/permits/components/permit-list/ApplicationsInReviewList.scss b/frontend/src/features/permits/components/permit-list/ApplicationsInReviewList.scss new file mode 100644 index 000000000..f162b5da5 --- /dev/null +++ b/frontend/src/features/permits/components/permit-list/ApplicationsInReviewList.scss @@ -0,0 +1,24 @@ +@use "../list/List"; +@import "../../../../themes/orbcStyles"; + +.applications-in-review-list { + .applications-in-review-banner { + margin-bottom: 1.5rem; + width: 100%; + } + + & &__top-toolbar { + display: flex; + justify-content: flex-end; + margin-bottom: 1.5rem; + } + + & &__row { + &:hover { + // remove MRT row/cell color change on hover + td::after { + background-color: $white + } + } + } +} diff --git a/frontend/src/features/permits/components/permit-list/ApplicationsInReviewList.tsx b/frontend/src/features/permits/components/permit-list/ApplicationsInReviewList.tsx new file mode 100644 index 000000000..f2896a377 --- /dev/null +++ b/frontend/src/features/permits/components/permit-list/ApplicationsInReviewList.tsx @@ -0,0 +1,166 @@ +import { useCallback, useContext, useEffect, useState } from "react"; +import { RowSelectionState } from "@tanstack/table-core"; +import { + MaterialReactTable, + useMaterialReactTable, +} from "material-react-table"; + +import "./ApplicationsInReviewList.scss"; +import { ApplicationInReviewColumnDefinition } from "./ApplicationInReviewColumnDefinition"; +import { SnackBarContext } from "../../../../App"; +import { ApplicationListItem } from "../../types/application"; +import { NoRecordsFound } from "../../../../common/components/table/NoRecordsFound"; +import OnRouteBCContext from "../../../../common/authentication/OnRouteBCContext"; +import { + getDefaultNullableVal, + getDefaultRequiredVal, +} from "../../../../common/helpers/util"; +import { useApplicationsInQueueQuery } from "../../hooks/hooks"; +import { InfoBcGovBanner } from "../../../../common/components/banners/InfoBcGovBanner"; +import { + defaultTableInitialStateOptions, + defaultTableOptions, + defaultTableStateOptions, +} from "../../../../common/helpers/tableHelper"; +import { BANNER_MESSAGES } from "../../../../common/constants/bannerMessages"; +import { MRT_Row } from "material-react-table"; +import { ApplicationsInReviewRowOptions } from "./ApplicationsInReviewRowOptions"; +import { APPLICATION_QUEUE_STATUSES } from "../../types/ApplicationQueueStatus"; + +export const ApplicationsInReviewList = () => { + const { + applicationsInQueueQuery, + pagination, + setPagination, + sorting, + setSorting, + } = useApplicationsInQueueQuery(); + + const { + data: applicationsInQueue, + isError, + isPending, + isFetching, + } = applicationsInQueueQuery; + + const [showAIRTable, setShowAIRTable] = useState(false); + + useEffect(() => { + const totalCount = getDefaultRequiredVal( + 0, + applicationsInQueue?.meta?.totalItems, + ); + setShowAIRTable(totalCount > 0); + }, [applicationsInQueue?.meta?.totalItems]); + + const { idirUserDetails, userDetails } = useContext(OnRouteBCContext); + const userRole = getDefaultNullableVal( + idirUserDetails?.userRole, + userDetails?.userRole, + ); + + const snackBar = useContext(SnackBarContext); + + const [rowSelection, setRowSelection] = useState({}); + + useEffect(() => { + if (isError) { + snackBar.setSnackBar({ + message: "An unexpected error occurred.", + showSnackbar: true, + setShowSnackbar: () => true, + alertType: "error", + }); + } + }, [isError]); + + const table = useMaterialReactTable({ + ...defaultTableOptions, + columns: ApplicationInReviewColumnDefinition, + data: getDefaultRequiredVal([], applicationsInQueue?.items), + initialState: { + ...defaultTableInitialStateOptions, + }, + state: { + ...defaultTableStateOptions, + showAlertBanner: isError, + showProgressBars: isFetching, + columnVisibility: { applicationId: true }, + isLoading: isPending, + rowSelection, + pagination, + sorting, + }, + layoutMode: "grid", + displayColumnDefOptions: { + "mrt-row-select": { + size: 10, + }, + "mrt-row-actions": { + header: "", + size: 40, + }, + }, + enableRowActions: true, + enableRowSelection: false, + onRowSelectionChange: useCallback(setRowSelection, [userRole]), + getRowId: (originalRow) => { + const applicationRow = originalRow as ApplicationListItem; + return applicationRow.permitId; + }, + renderTopToolbar: false, + enableGlobalFilter: false, + autoResetPageIndex: false, + manualFiltering: true, + manualPagination: true, + manualSorting: true, + rowCount: getDefaultRequiredVal(0, applicationsInQueue?.meta?.totalItems), + pageCount: getDefaultRequiredVal(0, applicationsInQueue?.meta?.pageCount), + onSortingChange: setSorting, + onPaginationChange: setPagination, + enablePagination: true, + enableBottomToolbar: true, + muiToolbarAlertBannerProps: isError + ? { + color: "error", + children: "Error loading data", + } + : undefined, + muiTableBodyRowProps: { + className: "applications-in-review-list__row", + }, + renderRowActions: useCallback( + ({ row }: { row: MRT_Row }) => { + return ( +
+ +
+ ); + }, + [], + ), + }); + + return ( + <> + {showAIRTable ? ( +
+ + + +
+ ) : ( + + )} + + ); +}; diff --git a/frontend/src/features/permits/components/permit-list/ApplicationsInReviewRowOptions.tsx b/frontend/src/features/permits/components/permit-list/ApplicationsInReviewRowOptions.tsx new file mode 100644 index 000000000..ceee9c676 --- /dev/null +++ b/frontend/src/features/permits/components/permit-list/ApplicationsInReviewRowOptions.tsx @@ -0,0 +1,105 @@ +import { useEffect, useState } from "react"; +import { OnRouteBCTableRowActions } from "../../../../common/components/table/OnRouteBCTableRowActions"; +import { + useUpdateApplicationQueueStatusMutation, + useInvalidateApplicationsInQueue, +} from "../../hooks/hooks"; +import { CASE_ACTIVITY_TYPES } from "../../types/CaseActivityType"; +import { ApplicationInReviewModal } from "./ApplicationInReviewModal"; +import { useNavigate } from "react-router-dom"; +import { ERROR_ROUTES } from "../../../../routes/constants"; + +const PERMIT_ACTION_OPTION_TYPES = { + WITHDRAW_APPLICATION: "withdrawApplication", +} as const; + +type PermitActionOptionType = + (typeof PERMIT_ACTION_OPTION_TYPES)[keyof typeof PERMIT_ACTION_OPTION_TYPES]; + +const getOptionLabel = (optionType: PermitActionOptionType): string => { + if (optionType === PERMIT_ACTION_OPTION_TYPES.WITHDRAW_APPLICATION) { + return "Withdraw Application"; + } + + return ""; +}; + +const ALL_OPTIONS = [ + { + label: getOptionLabel(PERMIT_ACTION_OPTION_TYPES.WITHDRAW_APPLICATION), + value: PERMIT_ACTION_OPTION_TYPES.WITHDRAW_APPLICATION, + }, +]; + +const getOptions = (isInReview: boolean) => { + return ALL_OPTIONS.filter((option) => { + // Exclude 'WITHDRAW_APPLICATION' if 'isInReview' is false + if ( + isInReview && + option.value === PERMIT_ACTION_OPTION_TYPES.WITHDRAW_APPLICATION + ) { + return false; + } + return true; + }); +}; + +export const ApplicationsInReviewRowOptions = ({ + isInReview, + permitId, +}: { + isInReview: boolean; + permitId: string; +}) => { + const navigate = useNavigate(); + const { invalidate } = useInvalidateApplicationsInQueue(); + + const [isAIRModalOpen, setIsAIRModalOpen] = useState(false); + + const handleCloseAIRModal = () => { + setIsAIRModalOpen(false); + invalidate(); + }; + + const { mutateAsync, isError, error } = + useUpdateApplicationQueueStatusMutation(); + + useEffect(() => { + if (isError) { + // if the application has already been withdrawn by another user + if (error.response?.status === 422) { + return setIsAIRModalOpen(true); + } + // handle all other errors + navigate(ERROR_ROUTES.UNEXPECTED); + } + }, [isError, error]); + + /** + * Action handler upon a select event. + * @param selectedOption The option that was selected. + */ + const onSelectOptionCallback = (selectedOption: string) => { + if (selectedOption === PERMIT_ACTION_OPTION_TYPES.WITHDRAW_APPLICATION) { + mutateAsync({ + applicationId: permitId, + caseActivityType: CASE_ACTIVITY_TYPES.WITHDRAWN, + }); + } + }; + + return ( + <> + + + + + ); +}; diff --git a/frontend/src/features/permits/components/permit-list/PermitChip.tsx b/frontend/src/features/permits/components/permit-list/PermitChip.tsx index 332b955fb..d418882ac 100644 --- a/frontend/src/features/permits/components/permit-list/PermitChip.tsx +++ b/frontend/src/features/permits/components/permit-list/PermitChip.tsx @@ -5,6 +5,7 @@ import { PERMIT_STATUSES, isPermitInactive, } from "../../types/PermitStatus"; +import { APPLICATION_QUEUE_STATUSES } from "../../types/ApplicationQueueStatus"; /** * Returns the theme name for the chip based on the permit status. @@ -23,6 +24,12 @@ const getTheme = (permitStatus?: string) => { return "superseded"; case PERMIT_EXPIRED: return "expired"; + case APPLICATION_QUEUE_STATUSES.PENDING_REVIEW: + return "pending-review"; + case APPLICATION_QUEUE_STATUSES.IN_REVIEW: + return "in-review"; + case APPLICATION_QUEUE_STATUSES.CLOSED: + return "closed"; default: return undefined; } @@ -43,6 +50,12 @@ const getStatusText = (permitStatus?: string): string => { return "Superseded"; case PERMIT_EXPIRED: return "Expired"; + case APPLICATION_QUEUE_STATUSES.PENDING_REVIEW: + return "Pending Review"; + case APPLICATION_QUEUE_STATUSES.IN_REVIEW: + return "In Review"; + case APPLICATION_QUEUE_STATUSES.CLOSED: + return "Closed"; default: return ""; } diff --git a/frontend/src/features/permits/hooks/hooks.ts b/frontend/src/features/permits/hooks/hooks.ts index 218ae5a27..bfedb1884 100644 --- a/frontend/src/features/permits/hooks/hooks.ts +++ b/frontend/src/features/permits/hooks/hooks.ts @@ -1,4 +1,4 @@ -import { useState, useEffect } from "react"; +import { useState, useEffect, useContext } from "react"; import { AxiosError } from "axios"; import { MRT_PaginationState, MRT_SortingState } from "material-react-table"; import { @@ -33,7 +33,14 @@ import { getApplicationsInProgress, resendPermit, getPendingPermits, + getApplicationsInQueue, + updateApplicationQueueStatus, } from "../apiManager/permitsAPI"; +import { + CASE_ACTIVITY_TYPES, + CaseActivityType, +} from "../types/CaseActivityType"; +import { SnackBarContext } from "../../../App"; const QUERY_KEYS = { PERMIT_DETAIL: ( @@ -333,10 +340,16 @@ export const useAmendPermit = (companyIdParam?: Nullable) => { queryKey: QUERY_KEYS.PERMIT_DETAIL(data.permitId, companyIdParam), }); queryClient.invalidateQueries({ - queryKey: QUERY_KEYS.AMEND_APPLICATION(data.originalPermitId, companyIdParam), + queryKey: QUERY_KEYS.AMEND_APPLICATION( + data.originalPermitId, + companyIdParam, + ), }); queryClient.invalidateQueries({ - queryKey: QUERY_KEYS.PERMIT_HISTORY(data.originalPermitId, companyIdParam), + queryKey: QUERY_KEYS.PERMIT_HISTORY( + data.originalPermitId, + companyIdParam, + ), }); return { @@ -431,20 +444,28 @@ export const useApplicationsInProgressQuery = () => { }, ]); - const orderBy = sorting.length > 0 ? [ - { - column: sorting.at(0)?.id as string, - descending: Boolean(sorting.at(0)?.desc), - }, - ] : []; + const orderBy = + sorting.length > 0 + ? [ + { + column: sorting.at(0)?.id as string, + descending: Boolean(sorting.at(0)?.desc), + }, + ] + : []; const applicationsInProgressQuery = useQuery({ - queryKey: ["applicationsInProgress", pagination.pageIndex, pagination.pageSize, sorting], + queryKey: [ + "applicationsInProgress", + pagination.pageIndex, + pagination.pageSize, + sorting, + ], queryFn: () => getApplicationsInProgress({ page: pagination.pageIndex, take: pagination.pageSize, - orderBy, + orderBy, }), refetchOnWindowFocus: false, // prevent unnecessary multiple queries on page showing up in foreground refetchOnMount: "always", @@ -489,6 +510,104 @@ export const usePendingPermitsQuery = () => { }; }; +/** + * Hook that fetches applications in queue (PENDING_REVIEW, IN_REVIEW) and manages its pagination state. + * @returns Applications in queue along with pagination state and setter + */ +export const useApplicationsInQueueQuery = () => { + const [pagination, setPagination] = useState({ + pageIndex: 0, + pageSize: 10, + }); + + const [sorting, setSorting] = useState([ + { + id: "updatedDateTime", + desc: true, + }, + ]); + + const orderBy = + sorting.length > 0 + ? [ + { + column: sorting.at(0)?.id as string, + descending: Boolean(sorting.at(0)?.desc), + }, + ] + : []; + + const applicationsInQueueQuery = useQuery({ + queryKey: [ + "applicationsInQueue", + pagination.pageIndex, + pagination.pageSize, + sorting, + ], + queryFn: () => + getApplicationsInQueue({ + page: pagination.pageIndex, + take: pagination.pageSize, + orderBy, + }), + refetchOnWindowFocus: false, // prevent unnecessary multiple queries on page showing up in foreground + refetchOnMount: "always", + placeholderData: keepPreviousData, + }); + + return { + applicationsInQueueQuery, + pagination, + setPagination, + sorting, + setSorting, + }; +}; + +export const useUpdateApplicationQueueStatusMutation = () => { + const { invalidate } = useInvalidateApplicationsInQueue(); + const { setSnackBar } = useContext(SnackBarContext); + + return useMutation({ + mutationFn: (data: { + applicationId: string; + caseActivityType: CaseActivityType; + comment?: string; + }) => { + const { applicationId, caseActivityType, comment } = data; + + return updateApplicationQueueStatus( + applicationId, + caseActivityType, + comment, + ); + }, + onSuccess: (_data, variables) => { + const { caseActivityType } = variables; + if (caseActivityType === CASE_ACTIVITY_TYPES.WITHDRAWN) { + setSnackBar({ + showSnackbar: true, + setShowSnackbar: () => true, + message: "Withdrawn to Applications in Progress", + alertType: "info", + }); + invalidate(); + } + }, + onError: (err: AxiosError) => err, + }); +}; + +export const useInvalidateApplicationsInQueue = () => { + const queryClient = useQueryClient(); + + return { + invalidate: () => { + queryClient.invalidateQueries({ queryKey: ["applicationsInQueue"] }); + }, + }; +}; + /** * Hook used for resending a permit. * @returns Mutation object to be used for resending a permit diff --git a/frontend/src/features/permits/types/ApplicationQueueStatus.ts b/frontend/src/features/permits/types/ApplicationQueueStatus.ts new file mode 100644 index 000000000..e995ad16c --- /dev/null +++ b/frontend/src/features/permits/types/ApplicationQueueStatus.ts @@ -0,0 +1,8 @@ +export const APPLICATION_QUEUE_STATUSES = { + PENDING_REVIEW: "PENDING_REVIEW", + IN_REVIEW: "IN_REVIEW", + CLOSED: "CLOSED", +} as const; + +export type ApplicationQueueStatus = + (typeof APPLICATION_QUEUE_STATUSES)[keyof typeof APPLICATION_QUEUE_STATUSES]; diff --git a/frontend/src/features/permits/types/CaseActivityType.ts b/frontend/src/features/permits/types/CaseActivityType.ts new file mode 100644 index 000000000..d5c9bff15 --- /dev/null +++ b/frontend/src/features/permits/types/CaseActivityType.ts @@ -0,0 +1,16 @@ +export const APPLICATION_QUEUE_STATUSES = { + PENDING_REVIEW: "PENDING_REVIEW", + IN_REVIEW: "IN_REVIEW", + CLOSED: "CLOSED", +} as const; + +export type ApplicationQueueStatus = + (typeof APPLICATION_QUEUE_STATUSES)[keyof typeof APPLICATION_QUEUE_STATUSES]; + +export const CASE_ACTIVITY_TYPES = { + APPROVED: "APPROVED", + REJECTED: "REJECTED", + WITHDRAWN: "WITHDRAWN", +}; +export type CaseActivityType = + (typeof CASE_ACTIVITY_TYPES)[keyof typeof CASE_ACTIVITY_TYPES]; diff --git a/frontend/src/features/permits/types/PermitStatus.ts b/frontend/src/features/permits/types/PermitStatus.ts index 55de5ec1b..c54146b2e 100644 --- a/frontend/src/features/permits/types/PermitStatus.ts +++ b/frontend/src/features/permits/types/PermitStatus.ts @@ -5,6 +5,7 @@ export const PERMIT_STATUSES = { IN_PROGRESS: "IN_PROGRESS", IN_CART: "IN_CART", REJECTED: "REJECTED", + IN_QUEUE: "IN_QUEUE", UNDER_REVIEW: "UNDER_REVIEW", WAITING_APPROVAL: "WAITING_APPROVAL", WAITING_PAYMENT: "WAITING_PAYMENT", diff --git a/frontend/src/features/permits/types/application.ts b/frontend/src/features/permits/types/application.ts index 2688b1752..102fb5992 100644 --- a/frontend/src/features/permits/types/application.ts +++ b/frontend/src/features/permits/types/application.ts @@ -7,6 +7,7 @@ import { Nullable } from "../../../common/types/common"; import { PermitApplicationOrigin } from "./PermitApplicationOrigin"; import { PermitApprovalSource } from "./PermitApprovalSource"; import { PermitData } from "./PermitData"; +import { ApplicationQueueStatus } from "./ApplicationQueueStatus"; /** * A partial permit type that consists of all common fields used for a permit. @@ -58,9 +59,8 @@ type TransformPermitData = { /** * Type for response data from fetching Application details. */ -export interface ApplicationResponseData extends TransformPermitData< - ReplaceDayjsWithString ->{}; +export interface ApplicationResponseData + extends TransformPermitData> {} /** * Type for create application request payload. @@ -76,7 +76,7 @@ export interface CreateApplicationRequestData { permitApplicationOrigin?: Nullable; permitData: ReplaceDayjsWithString; comment?: Nullable; -}; +} /** * Type for update application request payload. @@ -107,6 +107,7 @@ export interface ApplicationListItem { unitNumber?: Nullable; vin?: Nullable; plate?: Nullable; + applicationQueueStatus?: ApplicationQueueStatus; } /** diff --git a/frontend/src/features/permits/types/permit.ts b/frontend/src/features/permits/types/permit.ts index fcfa53e72..c85e85c70 100644 --- a/frontend/src/features/permits/types/permit.ts +++ b/frontend/src/features/permits/types/permit.ts @@ -14,10 +14,7 @@ import { PermitApplicationOrigin } from "./PermitApplicationOrigin"; interface PartialPermit extends Omit< Required, - "previousRevision" - | "comment" - | "userGuid" - | "documentId" + "previousRevision" | "comment" | "userGuid" | "documentId" > { previousRevision?: Nullable; comment?: Nullable; @@ -68,7 +65,7 @@ export interface PermitListItem { /** * Type for permit response data from fetching permit details. */ -export interface PermitResponseData extends Permit {}; +export interface PermitResponseData extends Permit {} /** * Type used to describe the response object from various actions performed on permits @@ -82,4 +79,4 @@ export interface PermitsActionResponse { /** * Type used to describe the response object for issuing permits. */ -export interface IssuePermitsResponse extends PermitsActionResponse {}; +export interface IssuePermitsResponse extends PermitsActionResponse {} From 480c36e372ad2561f53e67c775ded6b423b93349 Mon Sep 17 00:00:00 2001 From: bcgov-brwang Date: Tue, 17 Sep 2024 09:04:53 -0700 Subject: [PATCH 33/63] fix/loadtests9: updated frontend test samplers with selenium webdriver integrated --- .../orbc_load_test_plan_frontend_bceid.jmx | 6461 +---------------- .../orbc_load_test_plan_frontend_idir.jmx | 6224 +--------------- 2 files changed, 273 insertions(+), 12412 deletions(-) diff --git a/loadtests/frontend/orbc_load_test_plan_frontend_bceid.jmx b/loadtests/frontend/orbc_load_test_plan_frontend_bceid.jmx index 3d468b63c..99a5b7be5 100644 --- a/loadtests/frontend/orbc_load_test_plan_frontend_bceid.jmx +++ b/loadtests/frontend/orbc_load_test_plan_frontend_bceid.jmx @@ -1,5 +1,5 @@ - + @@ -17,92 +17,16 @@ - - true - false - false - - - - - true - false - - - - - - Accept-Language - en-us,en;q=0.5 - - - Accept - text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 - - - Keep-Alive - 115 - - - User-Agent - Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13 - - - Accept-Encoding - gzip,deflate - - - Accept-Charset - ISO-8859-1,utf-8;q=0.7,*;q=0.7 - - - X-BlazeMeter-Session - ${__P(blazemeter.session_id)} - - - - - - - - - - - - - - true - 2 - ^((?!google|facebook|youtube|pinterest|twimg|doubleclick).)*$ - 60000 - 120000 - - NUM_THREADS - 200 - = - - - FRONTEND_API_URL - onroutebc-test-frontend.apps.silver.devops.gov.bc.ca/ - = - - - VEHICLES_API_URL - onroutebc-test-vehicles.apps.silver.devops.gov.bc.ca/ + 1 = - - DOPS_API_URL - onroutebc-test-dops.apps.silver.devops.gov.bc.ca/ - = - - - BCEID_BEARER_TOKEN - + + FRONTEND_URL + https://onroutebc-test-frontend.apps.silver.devops.gov.bc.ca = @@ -110,6234 +34,189 @@ ~/results = - - KEYCLOAK_LOGIN_URL - test.loginproxy.gov.bc.ca + + USER + + = + + + PASSWORD + = - - SITEMINDER_URL - logontest7.gov.bc.ca + + NEW_APPLICATION_URL + https://onroutebc-test-frontend.apps.silver.devops.gov.bc.ca/create-application/TROS = - - continue - - false - 1 - - ${NUM_THREADS} - ${__P(rampup,300)} - 1365261073000 - 1365261073000 - true - ${__P(duration,3000)} - - true - - - - ${__P(Delay,10000)} - - - - - - - false - - = - true - - - - - - - - https://${FRONTEND_API_URL}/ - GET - true - false - true - false - - - - - - - - - Host - ${FRONTEND_API_URL} - - - Connection - keep-alive - - - Cache-Control - max-age=0 - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - sec-ch-ua-mobile - ?0 - - - sec-ch-ua-platform - "Windows" - - - Upgrade-Insecure-Requests - 1 - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Accept - text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 - - - Sec-Fetch-Site - same-origin - - - Sec-Fetch-Mode - navigate - - - Sec-Fetch-User - ?1 - - - Sec-Fetch-Dest - document - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - Cookie - _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; FAILREASON=0; 9a75866e187615f9e3e688e8297548f9=1f5b60b83338df80ae3a11e1286008b7; SMSESSION=LOGGEDOFF - - - If-None-Match - W/"653ca247-308" - - - If-Modified-Since - Sat, 28 Oct 2023 05:55:19 GMT - - - - - - - - - - false - - = - true - - - - - - - - https://${KEYCLOAK_LOGIN_URL}/auth/realms/standard/.well-known/openid-configuration - GET - true - false - true - false - - - - - - - - - Host - ${KEYCLOAK_LOGIN_URL} - - - Connection - keep-alive - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - Accept - application/jwk-set+json, application/json - - - sec-ch-ua-mobile - ?0 - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - sec-ch-ua-platform - "Windows" - - - Origin - https://${FRONTEND_API_URL} - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - cors - - - Sec-Fetch-Dest - empty - - - Referer - https://${FRONTEND_API_URL}/ - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - - - - - - - - false - - = - true - - - - - - - - https://${KEYCLOAK_LOGIN_URL}/auth/realms/standard/protocol/openid-connect/auth?client_id=on-route-bc-direct-4598&redirect_uri=https%3A%2F%2F${FRONTEND_API_URL}%2F&response_type=code&scope=openid&state=7be0f498ddfa45e28ee8f2416475ba42&code_challenge=B4JszPcS0HOW7ECTTUURC1mp6z8at2b6K0lD1uK_11A&code_challenge_method=S256&response_mode=query&kc_idp_hint=bceidboth - GET - true - false - true - false - - - - - - - - - Host - ${KEYCLOAK_LOGIN_URL} - - - Connection - keep-alive - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - sec-ch-ua-mobile - ?0 - - - sec-ch-ua-platform - "Windows" - - - Upgrade-Insecure-Requests - 1 - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Accept - text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - navigate - - - Sec-Fetch-User - ?1 - - - Sec-Fetch-Dest - document - - - Referer - https://${FRONTEND_API_URL}/ - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - Cookie - AUTH_SESSION_ID=2e364c60-0ead-4ec1-98fb-0e1bba001f08.ycloak-78b4c74bcf-vtmwp; AUTH_SESSION_ID_LEGACY=2e364c60-0ead-4ec1-98fb-0e1bba001f08.ycloak-78b4c74bcf-vtmwp; _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; FAILREASON=0; SMSESSION=LOGGEDOFF - - - - - - - - - - false - - = - true - - - - - - - - https://${KEYCLOAK_LOGIN_URL}/auth/realms/standard/broker/bceidboth/login?session_code=5b_D1WNhNIzE-FZe70dEmhs_J2mpDyFSyQzWPAxnjYc&client_id=on-route-bc-direct-4598&tab_id=KAxYXjoatGc - GET - true - false - true - false - - - - - - - - - Host - ${KEYCLOAK_LOGIN_URL} - - - Connection - keep-alive - - - Upgrade-Insecure-Requests - 1 - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Accept - text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - navigate - - - Sec-Fetch-User - ?1 - - - Sec-Fetch-Dest - document - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - sec-ch-ua-mobile - ?0 - - - sec-ch-ua-platform - "Windows" - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - Cookie - AUTH_SESSION_ID=0e56ff7b-e277-400f-84f5-25801c43c829.ycloak-78b4c74bcf-kh476; AUTH_SESSION_ID_LEGACY=0e56ff7b-e277-400f-84f5-25801c43c829.ycloak-78b4c74bcf-kh476; KC_RESTART=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICIzMmI0MzNkNC02NjgwLTQxODMtOTc2Yy1kZDdjMTg0YjExMTQifQ.eyJjaWQiOiJvbi1yb3V0ZS1iYy1kaXJlY3QtNDU5OCIsInB0eSI6Im9wZW5pZC1jb25uZWN0IiwicnVyaSI6Imh0dHBzOi8vb25yb3V0ZWJjLXRlc3QtZnJvbnRlbmQuYXBwcy5zaWx2ZXIuZGV2b3BzLmdvdi5iYy5jYS8iLCJhY3QiOiJBVVRIRU5USUNBVEUiLCJub3RlcyI6eyJzY29wZSI6Im9wZW5pZCIsImlzcyI6Imh0dHBzOi8vdGVzdC5sb2dpbnByb3h5Lmdvdi5iYy5jYS9hdXRoL3JlYWxtcy9zdGFuZGFyZCIsInJlc3BvbnNlX3R5cGUiOiJjb2RlIiwiY29kZV9jaGFsbGVuZ2VfbWV0aG9kIjoiUzI1NiIsInJlZGlyZWN0X3VyaSI6Imh0dHBzOi8vb25yb3V0ZWJjLXRlc3QtZnJvbnRlbmQuYXBwcy5zaWx2ZXIuZGV2b3BzLmdvdi5iYy5jYS8iLCJzdGF0ZSI6IjdiZTBmNDk4ZGRmYTQ1ZTI4ZWU4ZjI0MTY0NzViYTQyIiwiY29kZV9jaGFsbGVuZ2UiOiJCNEpzelBjUzBIT1c3RUNUVFVVUkMxbXA2ejhhdDJiNkswbEQxdUtfMTFBIiwia2NfaWRwX2hpbnQiOiJiY2VpZGJvdGgiLCJyZXNwb25zZV9tb2RlIjoicXVlcnkifX0.2dLZTTjk8ZY0EFAaE88sAWQlfo7T17XcYLztnQwI_Yk; _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; FAILREASON=0; SMSESSION=LOGGEDOFF - - - - - - - - - - false - - = - true - - - - - - - - https://${KEYCLOAK_LOGIN_URL}/auth/realms/bceidboth/protocol/openid-connect/auth?scope=openid&state=JvIyfmoj0AzmBZWw0ZS8lBmhMJXd7lA_uAR8JQvLNlE.KAxYXjoatGc.on-route-bc-direct-4598&response_type=code&client_id=standard-realm&redirect_uri=https%3A%2F%2F${KEYCLOAK_LOGIN_URL}%2Fauth%2Frealms%2Fstandard%2Fbroker%2Fbceidboth%2Fendpoint&nonce=1sKWmdZ0aV6QIscb65Lrmg - GET - true - false - true - false - - - - - - - - - Host - ${KEYCLOAK_LOGIN_URL} - - - Connection - keep-alive - - - Upgrade-Insecure-Requests - 1 - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Accept - text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - navigate - - - Sec-Fetch-User - ?1 - - - Sec-Fetch-Dest - document - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - sec-ch-ua-mobile - ?0 - - - sec-ch-ua-platform - "Windows" - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - Cookie - AUTH_SESSION_ID=33769057-e4e2-49e9-821b-bab26d4e7507.ycloak-78b4c74bcf-gj9d6; AUTH_SESSION_ID_LEGACY=33769057-e4e2-49e9-821b-bab26d4e7507.ycloak-78b4c74bcf-gj9d6; KEYCLOAK_IDENTITY=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI1ZjExNjBiNS03Y2RjLTQ5NGQtYmFkOS0yZGRkNjU3MDU5Y2UifQ.eyJleHAiOjE2OTg3MzE3MzQsImlhdCI6MTY5ODY5NTczNCwianRpIjoiNzY3ZDEzMGEtMzczMC00NDdhLWEzNTUtNjhhNDhiMjgzZTI3IiwiaXNzIjoiaHR0cHM6Ly90ZXN0LmxvZ2lucHJveHkuZ292LmJjLmNhL2F1dGgvcmVhbG1zL2JjZWlkYm90aCIsInN1YiI6ImQ3M2FiN2IwLWUyMmEtNDg0NC04Yzc3LWU3YTQ2ODQyOTNmZCIsInR5cCI6IlNlcmlhbGl6ZWQtSUQiLCJzZXNzaW9uX3N0YXRlIjoiMzM3NjkwNTctZTRlMi00OWU5LTgyMWItYmFiMjZkNGU3NTA3Iiwic2lkIjoiMzM3NjkwNTctZTRlMi00OWU5LTgyMWItYmFiMjZkNGU3NTA3Iiwic3RhdGVfY2hlY2tlciI6Ik9SWEI4amY3Q3hPUWhzTUNhWU5nMHF2WHNzZG52cnlxUHFjMnFpUkthZncifQ.1kpL3Qpg4pyqSLBE0iDz7WZ0fdGzCCf6RCiN6HvFWqE; KEYCLOAK_IDENTITY_LEGACY=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI1ZjExNjBiNS03Y2RjLTQ5NGQtYmFkOS0yZGRkNjU3MDU5Y2UifQ.eyJleHAiOjE2OTg3MzE3MzQsImlhdCI6MTY5ODY5NTczNCwianRpIjoiNzY3ZDEzMGEtMzczMC00NDdhLWEzNTUtNjhhNDhiMjgzZTI3IiwiaXNzIjoiaHR0cHM6Ly90ZXN0LmxvZ2lucHJveHkuZ292LmJjLmNhL2F1dGgvcmVhbG1zL2JjZWlkYm90aCIsInN1YiI6ImQ3M2FiN2IwLWUyMmEtNDg0NC04Yzc3LWU3YTQ2ODQyOTNmZCIsInR5cCI6IlNlcmlhbGl6ZWQtSUQiLCJzZXNzaW9uX3N0YXRlIjoiMzM3NjkwNTctZTRlMi00OWU5LTgyMWItYmFiMjZkNGU3NTA3Iiwic2lkIjoiMzM3NjkwNTctZTRlMi00OWU5LTgyMWItYmFiMjZkNGU3NTA3Iiwic3RhdGVfY2hlY2tlciI6Ik9SWEI4amY3Q3hPUWhzTUNhWU5nMHF2WHNzZG52cnlxUHFjMnFpUkthZncifQ.1kpL3Qpg4pyqSLBE0iDz7WZ0fdGzCCf6RCiN6HvFWqE; KEYCLOAK_SESSION=bceidboth/d73ab7b0-e22a-4844-8c77-e7a4684293fd/33769057-e4e2-49e9-821b-bab26d4e7507; KEYCLOAK_SESSION_LEGACY=bceidboth/d73ab7b0-e22a-4844-8c77-e7a4684293fd/33769057-e4e2-49e9-821b-bab26d4e7507; _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; FAILREASON=0; SMSESSION=LOGGEDOFF - - - - - - - - - - false - - = - true - - - - - - - - https://${KEYCLOAK_LOGIN_URL}/auth/realms/bceidboth/broker/bceidboth/login?session_code=oRr0p7JZ9oL7vptnFPfNKhf_nrB8DND1rBojsNPjot0&client_id=standard-realm&tab_id=k5Vw5BDlfVQ - GET - true - false - true - false - - - - - - - - - Host - ${KEYCLOAK_LOGIN_URL} - - - Connection - keep-alive - - - Upgrade-Insecure-Requests - 1 - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Accept - text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - navigate - - - Sec-Fetch-User - ?1 - - - Sec-Fetch-Dest - document - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - sec-ch-ua-mobile - ?0 - - - sec-ch-ua-platform - "Windows" - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - Cookie - AUTH_SESSION_ID=f26f78a0-28d2-40b4-9e57-b83fa590e32e.ycloak-78b4c74bcf-vtmwp; AUTH_SESSION_ID_LEGACY=f26f78a0-28d2-40b4-9e57-b83fa590e32e.ycloak-78b4c74bcf-vtmwp; KC_RESTART=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI1ZjExNjBiNS03Y2RjLTQ5NGQtYmFkOS0yZGRkNjU3MDU5Y2UifQ.eyJjaWQiOiJzdGFuZGFyZC1yZWFsbSIsInB0eSI6Im9wZW5pZC1jb25uZWN0IiwicnVyaSI6Imh0dHBzOi8vdGVzdC5sb2dpbnByb3h5Lmdvdi5iYy5jYS9hdXRoL3JlYWxtcy9zdGFuZGFyZC9icm9rZXIvYmNlaWRib3RoL2VuZHBvaW50IiwiYWN0IjoiQVVUSEVOVElDQVRFIiwibm90ZXMiOnsic2NvcGUiOiJvcGVuaWQiLCJpc3MiOiJodHRwczovL3Rlc3QubG9naW5wcm94eS5nb3YuYmMuY2EvYXV0aC9yZWFsbXMvYmNlaWRib3RoIiwicmVzcG9uc2VfdHlwZSI6ImNvZGUiLCJyZWRpcmVjdF91cmkiOiJodHRwczovL3Rlc3QubG9naW5wcm94eS5nb3YuYmMuY2EvYXV0aC9yZWFsbXMvc3RhbmRhcmQvYnJva2VyL2JjZWlkYm90aC9lbmRwb2ludCIsInN0YXRlIjoiSnZJeWZtb2owQXptQlpXdzBaUzhsQm1oTUpYZDdsQV91QVI4SlF2TE5sRS5LQXhZWGpvYXRHYy5vbi1yb3V0ZS1iYy1kaXJlY3QtNDU5OCIsIm5vbmNlIjoiMXNLV21kWjBhVjZRSXNjYjY1THJtZyJ9fQ.08S_Qi57kTkuLj_eH5VElw2zeuH4AVhfOUois5IUzEI; _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; FAILREASON=0; SMSESSION=LOGGEDOFF - - - - - - - - - - false - - = - true - - - - - - - - https://${SITEMINDER_URL}/clp-cgi/capBceid/logon.cgi?flags=0101:0,7&TYPE=33554433&REALMOID=06-b02c7ed2-895e-4953-bd03-8008c64ec906&GUID=&SMAUTHREASON=0&METHOD=GET&SMAGENTNAME=$SM$Lk6VtkyHw8x3zQIIsMiOiEXYFJF%2fJzjVT7eioCjxBjJck5VMlbxxrR%2bLZSo%2flIBX&TARGET=$SM$HTTPS%3a%2f%2fsfstest7%2egov%2ebc%2eca%2faffwebservices%2fredirectjsp%2ftestkeycloak-basicbusinessbceid%2fredirect%2ejsp%3fSMPORTALURL%3dhttps$%3A$%2F$%2Fsfstest7%2egov%2ebc%2eca$%2Faffwebservices$%2Fpublic$%2Fsaml2sso%26SAMLTRANSACTIONID%3dc9f189ad-7324de1b-2e045e1a-e8bcf162-a78af00c-c5 - GET - true - false - true - false - - - - - - - - - Host - ${SITEMINDER_URL} - - - Connection - keep-alive - - - Cache-Control - max-age=0 - - - Upgrade-Insecure-Requests - 1 - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Accept - text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - navigate - - - Sec-Fetch-Dest - document - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - sec-ch-ua-mobile - ?0 - - - sec-ch-ua-platform - "Windows" - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - Cookie - _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; Dummy1=DummyVal1; BCGOVFlags=0101%3A0%2C7; BCGOVCustom=NULL; BCGOVBrand=NULL; BCGOVBehavior=NULL; Dummy2=DummyVal2; preDummy1=DummyVal1; preDummy2=DummyVal2; preDummy3=DummyVal3; BCGOVDoNotShow=1; preDummy4=DummyVal4; FAILREASON=0; BCGOVTarget=HTTPS%3A%2F%2Fsfstest7.gov.bc.ca%2Faffwebservices%2Fredirectjsp%2Ftestkeycloak-basicbusinessbceid%2Fredirect.jsp%3FSMPORTALURL%3Dhttps%253A%252F%252Fsfstest7.gov.bc.ca%252Faffwebservices%252Fpublic%252Fsaml2sso%26SAMLTRANSACTIONID%3Df7917115-57286b4a-df9cf6ff-b50e2f11-c566ac5a-f6; BCGOVclptryno=0; clp001=0; SMSESSION=LOGGEDOFF; SMFED_OLD_SESSION=""; SMFED_OLD_IDENTITY=""; GUID=1:26feb557-62af2c8c-4ef3a8d7-2e2277be-6a76895c-697 - - - - - - - true - - - - false - instance=instance_capBceid&user=ORBCTST3&password=orbcTST%2B2023 - = - - - - - - - - https://${SITEMINDER_URL}/clp-cgi/preLogon.cgi - POST - true - false - true - false - - - - - - - - - Host - ${SITEMINDER_URL} - - - Connection - keep-alive - - - Content-Length - 64 - - - Cache-Control - max-age=0 - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - sec-ch-ua-mobile - ?0 - - - sec-ch-ua-platform - "Windows" - - - Upgrade-Insecure-Requests - 1 - - - Origin - https://${SITEMINDER_URL} - - - Content-Type - application/x-www-form-urlencoded - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Accept - text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 - - - Sec-Fetch-Site - same-origin - - - Sec-Fetch-Mode - navigate - - - Sec-Fetch-User - ?1 - - - Sec-Fetch-Dest - document - - - Referer - https://${SITEMINDER_URL}/clp-cgi/capBceid/logon.cgi?flags=0101:0,7&TYPE=33554433&REALMOID=06-b02c7ed2-895e-4953-bd03-8008c64ec906&GUID=&SMAUTHREASON=0&METHOD=GET&SMAGENTNAME=$SM$Lk6VtkyHw8x3zQIIsMiOiEXYFJF%2fJzjVT7eioCjxBjJck5VMlbxxrR%2bLZSo%2flIBX&TARGET=$SM$HTTPS%3a%2f%2fsfstest7%2egov%2ebc%2eca%2faffwebservices%2fredirectjsp%2ftestkeycloak-basicbusinessbceid%2fredirect%2ejsp%3fSMPORTALURL%3dhttps$%3A$%2F$%2Fsfstest7%2egov%2ebc%2eca$%2Faffwebservices$%2Fpublic$%2Fsaml2sso%26SAMLTRANSACTIONID%3dc9f189ad-7324de1b-2e045e1a-e8bcf162-a78af00c-c5 - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - Cookie - _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; Dummy1=DummyVal1; BCGOVFlags=0101%3A0%2C7; BCGOVCustom=NULL; BCGOVBrand=NULL; BCGOVBehavior=NULL; Dummy2=DummyVal2; preDummy1=DummyVal1; preDummy2=DummyVal2; preDummy3=DummyVal3; BCGOVDoNotShow=1; preDummy4=DummyVal4; FAILREASON=0; clp001=0; SMSESSION=LOGGEDOFF; SMFED_OLD_SESSION=""; SMFED_OLD_IDENTITY=""; GUID=1:26feb557-62af2c8c-4ef3a8d7-2e2277be-6a76895c-697; BCGOVTarget=HTTPS%3A%2F%2Fsfstest7.gov.bc.ca%2Faffwebservices%2Fredirectjsp%2Ftestkeycloak-basicbusinessbceid%2Fredirect.jsp%3FSMPORTALURL%3Dhttps%253A%252F%252Fsfstest7.gov.bc.ca%252Faffwebservices%252Fpublic%252Fsaml2sso%26SAMLTRANSACTIONID%3Dc9f189ad-7324de1b-2e045e1a-e8bcf162-a78af00c-c5; BCGOVclptryno=1 - - - - - - - true - - - - false - SMENC=ISO-8859-1&SMLOCALE=US-EN&target=%2Fclp-cgi%2Fcap07%2Fprivate%2FpostLogon.cgi&smauthreason=0&smagentname=&user=ORBCTST3&password=orbcTST%2B2023 - = - - - - - - - - https://${SITEMINDER_URL}/clp-cgi/cap07/logon.fcc - POST - true - false - true - false - - - - - - - - - Host - ${SITEMINDER_URL} - - - Connection - keep-alive - - - Content-Length - 149 - - - Cache-Control - max-age=0 - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - sec-ch-ua-mobile - ?0 - - - sec-ch-ua-platform - "Windows" - - - Upgrade-Insecure-Requests - 1 - - - Origin - https://${SITEMINDER_URL} - - - Content-Type - application/x-www-form-urlencoded - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Accept - text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 - - - Sec-Fetch-Site - same-origin - - - Sec-Fetch-Mode - navigate - - - Sec-Fetch-Dest - document - - - Referer - https://${SITEMINDER_URL}/clp-cgi/preLogon.cgi - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - Cookie - _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; Dummy1=DummyVal1; BCGOVFlags=0101%3A0%2C7; BCGOVCustom=NULL; BCGOVBrand=NULL; BCGOVBehavior=NULL; Dummy2=DummyVal2; preDummy1=DummyVal1; preDummy2=DummyVal2; preDummy3=DummyVal3; BCGOVDoNotShow=1; preDummy4=DummyVal4; FAILREASON=0; SMSESSION=LOGGEDOFF; SMFED_OLD_SESSION=""; SMFED_OLD_IDENTITY=""; GUID=1:26feb557-62af2c8c-4ef3a8d7-2e2277be-6a76895c-697; BCGOVTarget=HTTPS%3A%2F%2Fsfstest7.gov.bc.ca%2Faffwebservices%2Fredirectjsp%2Ftestkeycloak-basicbusinessbceid%2Fredirect.jsp%3FSMPORTALURL%3Dhttps%253A%252F%252Fsfstest7.gov.bc.ca%252Faffwebservices%252Fpublic%252Fsaml2sso%26SAMLTRANSACTIONID%3Dc9f189ad-7324de1b-2e045e1a-e8bcf162-a78af00c-c5; BCGOVclptryno=1; clp001=Salted__%8E%F5%14%93%F3.%C8%8C%C2%B3%84%8B%8EC%E0%88%AAK%01%C77%B6%C4g%C3%D2%3ELS%06%7CdJp%18%E9TJ%8A%D3a%A9%AD%3C%5E%DBZ%D7 - - - - - - - - - - false - - = - - - - - - - - https://${SITEMINDER_URL}/clp-cgi/cap07/private/postLogon.cgi - GET - true - false - true - false - - - - - - - - - Host - ${SITEMINDER_URL} - - - Connection - keep-alive - - - Cache-Control - max-age=0 - - - Upgrade-Insecure-Requests - 1 - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Accept - text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 - - - Sec-Fetch-Site - same-origin - - - Sec-Fetch-Mode - navigate - - - Sec-Fetch-Dest - document - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - sec-ch-ua-mobile - ?0 - - - sec-ch-ua-platform - "Windows" - - - Referer - https://${SITEMINDER_URL}/clp-cgi/preLogon.cgi - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - Cookie - _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; Dummy1=DummyVal1; BCGOVFlags=0101%3A0%2C7; BCGOVCustom=NULL; BCGOVBrand=NULL; BCGOVBehavior=NULL; Dummy2=DummyVal2; preDummy1=DummyVal1; preDummy2=DummyVal2; preDummy3=DummyVal3; BCGOVDoNotShow=1; preDummy4=DummyVal4; FAILREASON=0; SMSESSION=LOGGEDOFF; SMFED_OLD_SESSION=""; SMFED_OLD_IDENTITY=""; GUID=1:26feb557-62af2c8c-4ef3a8d7-2e2277be-6a76895c-697; BCGOVTarget=HTTPS%3A%2F%2Fsfstest7.gov.bc.ca%2Faffwebservices%2Fredirectjsp%2Ftestkeycloak-basicbusinessbceid%2Fredirect.jsp%3FSMPORTALURL%3Dhttps%253A%252F%252Fsfstest7.gov.bc.ca%252Faffwebservices%252Fpublic%252Fsaml2sso%26SAMLTRANSACTIONID%3Dc9f189ad-7324de1b-2e045e1a-e8bcf162-a78af00c-c5; BCGOVclptryno=1; clp001=Salted__%8E%F5%14%93%F3.%C8%8C%C2%B3%84%8B%8EC%E0%88%AAK%01%C77%B6%C4g%C3%D2%3ELS%06%7CdJp%18%E9TJ%8A%D3a%A9%AD%3C%5E%DBZ%D7; FORMCRED=2ZS4S2F4tb41FWGyAD293ZV3eiMsCRYZ+ktOitYzjWY/fG/2BFtCWHSnbkvgJfBEm8aTuwAg3nMfeG0h8ahL0C1Q+SZp1d30x/imUNpQkjqP7yK+smpXGQMNWzNb15A+UXcYa0yUQLQ5rFoH720FIoiqZ4Nmikk7a67vktQxd8rpIduHeZJ7tAYb/b+pXPha - - - - - - - - - - false - - = - - - - - - - - https://${KEYCLOAK_LOGIN_URL}/auth/realms/standard/broker/bceidboth/endpoint?state=JvIyfmoj0AzmBZWw0ZS8lBmhMJXd7lA_uAR8JQvLNlE.KAxYXjoatGc.on-route-bc-direct-4598&session_state=f26f78a0-28d2-40b4-9e57-b83fa590e32e&code=c5719177-78e8-4d75-857a-0ef191c765d1.f26f78a0-28d2-40b4-9e57-b83fa590e32e.1123d85b-badf-4084-a3a6-b1c920ccb0c0 - GET - true - false - true - false - - - - - - - - - Host - ${KEYCLOAK_LOGIN_URL} - - - Connection - keep-alive - - - Cache-Control - max-age=0 - - - Upgrade-Insecure-Requests - 1 - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Accept - text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - navigate - - - Sec-Fetch-Dest - document - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - sec-ch-ua-mobile - ?0 - - - sec-ch-ua-platform - "Windows" - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - Cookie - AUTH_SESSION_ID=0e56ff7b-e277-400f-84f5-25801c43c829.ycloak-78b4c74bcf-kh476; AUTH_SESSION_ID_LEGACY=0e56ff7b-e277-400f-84f5-25801c43c829.ycloak-78b4c74bcf-kh476; KC_RESTART=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICIzMmI0MzNkNC02NjgwLTQxODMtOTc2Yy1kZDdjMTg0YjExMTQifQ.eyJjaWQiOiJvbi1yb3V0ZS1iYy1kaXJlY3QtNDU5OCIsInB0eSI6Im9wZW5pZC1jb25uZWN0IiwicnVyaSI6Imh0dHBzOi8vb25yb3V0ZWJjLXRlc3QtZnJvbnRlbmQuYXBwcy5zaWx2ZXIuZGV2b3BzLmdvdi5iYy5jYS8iLCJhY3QiOiJBVVRIRU5USUNBVEUiLCJub3RlcyI6eyJzY29wZSI6Im9wZW5pZCIsImlzcyI6Imh0dHBzOi8vdGVzdC5sb2dpbnByb3h5Lmdvdi5iYy5jYS9hdXRoL3JlYWxtcy9zdGFuZGFyZCIsInJlc3BvbnNlX3R5cGUiOiJjb2RlIiwiY29kZV9jaGFsbGVuZ2VfbWV0aG9kIjoiUzI1NiIsInJlZGlyZWN0X3VyaSI6Imh0dHBzOi8vb25yb3V0ZWJjLXRlc3QtZnJvbnRlbmQuYXBwcy5zaWx2ZXIuZGV2b3BzLmdvdi5iYy5jYS8iLCJzdGF0ZSI6IjdiZTBmNDk4ZGRmYTQ1ZTI4ZWU4ZjI0MTY0NzViYTQyIiwiY29kZV9jaGFsbGVuZ2UiOiJCNEpzelBjUzBIT1c3RUNUVFVVUkMxbXA2ejhhdDJiNkswbEQxdUtfMTFBIiwia2NfaWRwX2hpbnQiOiJiY2VpZGJvdGgiLCJyZXNwb25zZV9tb2RlIjoicXVlcnkifX0.2dLZTTjk8ZY0EFAaE88sAWQlfo7T17XcYLztnQwI_Yk; _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; FAILREASON=0; SMSESSION=Awk9KIrMNenX09Vl2cEMuy/VxV9CFVP4fsBzCp8Zo3AX2VsrDVWkOMVOdJyoY1Q1J9F8Vs8XFBtHTU29qS7+jlhEMK3f9j8tgudEVWHJq8LTizGhEj1cf8r7CX2QuxWMbdAHvK90hFnpocsL5xv2cAaFVdqhBKlIYkzwkY+r0YuH3Uh6DJVIhAhwjWeKfO6BAg5/jNFxQ31EPvzn4N7RxJK2bGyfAxzi6Cs6O7ieJ10MzcB8nWSIsO4ksfG8pzeGp9a+arl4maKnd9Je2L2FQohmiOjfGcrsezOgLgiWFl1B3+EL8ytArvtKhsFvr7WJsQuhYsQYzfY8shcfhNSltyqxLD422bDmU3NyZdhWY9313YG5I1U2vbO7zvXhxaCJYnpMrJR+inz8XsyqnGY1xu7AepY3pNd2wJH3twQJ42N6R2WlJVVN3oc3DvEHUbk85xrqHdwngd/FiMdEC2f5Kt51VYp8G/3R+sbFiy6Wt7wlZw2+/wI8EfxXs31HQ5q/RDUTXz6JMbzsR7EUOF+WkOrgi1nDugu13/O9hDnxPJnkzNGEfjt0xPxdhoDdl4vWdwRe1awBEn90SyJwc8+cFk1XACtvWoGwtPdf1xnHUwx5Ge1TqEd46xdjjlu+iTw2Xu5AsESUVVw81STsKA7vC8EBabQ+yXQHZlNFcFCKa1+AutNxfWHNQtnFK03kUCai4ZPJc/TQrhvf9DWjSyX+KknWdV6aQyz65KOpwtQWpd4ZlqAAKvf9vCQIBgk+YdsxFzAq6ySnLPcBLbFvP+Xyo5bcABg8IS9aJr6+05KT3ZOv49G1uYvz1ILaDED83D5NHF57ZswKR2911SevaqIO2i8NkZAJUMBpgroSejoJ1MxzpL/a7I26u6+p/08uMt/dT7vuo5OTTjayEtIlXy1IRXA/jU/uX/pKk1JrsZFhhwj7G5KEQpMAx+YvZUaaidqyfj3+fLb6+rsa8BukV8x0zfgUg20dm+Wu9XjDvyQHFP4Qt65CaUbhAKcVTgCChgTfSSdUJZIPPa5Yhzr7SmTuVGmYV/1cC4jGzNdSqr3Fq28fWukiEnRtqfZRXlOdA6xb - - - - - - - - - - false - - = - true - - - - - - - - https://${KEYCLOAK_LOGIN_URL}/auth/realms/standard/login-actions/post-broker-login?client_id=on-route-bc-direct-4598&tab_id=KAxYXjoatGc - GET - true - false - true - false - - - - - - - - - Host - ${KEYCLOAK_LOGIN_URL} - - - Connection - keep-alive - - - Cache-Control - max-age=0 - - - Upgrade-Insecure-Requests - 1 - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Accept - text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - navigate - - - Sec-Fetch-Dest - document - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - sec-ch-ua-mobile - ?0 - - - sec-ch-ua-platform - "Windows" - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - Cookie - AUTH_SESSION_ID=0e56ff7b-e277-400f-84f5-25801c43c829.ycloak-78b4c74bcf-kh476; AUTH_SESSION_ID_LEGACY=0e56ff7b-e277-400f-84f5-25801c43c829.ycloak-78b4c74bcf-kh476; KC_RESTART=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICIzMmI0MzNkNC02NjgwLTQxODMtOTc2Yy1kZDdjMTg0YjExMTQifQ.eyJjaWQiOiJvbi1yb3V0ZS1iYy1kaXJlY3QtNDU5OCIsInB0eSI6Im9wZW5pZC1jb25uZWN0IiwicnVyaSI6Imh0dHBzOi8vb25yb3V0ZWJjLXRlc3QtZnJvbnRlbmQuYXBwcy5zaWx2ZXIuZGV2b3BzLmdvdi5iYy5jYS8iLCJhY3QiOiJBVVRIRU5USUNBVEUiLCJub3RlcyI6eyJzY29wZSI6Im9wZW5pZCIsImlzcyI6Imh0dHBzOi8vdGVzdC5sb2dpbnByb3h5Lmdvdi5iYy5jYS9hdXRoL3JlYWxtcy9zdGFuZGFyZCIsInJlc3BvbnNlX3R5cGUiOiJjb2RlIiwiY29kZV9jaGFsbGVuZ2VfbWV0aG9kIjoiUzI1NiIsInJlZGlyZWN0X3VyaSI6Imh0dHBzOi8vb25yb3V0ZWJjLXRlc3QtZnJvbnRlbmQuYXBwcy5zaWx2ZXIuZGV2b3BzLmdvdi5iYy5jYS8iLCJzdGF0ZSI6IjdiZTBmNDk4ZGRmYTQ1ZTI4ZWU4ZjI0MTY0NzViYTQyIiwiY29kZV9jaGFsbGVuZ2UiOiJCNEpzelBjUzBIT1c3RUNUVFVVUkMxbXA2ejhhdDJiNkswbEQxdUtfMTFBIiwia2NfaWRwX2hpbnQiOiJiY2VpZGJvdGgiLCJyZXNwb25zZV9tb2RlIjoicXVlcnkifX0.2dLZTTjk8ZY0EFAaE88sAWQlfo7T17XcYLztnQwI_Yk; _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; FAILREASON=0; SMSESSION=Awk9KIrMNenX09Vl2cEMuy/VxV9CFVP4fsBzCp8Zo3AX2VsrDVWkOMVOdJyoY1Q1J9F8Vs8XFBtHTU29qS7+jlhEMK3f9j8tgudEVWHJq8LTizGhEj1cf8r7CX2QuxWMbdAHvK90hFnpocsL5xv2cAaFVdqhBKlIYkzwkY+r0YuH3Uh6DJVIhAhwjWeKfO6BAg5/jNFxQ31EPvzn4N7RxJK2bGyfAxzi6Cs6O7ieJ10MzcB8nWSIsO4ksfG8pzeGp9a+arl4maKnd9Je2L2FQohmiOjfGcrsezOgLgiWFl1B3+EL8ytArvtKhsFvr7WJsQuhYsQYzfY8shcfhNSltyqxLD422bDmU3NyZdhWY9313YG5I1U2vbO7zvXhxaCJYnpMrJR+inz8XsyqnGY1xu7AepY3pNd2wJH3twQJ42N6R2WlJVVN3oc3DvEHUbk85xrqHdwngd/FiMdEC2f5Kt51VYp8G/3R+sbFiy6Wt7wlZw2+/wI8EfxXs31HQ5q/RDUTXz6JMbzsR7EUOF+WkOrgi1nDugu13/O9hDnxPJnkzNGEfjt0xPxdhoDdl4vWdwRe1awBEn90SyJwc8+cFk1XACtvWoGwtPdf1xnHUwx5Ge1TqEd46xdjjlu+iTw2Xu5AsESUVVw81STsKA7vC8EBabQ+yXQHZlNFcFCKa1+AutNxfWHNQtnFK03kUCai4ZPJc/TQrhvf9DWjSyX+KknWdV6aQyz65KOpwtQWpd4ZlqAAKvf9vCQIBgk+YdsxFzAq6ySnLPcBLbFvP+Xyo5bcABg8IS9aJr6+05KT3ZOv49G1uYvz1ILaDED83D5NHF57ZswKR2911SevaqIO2i8NkZAJUMBpgroSejoJ1MxzpL/a7I26u6+p/08uMt/dT7vuo5OTTjayEtIlXy1IRXA/jU/uX/pKk1JrsZFhhwj7G5KEQpMAx+YvZUaaidqyfj3+fLb6+rsa8BukV8x0zfgUg20dm+Wu9XjDvyQHFP4Qt65CaUbhAKcVTgCChgTfSSdUJZIPPa5Yhzr7SmTuVGmYV/1cC4jGzNdSqr3Fq28fWukiEnRtqfZRXlOdA6xb - - - - - - - - - - false - - = - true - - - - - - - - https://${KEYCLOAK_LOGIN_URL}/auth/realms/standard/.well-known/openid-configuration - GET - true - false - true - false - - - - - - - - - Host - ${KEYCLOAK_LOGIN_URL} - - - Connection - keep-alive - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - Accept - application/jwk-set+json, application/json - - - sec-ch-ua-mobile - ?0 - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - sec-ch-ua-platform - "Windows" - - - Origin - https://${FRONTEND_API_URL} - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - cors - - - Sec-Fetch-Dest - empty - - - Referer - https://${FRONTEND_API_URL}/ - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - - - - - - continue - - false - 1 - - 1 - ${__P(rampup,300)} - 1365261073000 - 1365261073000 - true - ${__P(duration,3000)} - - true - - - - ${__P(Delay,10000)} - - - - - - - false - - = - true - - - - - - - - https://${FRONTEND_API_URL}/ - GET - true - false - true - false - - - - - - - - - Host - ${FRONTEND_API_URL} - - - Connection - keep-alive - - - Cache-Control - max-age=0 - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - sec-ch-ua-mobile - ?0 - - - sec-ch-ua-platform - "Windows" - - - Upgrade-Insecure-Requests - 1 - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Accept - text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 - - - Sec-Fetch-Site - same-origin - - - Sec-Fetch-Mode - navigate - - - Sec-Fetch-User - ?1 - - - Sec-Fetch-Dest - document - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - Cookie - _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; FAILREASON=0; 9a75866e187615f9e3e688e8297548f9=1f5b60b83338df80ae3a11e1286008b7; SMSESSION=LOGGEDOFF - - - If-None-Match - W/"653ca247-308" - - - If-Modified-Since - Sat, 28 Oct 2023 05:55:19 GMT - - - - - - - - - - false - - = - true - - - - - - - - https://${KEYCLOAK_LOGIN_URL}/auth/realms/standard/.well-known/openid-configuration - GET - true - false - true - false - - - - - - - - - Host - ${KEYCLOAK_LOGIN_URL} - - - Connection - keep-alive - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - Accept - application/jwk-set+json, application/json - - - sec-ch-ua-mobile - ?0 - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - sec-ch-ua-platform - "Windows" - - - Origin - https://${FRONTEND_API_URL} - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - cors - - - Sec-Fetch-Dest - empty - - - Referer - https://${FRONTEND_API_URL}/ - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - - - - - - - - false - - = - true - - - - - - - - https://${KEYCLOAK_LOGIN_URL}/auth/realms/standard/protocol/openid-connect/auth?client_id=on-route-bc-direct-4598&redirect_uri=https%3A%2F%2F${FRONTEND_API_URL}%2F&response_type=code&scope=openid&state=7be0f498ddfa45e28ee8f2416475ba42&code_challenge=B4JszPcS0HOW7ECTTUURC1mp6z8at2b6K0lD1uK_11A&code_challenge_method=S256&response_mode=query&kc_idp_hint=bceidboth - GET - true - false - true - false - - - - - - - - - Host - ${KEYCLOAK_LOGIN_URL} - - - Connection - keep-alive - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - sec-ch-ua-mobile - ?0 - - - sec-ch-ua-platform - "Windows" - - - Upgrade-Insecure-Requests - 1 - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Accept - text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - navigate - - - Sec-Fetch-User - ?1 - - - Sec-Fetch-Dest - document - - - Referer - https://${FRONTEND_API_URL}/ - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - Cookie - AUTH_SESSION_ID=2e364c60-0ead-4ec1-98fb-0e1bba001f08.ycloak-78b4c74bcf-vtmwp; AUTH_SESSION_ID_LEGACY=2e364c60-0ead-4ec1-98fb-0e1bba001f08.ycloak-78b4c74bcf-vtmwp; _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; FAILREASON=0; SMSESSION=LOGGEDOFF - - - - - - - - - - false - - = - true - - - - - - - - https://${KEYCLOAK_LOGIN_URL}/auth/realms/standard/broker/bceidboth/login?session_code=5b_D1WNhNIzE-FZe70dEmhs_J2mpDyFSyQzWPAxnjYc&client_id=on-route-bc-direct-4598&tab_id=KAxYXjoatGc - GET - true - false - true - false - - - - - - - - - Host - ${KEYCLOAK_LOGIN_URL} - - - Connection - keep-alive - - - Upgrade-Insecure-Requests - 1 - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Accept - text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - navigate - - - Sec-Fetch-User - ?1 - - - Sec-Fetch-Dest - document - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - sec-ch-ua-mobile - ?0 - - - sec-ch-ua-platform - "Windows" - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - Cookie - AUTH_SESSION_ID=0e56ff7b-e277-400f-84f5-25801c43c829.ycloak-78b4c74bcf-kh476; AUTH_SESSION_ID_LEGACY=0e56ff7b-e277-400f-84f5-25801c43c829.ycloak-78b4c74bcf-kh476; KC_RESTART=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICIzMmI0MzNkNC02NjgwLTQxODMtOTc2Yy1kZDdjMTg0YjExMTQifQ.eyJjaWQiOiJvbi1yb3V0ZS1iYy1kaXJlY3QtNDU5OCIsInB0eSI6Im9wZW5pZC1jb25uZWN0IiwicnVyaSI6Imh0dHBzOi8vb25yb3V0ZWJjLXRlc3QtZnJvbnRlbmQuYXBwcy5zaWx2ZXIuZGV2b3BzLmdvdi5iYy5jYS8iLCJhY3QiOiJBVVRIRU5USUNBVEUiLCJub3RlcyI6eyJzY29wZSI6Im9wZW5pZCIsImlzcyI6Imh0dHBzOi8vdGVzdC5sb2dpbnByb3h5Lmdvdi5iYy5jYS9hdXRoL3JlYWxtcy9zdGFuZGFyZCIsInJlc3BvbnNlX3R5cGUiOiJjb2RlIiwiY29kZV9jaGFsbGVuZ2VfbWV0aG9kIjoiUzI1NiIsInJlZGlyZWN0X3VyaSI6Imh0dHBzOi8vb25yb3V0ZWJjLXRlc3QtZnJvbnRlbmQuYXBwcy5zaWx2ZXIuZGV2b3BzLmdvdi5iYy5jYS8iLCJzdGF0ZSI6IjdiZTBmNDk4ZGRmYTQ1ZTI4ZWU4ZjI0MTY0NzViYTQyIiwiY29kZV9jaGFsbGVuZ2UiOiJCNEpzelBjUzBIT1c3RUNUVFVVUkMxbXA2ejhhdDJiNkswbEQxdUtfMTFBIiwia2NfaWRwX2hpbnQiOiJiY2VpZGJvdGgiLCJyZXNwb25zZV9tb2RlIjoicXVlcnkifX0.2dLZTTjk8ZY0EFAaE88sAWQlfo7T17XcYLztnQwI_Yk; _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; FAILREASON=0; SMSESSION=LOGGEDOFF - - - - - - - - - - false - - = - true - - - - - - - - https://${KEYCLOAK_LOGIN_URL}/auth/realms/bceidboth/protocol/openid-connect/auth?scope=openid&state=JvIyfmoj0AzmBZWw0ZS8lBmhMJXd7lA_uAR8JQvLNlE.KAxYXjoatGc.on-route-bc-direct-4598&response_type=code&client_id=standard-realm&redirect_uri=https%3A%2F%2F${KEYCLOAK_LOGIN_URL}%2Fauth%2Frealms%2Fstandard%2Fbroker%2Fbceidboth%2Fendpoint&nonce=1sKWmdZ0aV6QIscb65Lrmg - GET - true - false - true - false - - - - - - - - - Host - ${KEYCLOAK_LOGIN_URL} - - - Connection - keep-alive - - - Upgrade-Insecure-Requests - 1 - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Accept - text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - navigate - - - Sec-Fetch-User - ?1 - - - Sec-Fetch-Dest - document - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - sec-ch-ua-mobile - ?0 - - - sec-ch-ua-platform - "Windows" - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - Cookie - AUTH_SESSION_ID=33769057-e4e2-49e9-821b-bab26d4e7507.ycloak-78b4c74bcf-gj9d6; AUTH_SESSION_ID_LEGACY=33769057-e4e2-49e9-821b-bab26d4e7507.ycloak-78b4c74bcf-gj9d6; KEYCLOAK_IDENTITY=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI1ZjExNjBiNS03Y2RjLTQ5NGQtYmFkOS0yZGRkNjU3MDU5Y2UifQ.eyJleHAiOjE2OTg3MzE3MzQsImlhdCI6MTY5ODY5NTczNCwianRpIjoiNzY3ZDEzMGEtMzczMC00NDdhLWEzNTUtNjhhNDhiMjgzZTI3IiwiaXNzIjoiaHR0cHM6Ly90ZXN0LmxvZ2lucHJveHkuZ292LmJjLmNhL2F1dGgvcmVhbG1zL2JjZWlkYm90aCIsInN1YiI6ImQ3M2FiN2IwLWUyMmEtNDg0NC04Yzc3LWU3YTQ2ODQyOTNmZCIsInR5cCI6IlNlcmlhbGl6ZWQtSUQiLCJzZXNzaW9uX3N0YXRlIjoiMzM3NjkwNTctZTRlMi00OWU5LTgyMWItYmFiMjZkNGU3NTA3Iiwic2lkIjoiMzM3NjkwNTctZTRlMi00OWU5LTgyMWItYmFiMjZkNGU3NTA3Iiwic3RhdGVfY2hlY2tlciI6Ik9SWEI4amY3Q3hPUWhzTUNhWU5nMHF2WHNzZG52cnlxUHFjMnFpUkthZncifQ.1kpL3Qpg4pyqSLBE0iDz7WZ0fdGzCCf6RCiN6HvFWqE; KEYCLOAK_IDENTITY_LEGACY=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI1ZjExNjBiNS03Y2RjLTQ5NGQtYmFkOS0yZGRkNjU3MDU5Y2UifQ.eyJleHAiOjE2OTg3MzE3MzQsImlhdCI6MTY5ODY5NTczNCwianRpIjoiNzY3ZDEzMGEtMzczMC00NDdhLWEzNTUtNjhhNDhiMjgzZTI3IiwiaXNzIjoiaHR0cHM6Ly90ZXN0LmxvZ2lucHJveHkuZ292LmJjLmNhL2F1dGgvcmVhbG1zL2JjZWlkYm90aCIsInN1YiI6ImQ3M2FiN2IwLWUyMmEtNDg0NC04Yzc3LWU3YTQ2ODQyOTNmZCIsInR5cCI6IlNlcmlhbGl6ZWQtSUQiLCJzZXNzaW9uX3N0YXRlIjoiMzM3NjkwNTctZTRlMi00OWU5LTgyMWItYmFiMjZkNGU3NTA3Iiwic2lkIjoiMzM3NjkwNTctZTRlMi00OWU5LTgyMWItYmFiMjZkNGU3NTA3Iiwic3RhdGVfY2hlY2tlciI6Ik9SWEI4amY3Q3hPUWhzTUNhWU5nMHF2WHNzZG52cnlxUHFjMnFpUkthZncifQ.1kpL3Qpg4pyqSLBE0iDz7WZ0fdGzCCf6RCiN6HvFWqE; KEYCLOAK_SESSION=bceidboth/d73ab7b0-e22a-4844-8c77-e7a4684293fd/33769057-e4e2-49e9-821b-bab26d4e7507; KEYCLOAK_SESSION_LEGACY=bceidboth/d73ab7b0-e22a-4844-8c77-e7a4684293fd/33769057-e4e2-49e9-821b-bab26d4e7507; _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; FAILREASON=0; SMSESSION=LOGGEDOFF - - - - - - - - - - false - - = - true - - - - - - - - https://${KEYCLOAK_LOGIN_URL}/auth/realms/bceidboth/broker/bceidboth/login?session_code=oRr0p7JZ9oL7vptnFPfNKhf_nrB8DND1rBojsNPjot0&client_id=standard-realm&tab_id=k5Vw5BDlfVQ - GET - true - false - true - false - - - - - - - - - Host - ${KEYCLOAK_LOGIN_URL} - - - Connection - keep-alive - - - Upgrade-Insecure-Requests - 1 - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Accept - text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - navigate - - - Sec-Fetch-User - ?1 - - - Sec-Fetch-Dest - document - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - sec-ch-ua-mobile - ?0 - - - sec-ch-ua-platform - "Windows" - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - Cookie - AUTH_SESSION_ID=f26f78a0-28d2-40b4-9e57-b83fa590e32e.ycloak-78b4c74bcf-vtmwp; AUTH_SESSION_ID_LEGACY=f26f78a0-28d2-40b4-9e57-b83fa590e32e.ycloak-78b4c74bcf-vtmwp; KC_RESTART=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI1ZjExNjBiNS03Y2RjLTQ5NGQtYmFkOS0yZGRkNjU3MDU5Y2UifQ.eyJjaWQiOiJzdGFuZGFyZC1yZWFsbSIsInB0eSI6Im9wZW5pZC1jb25uZWN0IiwicnVyaSI6Imh0dHBzOi8vdGVzdC5sb2dpbnByb3h5Lmdvdi5iYy5jYS9hdXRoL3JlYWxtcy9zdGFuZGFyZC9icm9rZXIvYmNlaWRib3RoL2VuZHBvaW50IiwiYWN0IjoiQVVUSEVOVElDQVRFIiwibm90ZXMiOnsic2NvcGUiOiJvcGVuaWQiLCJpc3MiOiJodHRwczovL3Rlc3QubG9naW5wcm94eS5nb3YuYmMuY2EvYXV0aC9yZWFsbXMvYmNlaWRib3RoIiwicmVzcG9uc2VfdHlwZSI6ImNvZGUiLCJyZWRpcmVjdF91cmkiOiJodHRwczovL3Rlc3QubG9naW5wcm94eS5nb3YuYmMuY2EvYXV0aC9yZWFsbXMvc3RhbmRhcmQvYnJva2VyL2JjZWlkYm90aC9lbmRwb2ludCIsInN0YXRlIjoiSnZJeWZtb2owQXptQlpXdzBaUzhsQm1oTUpYZDdsQV91QVI4SlF2TE5sRS5LQXhZWGpvYXRHYy5vbi1yb3V0ZS1iYy1kaXJlY3QtNDU5OCIsIm5vbmNlIjoiMXNLV21kWjBhVjZRSXNjYjY1THJtZyJ9fQ.08S_Qi57kTkuLj_eH5VElw2zeuH4AVhfOUois5IUzEI; _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; FAILREASON=0; SMSESSION=LOGGEDOFF - - - - - - - - - - false - - = - true - - - - - - - - https://${SITEMINDER_URL}/clp-cgi/capBceid/logon.cgi?flags=0101:0,7&TYPE=33554433&REALMOID=06-b02c7ed2-895e-4953-bd03-8008c64ec906&GUID=&SMAUTHREASON=0&METHOD=GET&SMAGENTNAME=$SM$Lk6VtkyHw8x3zQIIsMiOiEXYFJF%2fJzjVT7eioCjxBjJck5VMlbxxrR%2bLZSo%2flIBX&TARGET=$SM$HTTPS%3a%2f%2fsfstest7%2egov%2ebc%2eca%2faffwebservices%2fredirectjsp%2ftestkeycloak-basicbusinessbceid%2fredirect%2ejsp%3fSMPORTALURL%3dhttps$%3A$%2F$%2Fsfstest7%2egov%2ebc%2eca$%2Faffwebservices$%2Fpublic$%2Fsaml2sso%26SAMLTRANSACTIONID%3dc9f189ad-7324de1b-2e045e1a-e8bcf162-a78af00c-c5 - GET - true - false - true - false - - - - - - - - - Host - ${SITEMINDER_URL} - - - Connection - keep-alive - - - Cache-Control - max-age=0 - - - Upgrade-Insecure-Requests - 1 - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Accept - text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - navigate - - - Sec-Fetch-Dest - document - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - sec-ch-ua-mobile - ?0 - - - sec-ch-ua-platform - "Windows" - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - Cookie - _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; Dummy1=DummyVal1; BCGOVFlags=0101%3A0%2C7; BCGOVCustom=NULL; BCGOVBrand=NULL; BCGOVBehavior=NULL; Dummy2=DummyVal2; preDummy1=DummyVal1; preDummy2=DummyVal2; preDummy3=DummyVal3; BCGOVDoNotShow=1; preDummy4=DummyVal4; FAILREASON=0; BCGOVTarget=HTTPS%3A%2F%2Fsfstest7.gov.bc.ca%2Faffwebservices%2Fredirectjsp%2Ftestkeycloak-basicbusinessbceid%2Fredirect.jsp%3FSMPORTALURL%3Dhttps%253A%252F%252Fsfstest7.gov.bc.ca%252Faffwebservices%252Fpublic%252Fsaml2sso%26SAMLTRANSACTIONID%3Df7917115-57286b4a-df9cf6ff-b50e2f11-c566ac5a-f6; BCGOVclptryno=0; clp001=0; SMSESSION=LOGGEDOFF; SMFED_OLD_SESSION=""; SMFED_OLD_IDENTITY=""; GUID=1:26feb557-62af2c8c-4ef3a8d7-2e2277be-6a76895c-697 - - - - - - - true - - - - false - instance=instance_capBceid&user=ORBCTST3&password=orbcTST%2B2023 - = - - - - - - - - https://${SITEMINDER_URL}/clp-cgi/preLogon.cgi - POST - true - false - true - false - - - - - - - - - Host - ${SITEMINDER_URL} - - - Connection - keep-alive - - - Content-Length - 64 - - - Cache-Control - max-age=0 - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - sec-ch-ua-mobile - ?0 - - - sec-ch-ua-platform - "Windows" - - - Upgrade-Insecure-Requests - 1 - - - Origin - https://${SITEMINDER_URL} - - - Content-Type - application/x-www-form-urlencoded - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Accept - text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 - - - Sec-Fetch-Site - same-origin - - - Sec-Fetch-Mode - navigate - - - Sec-Fetch-User - ?1 - - - Sec-Fetch-Dest - document - - - Referer - https://${SITEMINDER_URL}/clp-cgi/capBceid/logon.cgi?flags=0101:0,7&TYPE=33554433&REALMOID=06-b02c7ed2-895e-4953-bd03-8008c64ec906&GUID=&SMAUTHREASON=0&METHOD=GET&SMAGENTNAME=$SM$Lk6VtkyHw8x3zQIIsMiOiEXYFJF%2fJzjVT7eioCjxBjJck5VMlbxxrR%2bLZSo%2flIBX&TARGET=$SM$HTTPS%3a%2f%2fsfstest7%2egov%2ebc%2eca%2faffwebservices%2fredirectjsp%2ftestkeycloak-basicbusinessbceid%2fredirect%2ejsp%3fSMPORTALURL%3dhttps$%3A$%2F$%2Fsfstest7%2egov%2ebc%2eca$%2Faffwebservices$%2Fpublic$%2Fsaml2sso%26SAMLTRANSACTIONID%3dc9f189ad-7324de1b-2e045e1a-e8bcf162-a78af00c-c5 - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - Cookie - _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; Dummy1=DummyVal1; BCGOVFlags=0101%3A0%2C7; BCGOVCustom=NULL; BCGOVBrand=NULL; BCGOVBehavior=NULL; Dummy2=DummyVal2; preDummy1=DummyVal1; preDummy2=DummyVal2; preDummy3=DummyVal3; BCGOVDoNotShow=1; preDummy4=DummyVal4; FAILREASON=0; clp001=0; SMSESSION=LOGGEDOFF; SMFED_OLD_SESSION=""; SMFED_OLD_IDENTITY=""; GUID=1:26feb557-62af2c8c-4ef3a8d7-2e2277be-6a76895c-697; BCGOVTarget=HTTPS%3A%2F%2Fsfstest7.gov.bc.ca%2Faffwebservices%2Fredirectjsp%2Ftestkeycloak-basicbusinessbceid%2Fredirect.jsp%3FSMPORTALURL%3Dhttps%253A%252F%252Fsfstest7.gov.bc.ca%252Faffwebservices%252Fpublic%252Fsaml2sso%26SAMLTRANSACTIONID%3Dc9f189ad-7324de1b-2e045e1a-e8bcf162-a78af00c-c5; BCGOVclptryno=1 - - - - - - - true - - - - false - SMENC=ISO-8859-1&SMLOCALE=US-EN&target=%2Fclp-cgi%2Fcap07%2Fprivate%2FpostLogon.cgi&smauthreason=0&smagentname=&user=ORBCTST3&password=orbcTST%2B2023 - = - - - - - - - - https://${SITEMINDER_URL}/clp-cgi/cap07/logon.fcc - POST - true - false - true - false - - - - - - - - - Host - ${SITEMINDER_URL} - - - Connection - keep-alive - - - Content-Length - 149 - - - Cache-Control - max-age=0 - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - sec-ch-ua-mobile - ?0 - - - sec-ch-ua-platform - "Windows" - - - Upgrade-Insecure-Requests - 1 - - - Origin - https://${SITEMINDER_URL} - - - Content-Type - application/x-www-form-urlencoded - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Accept - text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 - - - Sec-Fetch-Site - same-origin - - - Sec-Fetch-Mode - navigate - - - Sec-Fetch-Dest - document - - - Referer - https://${SITEMINDER_URL}/clp-cgi/preLogon.cgi - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - Cookie - _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; Dummy1=DummyVal1; BCGOVFlags=0101%3A0%2C7; BCGOVCustom=NULL; BCGOVBrand=NULL; BCGOVBehavior=NULL; Dummy2=DummyVal2; preDummy1=DummyVal1; preDummy2=DummyVal2; preDummy3=DummyVal3; BCGOVDoNotShow=1; preDummy4=DummyVal4; FAILREASON=0; SMSESSION=LOGGEDOFF; SMFED_OLD_SESSION=""; SMFED_OLD_IDENTITY=""; GUID=1:26feb557-62af2c8c-4ef3a8d7-2e2277be-6a76895c-697; BCGOVTarget=HTTPS%3A%2F%2Fsfstest7.gov.bc.ca%2Faffwebservices%2Fredirectjsp%2Ftestkeycloak-basicbusinessbceid%2Fredirect.jsp%3FSMPORTALURL%3Dhttps%253A%252F%252Fsfstest7.gov.bc.ca%252Faffwebservices%252Fpublic%252Fsaml2sso%26SAMLTRANSACTIONID%3Dc9f189ad-7324de1b-2e045e1a-e8bcf162-a78af00c-c5; BCGOVclptryno=1; clp001=Salted__%8E%F5%14%93%F3.%C8%8C%C2%B3%84%8B%8EC%E0%88%AAK%01%C77%B6%C4g%C3%D2%3ELS%06%7CdJp%18%E9TJ%8A%D3a%A9%AD%3C%5E%DBZ%D7 - - - - - - - - - - false - - = - - - - - - - - https://${SITEMINDER_URL}/clp-cgi/cap07/private/postLogon.cgi - GET - true - false - true - false - - - - - - - - - Host - ${SITEMINDER_URL} - - - Connection - keep-alive - - - Cache-Control - max-age=0 - - - Upgrade-Insecure-Requests - 1 - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Accept - text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 - - - Sec-Fetch-Site - same-origin - - - Sec-Fetch-Mode - navigate - - - Sec-Fetch-Dest - document - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - sec-ch-ua-mobile - ?0 - - - sec-ch-ua-platform - "Windows" - - - Referer - https://${SITEMINDER_URL}/clp-cgi/preLogon.cgi - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - Cookie - _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; Dummy1=DummyVal1; BCGOVFlags=0101%3A0%2C7; BCGOVCustom=NULL; BCGOVBrand=NULL; BCGOVBehavior=NULL; Dummy2=DummyVal2; preDummy1=DummyVal1; preDummy2=DummyVal2; preDummy3=DummyVal3; BCGOVDoNotShow=1; preDummy4=DummyVal4; FAILREASON=0; SMSESSION=LOGGEDOFF; SMFED_OLD_SESSION=""; SMFED_OLD_IDENTITY=""; GUID=1:26feb557-62af2c8c-4ef3a8d7-2e2277be-6a76895c-697; BCGOVTarget=HTTPS%3A%2F%2Fsfstest7.gov.bc.ca%2Faffwebservices%2Fredirectjsp%2Ftestkeycloak-basicbusinessbceid%2Fredirect.jsp%3FSMPORTALURL%3Dhttps%253A%252F%252Fsfstest7.gov.bc.ca%252Faffwebservices%252Fpublic%252Fsaml2sso%26SAMLTRANSACTIONID%3Dc9f189ad-7324de1b-2e045e1a-e8bcf162-a78af00c-c5; BCGOVclptryno=1; clp001=Salted__%8E%F5%14%93%F3.%C8%8C%C2%B3%84%8B%8EC%E0%88%AAK%01%C77%B6%C4g%C3%D2%3ELS%06%7CdJp%18%E9TJ%8A%D3a%A9%AD%3C%5E%DBZ%D7; FORMCRED=2ZS4S2F4tb41FWGyAD293ZV3eiMsCRYZ+ktOitYzjWY/fG/2BFtCWHSnbkvgJfBEm8aTuwAg3nMfeG0h8ahL0C1Q+SZp1d30x/imUNpQkjqP7yK+smpXGQMNWzNb15A+UXcYa0yUQLQ5rFoH720FIoiqZ4Nmikk7a67vktQxd8rpIduHeZJ7tAYb/b+pXPha - - - - - - - true - - - - false - RelayState=pkQKGHDSoVdRPpUZ1XHJWrVAUBtEl2EOcIu2bUhv0V0.k5Vw5BDlfVQ.standard-realm&SAMLResponse=PG5zNTpSZXNwb25zZSB4bWxuczpuczU9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpwcm90b2NvbCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDkveG1sZW5jMTEjIiB4bWxuczpuczI9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphc3NlcnRpb24iIHhtbG5zOm5zMz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyIgeG1sbnM6bnM0PSJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzA0L3htbGVuYyMiIERlc3RpbmF0aW9uPSJodHRwczovL3Rlc3QubG9naW5wcm94eS5nb3YuYmMuY2EvYXV0aC9yZWFsbXMvYmNlaWRib3RoL2Jyb2tlci9iY2VpZGJvdGgvZW5kcG9pbnQiIElEPSJfMzU0NWZlNjJmOGY3OThhNTk1ZWNlM2I2YzYxM2RmNmU5ZWFkIiBJblJlc3BvbnNlVG89IklEX2FhYTM1M2Q0LTdlNmMtNDQxNS05N2FkLWI2NmEzM2FhOTBkYyIgSXNzdWVJbnN0YW50PSIyMDIzLTEwLTMwVDE5OjU2OjM3LjE4MFoiIFZlcnNpb249IjIuMCI%2BDQogICAgPG5zMjpJc3N1ZXIgRm9ybWF0PSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6bmFtZWlkLWZvcm1hdDplbnRpdHkiPmh0dHBzOi8vdGVzdC5sb2dpbnByb3h5Lmdvdi5iYy5jYS9hdXRoL3JlYWxtcy9fYmNlaWRiYXNpY2J1c2luZXNzMS88L25zMjpJc3N1ZXI%2BDQogICAgPG5zNTpTdGF0dXM%2BDQogICAgICAgIDxuczU6U3RhdHVzQ29kZSBWYWx1ZT0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOnN0YXR1czpTdWNjZXNzIi8%2BDQogICAgPC9uczU6U3RhdHVzPg0KICAgIDxuczI6QXNzZXJ0aW9uIElEPSJfZWFmZTRjYWQ5MjU0MTEyZjQ5YTcxMDI1MGM3YjVhNDVjYmI2IiBJc3N1ZUluc3RhbnQ9IjIwMjMtMTAtMzBUMTk6NTY6MzcuMTgwWiIgVmVyc2lvbj0iMi4wIiB4bWxuczpuczI9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphc3NlcnRpb24iPg0KICAgICAgICA8bnMyOklzc3VlciBGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpuYW1laWQtZm9ybWF0OmVudGl0eSI%2BaHR0cHM6Ly90ZXN0LmxvZ2lucHJveHkuZ292LmJjLmNhL2F1dGgvcmVhbG1zL19iY2VpZGJhc2ljYnVzaW5lc3MxLzwvbnMyOklzc3Vlcj48ZHM6U2lnbmF0dXJlIHhtbG5zOmRzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIj48ZHM6U2lnbmVkSW5mbz48ZHM6Q2Fub25pY2FsaXphdGlvbk1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvMTAveG1sLWV4Yy1jMTRuIyIvPjxkczpTaWduYXR1cmVNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzA0L3htbGRzaWctbW9yZSNyc2Etc2hhMjU2Ii8%2BPGRzOlJlZmVyZW5jZSBVUkk9IiNfZWFmZTRjYWQ5MjU0MTEyZjQ5YTcxMDI1MGM3YjVhNDVjYmI2Ij48ZHM6VHJhbnNmb3Jtcz48ZHM6VHJhbnNmb3JtIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI2VudmVsb3BlZC1zaWduYXR1cmUiLz48ZHM6VHJhbnNmb3JtIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS8xMC94bWwtZXhjLWMxNG4jIi8%2BPC9kczpUcmFuc2Zvcm1zPjxkczpEaWdlc3RNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzA0L3htbGVuYyNzaGEyNTYiLz48ZHM6RGlnZXN0VmFsdWU%2BS0c3SWRyMko3ODNGVGFkNkVZM0hHUklyRFpnUXU1TmdOQ1JBRU1vcERkYz08L2RzOkRpZ2VzdFZhbHVlPjwvZHM6UmVmZXJlbmNlPjwvZHM6U2lnbmVkSW5mbz48ZHM6U2lnbmF0dXJlVmFsdWU%2BbHJlNnpwalpyUEpKZmVqYStkUHN3cUhlVDN6a3VkNjA4emppZE4vWlBRMjdmSW56aHFWQ2lreDhHcld4V29jSWM4ekhHb1cxZmJqTXlBSkIwNnRHS2pXdzBXMWExTlIyL2VlVGQ1MFY1RnF4NndIb001NFVmYUkvY0N6dDdsMUNUQ2lHZzB6UkVLZjRDK3RxcWJaQ3QyRlFCQ20vd0xaNHRrdXVsZUh4WTZqdGJxWXBlbmpvSzQ2TGlocE1CejIvczBDRmQ3c1BxVjF4bHJpWXVtd1dtSlV1b0o1d0M1L2ZMZ3djTUlmSVMwd29SZmQzclBTN1pBWk5vWXExVVpWQ2xmemZMZ1hNc3JsM2k2S0F3SS80N01pSVpzeGNaaFd1Q3dMTFdFSXdzRWQzWlNLZFhXUTF1U0RrSGlIUGIrcXFmSTJQRGJwK2l1bHFDdlo2S3BCVzdnPT08L2RzOlNpZ25hdHVyZVZhbHVlPjxkczpLZXlJbmZvIHhtbG5zOmRzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIj48ZHM6WDUwOURhdGE%2BPGRzOlg1MDlDZXJ0aWZpY2F0ZT5NSUlFQ3pDQ0F2TUNDUUNkb1dONFh0VUk2VEFOQmdrcWhraUc5dzBCQVFzRkFEQ0J5akVMTUFrR0ExVUVCaE1DUTBFeEdUQVhCZ05WQkFnVEVFSnlhWFJwYzJnZ1EyOXNkVzFpYVdFeEVUQVBCZ05WQkFjVENGWnBZM1J2Y21saE1UY3dOUVlEVlFRS0V5NUhiM1psY201dFpXNTBJRzltSUhSb1pTQlFjbTkyYVc1alpTQnZaaUJDY21sMGFYTm9JRU52YkhWdFltbGhNUTh3RFFZRFZRUUxFd1pUUmxNdFEwRXhJakFnQmdOVkJBTVRHVk5HVXlCRFpYSjBhV1pwWTJGMFpTQkJkWFJvYjNKcGRIa3hIekFkQmdrcWhraUc5dzBCQ1FFV0VGZFVVMWRCVFVCbmIzWXVZbU11WTJFd0hoY05NVE13TkRBMU1qSTFOalUzV2hjTk16TXdOREExTWpJMU5qVTNXakNCd3pFTE1Ba0dBMVVFQmhNQ1EwRXhHVEFYQmdOVkJBZ1RFRUp5YVhScGMyZ2dRMjlzZFcxaWFXRXhFVEFQQmdOVkJBY1RDRlpwWTNSdmNtbGhNVGN3TlFZRFZRUUtFeTVIYjNabGNtNXRaVzUwSUc5bUlIUm9aU0JRY205MmFXNWpaU0J2WmlCQ2NtbDBhWE5vSUVOdmJIVnRZbWxoTVF3d0NnWURWUVFMRXdOVFJsTXhIakFjQmdOVkJBTVRGWE5tY3kxelpuTjBaWE4wTG1kdmRpNWlZeTVqWVRFZk1CMEdDU3FHU0liM0RRRUpBUllRVjFSVFYwRk5RR2R2ZGk1aVl5NWpZVENDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFKdzVFMDQ1amxKK3NiU2dOZmt2eUpBMysyN0tSQm1BbHErTVVSb1IzT1NpV2MyME1XZHQ1cEt4ZFJVcTJmWXhyUWp0cnRQdUdxa2tFR2FlSTBpTlp3UkluYnk2SHU2dWJDd2YxUTdmVGxXNzhscytDak5rWU5VQzMvd3VDM21uMVFuZzhVMGxkUTd0UVU0Y1BPcXdMSXZTaUpkaUpacm1GOFJEcHBvZFljSGhiaWo3N3Q2dGlIVkN4UVlncXhOY3V0M2d3bnhWcjI0MTZ5V0hYVnFxcGNjS0xUaUkvSm9lQ2I1b0kyVVVDcmRldnlXZDRINXFOWmx5NGhMNVBCQ1lZNFR1cFVheWpoYldmeEpLNFVXY0R2N09PYSt1eHE0a1luR2V4RHBxQ2JXNmJ2Y0hiazQ3UDVSQVpJdmd2bkdvQmdTZm9oMzd6eFEvRnA2VkU0aVdBdWNDQXdFQUFUQU5CZ2txaGtpRzl3MEJBUXNGQUFPQ0FRRUFiZGtqUTl1SHB2ZGtTZUlHT25meHU0Vm5mM2pHTzR5bzgrQnJub0dhTEM4aTJDV21Wb2RpOUdPdTNIM2pyR3ZzU296N242QzJBK3ZJdkR4dkE3dHdqd0xBcXVaVlFKbkJDcE1LbXdsUENBQ0F3WitFbGI0cjJxTW14YTJGbTBJZVl6M3gyQldZT0FUdGljODFmRnpoSjhRa1dCdXdiOStkSiswbC9HR1FmOXBPMnFpSXFVRWQyb0lVVkR4cVdSWXpoUGV6ZWpwZlZqQnNUUFhZNXhRaGRCVUtITXIwWnBTVTlrTW9KemNNMW42bEpIN3BGSFpCVUtONzkyaG9FNTVPbEszTFFMVW9oKzNXNEROL1lWS2tEczZrSHI0b0w2dXo5ajJXODRIVVBYNURMbUZGaUorTHBTMDUyVkJ0WWNoangyQnQwRlBzSEpKNEMwRjByNUc0b3c9PTwvZHM6WDUwOUNlcnRpZmljYXRlPjwvZHM6WDUwOURhdGE%2BPC9kczpLZXlJbmZvPjwvZHM6U2lnbmF0dXJlPg0KICAgICAgICA8bnMyOlN1YmplY3Q%2BDQogICAgICAgICAgICA8bnMyOk5hbWVJRCBGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpuYW1laWQtZm9ybWF0OnBlcnNpc3RlbnQiPkE5RUQyQzU3NDJEQzQ1NTk5ODY3MkNDMkExMTgxNzRCPC9uczI6TmFtZUlEPg0KICAgICAgICAgICAgPG5zMjpTdWJqZWN0Q29uZmlybWF0aW9uIE1ldGhvZD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmNtOmJlYXJlciI%2BDQogICAgICAgICAgICAgICAgPG5zMjpTdWJqZWN0Q29uZmlybWF0aW9uRGF0YSBJblJlc3BvbnNlVG89IklEX2FhYTM1M2Q0LTdlNmMtNDQxNS05N2FkLWI2NmEzM2FhOTBkYyIgTm90T25PckFmdGVyPSIyMDIzLTEwLTMwVDE5OjU4OjA3LjE0OFoiIFJlY2lwaWVudD0iaHR0cHM6Ly90ZXN0LmxvZ2lucHJveHkuZ292LmJjLmNhL2F1dGgvcmVhbG1zL2JjZWlkYm90aC9icm9rZXIvYmNlaWRib3RoL2VuZHBvaW50Ii8%2BDQogICAgICAgICAgICA8L25zMjpTdWJqZWN0Q29uZmlybWF0aW9uPg0KICAgICAgICA8L25zMjpTdWJqZWN0Pg0KICAgICAgICA8bnMyOkNvbmRpdGlvbnMgTm90QmVmb3JlPSIyMDIzLTEwLTMwVDE5OjU2OjA3LjE0OFoiIE5vdE9uT3JBZnRlcj0iMjAyMy0xMC0zMFQxOTo1ODowNy4xNDhaIj4NCiAgICAgICAgICAgIDxuczI6QXVkaWVuY2VSZXN0cmljdGlvbj4NCiAgICAgICAgICAgICAgICA8bnMyOkF1ZGllbmNlPmh0dHBzOi8vdGVzdC5sb2dpbnByb3h5Lmdvdi5iYy5jYS9hdXRoL3JlYWxtcy9fYmNlaWRiYXNpY2J1c2luZXNzMS88L25zMjpBdWRpZW5jZT4NCiAgICAgICAgICAgIDwvbnMyOkF1ZGllbmNlUmVzdHJpY3Rpb24%2BDQogICAgICAgIDwvbnMyOkNvbmRpdGlvbnM%2BDQogICAgICAgIDxuczI6QXV0aG5TdGF0ZW1lbnQgQXV0aG5JbnN0YW50PSIyMDIzLTEwLTMwVDE5OjU2OjM1LjEzMloiIFNlc3Npb25JbmRleD0ibGdlQ1pvN01aRnpJaFFiU1dGcXg1SDJiK1U0PXlMMWRQUT09IiBTZXNzaW9uTm90T25PckFmdGVyPSIyMDIzLTEwLTMwVDE5OjU4OjA3LjEzMloiPg0KICAgICAgICAgICAgPG5zMjpBdXRobkNvbnRleHQ%2BDQogICAgICAgICAgICAgICAgPG5zMjpBdXRobkNvbnRleHRDbGFzc1JlZj51cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6YWM6Y2xhc3NlczpQYXNzd29yZDwvbnMyOkF1dGhuQ29udGV4dENsYXNzUmVmPg0KICAgICAgICAgICAgPC9uczI6QXV0aG5Db250ZXh0Pg0KICAgICAgICA8L25zMjpBdXRoblN0YXRlbWVudD4NCiAgICAgICAgPG5zMjpBdHRyaWJ1dGVTdGF0ZW1lbnQ%2BDQogICAgICAgICAgICA8bnMyOkF0dHJpYnV0ZSBOYW1lPSJiY2VpZF91c2VybmFtZSIgTmFtZUZvcm1hdD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmF0dHJuYW1lLWZvcm1hdDp1bnNwZWNpZmllZCI%2BDQogICAgICAgICAgICAgICAgPG5zMjpBdHRyaWJ1dGVWYWx1ZSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTp0eXBlPSJ4czpzdHJpbmciPk9SQkNUU1QzPC9uczI6QXR0cmlidXRlVmFsdWU%2BDQogICAgICAgICAgICA8L25zMjpBdHRyaWJ1dGU%2BDQogICAgICAgICAgICA8bnMyOkF0dHJpYnV0ZSBOYW1lPSJkaXNwbGF5X25hbWUiIE5hbWVGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphdHRybmFtZS1mb3JtYXQ6dW5zcGVjaWZpZWQiPg0KICAgICAgICAgICAgICAgIDxuczI6QXR0cmlidXRlVmFsdWUgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6dHlwZT0ieHM6c3RyaW5nIj5CcnlhbiBMYW5lPC9uczI6QXR0cmlidXRlVmFsdWU%2BDQogICAgICAgICAgICA8L25zMjpBdHRyaWJ1dGU%2BDQogICAgICAgICAgICA8bnMyOkF0dHJpYnV0ZSBOYW1lPSJiY2VpZF91c2VyX2d1aWQiIE5hbWVGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphdHRybmFtZS1mb3JtYXQ6dW5zcGVjaWZpZWQiPg0KICAgICAgICAgICAgICAgIDxuczI6QXR0cmlidXRlVmFsdWUgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6dHlwZT0ieHM6c3RyaW5nIj5BOUVEMkM1NzQyREM0NTU5OTg2NzJDQzJBMTE4MTc0QjwvbnMyOkF0dHJpYnV0ZVZhbHVlPg0KICAgICAgICAgICAgPC9uczI6QXR0cmlidXRlPg0KICAgICAgICAgICAgPG5zMjpBdHRyaWJ1dGUgTmFtZT0iZW1haWwiIE5hbWVGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphdHRybmFtZS1mb3JtYXQ6dW5zcGVjaWZpZWQiPg0KICAgICAgICAgICAgICAgIDxuczI6QXR0cmlidXRlVmFsdWUgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6dHlwZT0ieHM6c3RyaW5nIj5icnlhbi5sYW5lQGdvdi5iYy5jYTwvbnMyOkF0dHJpYnV0ZVZhbHVlPg0KICAgICAgICAgICAgPC9uczI6QXR0cmlidXRlPg0KICAgICAgICA8bnMyOkF0dHJpYnV0ZSBOYW1lPSJTTUdPVl9CVVNJTkVTU0dVSUQiIE5hbWVGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphdHRybmFtZS1mb3JtYXQ6dW5zcGVjaWZpZWQiPjxuczI6QXR0cmlidXRlVmFsdWU%2BRjQwMjNEQjNDMzBGNDg3QjlBRjVCMTRDOTU4OTg5Rjg8L25zMjpBdHRyaWJ1dGVWYWx1ZT48L25zMjpBdHRyaWJ1dGU%2BPG5zMjpBdHRyaWJ1dGUgTmFtZT0iU01HT1ZfQlVTSU5FU1NMRUdBTE5BTUUiIE5hbWVGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphdHRybmFtZS1mb3JtYXQ6dW5zcGVjaWZpZWQiPjxuczI6QXR0cmlidXRlVmFsdWU%2BU29uaWMgRGVsaXZlcnkgU2VydmljZXM8L25zMjpBdHRyaWJ1dGVWYWx1ZT48L25zMjpBdHRyaWJ1dGU%2BPC9uczI6QXR0cmlidXRlU3RhdGVtZW50Pg0KICAgIDwvbnMyOkFzc2VydGlvbj4NCjwvbnM1OlJlc3BvbnNlPg%3D%3D - = - - - - - - - - https://${KEYCLOAK_LOGIN_URL}/auth/realms/bceidboth/broker/bceidboth/endpoint - POST - true - false - true - false - - - - - - - - - Host - ${KEYCLOAK_LOGIN_URL} - - - Connection - keep-alive - - - Content-Length - 9217 - - - Cache-Control - max-age=0 - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - sec-ch-ua-mobile - ?0 - - - sec-ch-ua-platform - "Windows" - - - Upgrade-Insecure-Requests - 1 - - - Origin - https://sfstest7.gov.bc.ca - - - Content-Type - application/x-www-form-urlencoded - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Accept - text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - navigate - - - Sec-Fetch-Dest - document - - - Referer - https://sfstest7.gov.bc.ca/ - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - Cookie - AUTH_SESSION_ID=f26f78a0-28d2-40b4-9e57-b83fa590e32e.ycloak-78b4c74bcf-vtmwp; AUTH_SESSION_ID_LEGACY=f26f78a0-28d2-40b4-9e57-b83fa590e32e.ycloak-78b4c74bcf-vtmwp; KC_RESTART=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI1ZjExNjBiNS03Y2RjLTQ5NGQtYmFkOS0yZGRkNjU3MDU5Y2UifQ.eyJjaWQiOiJzdGFuZGFyZC1yZWFsbSIsInB0eSI6Im9wZW5pZC1jb25uZWN0IiwicnVyaSI6Imh0dHBzOi8vdGVzdC5sb2dpbnByb3h5Lmdvdi5iYy5jYS9hdXRoL3JlYWxtcy9zdGFuZGFyZC9icm9rZXIvYmNlaWRib3RoL2VuZHBvaW50IiwiYWN0IjoiQVVUSEVOVElDQVRFIiwibm90ZXMiOnsic2NvcGUiOiJvcGVuaWQiLCJpc3MiOiJodHRwczovL3Rlc3QubG9naW5wcm94eS5nb3YuYmMuY2EvYXV0aC9yZWFsbXMvYmNlaWRib3RoIiwicmVzcG9uc2VfdHlwZSI6ImNvZGUiLCJyZWRpcmVjdF91cmkiOiJodHRwczovL3Rlc3QubG9naW5wcm94eS5nb3YuYmMuY2EvYXV0aC9yZWFsbXMvc3RhbmRhcmQvYnJva2VyL2JjZWlkYm90aC9lbmRwb2ludCIsInN0YXRlIjoiSnZJeWZtb2owQXptQlpXdzBaUzhsQm1oTUpYZDdsQV91QVI4SlF2TE5sRS5LQXhZWGpvYXRHYy5vbi1yb3V0ZS1iYy1kaXJlY3QtNDU5OCIsIm5vbmNlIjoiMXNLV21kWjBhVjZRSXNjYjY1THJtZyJ9fQ.08S_Qi57kTkuLj_eH5VElw2zeuH4AVhfOUois5IUzEI; _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; FAILREASON=0; SMSESSION=Awk9KIrMNenX09Vl2cEMuy/VxV9CFVP4fsBzCp8Zo3AX2VsrDVWkOMVOdJyoY1Q1J9F8Vs8XFBtHTU29qS7+jlhEMK3f9j8tgudEVWHJq8LTizGhEj1cf8r7CX2QuxWMbdAHvK90hFnpocsL5xv2cAaFVdqhBKlIYkzwkY+r0YuH3Uh6DJVIhAhwjWeKfO6BAg5/jNFxQ31EPvzn4N7RxJK2bGyfAxzi6Cs6O7ieJ10MzcB8nWSIsO4ksfG8pzeGp9a+arl4maKnd9Je2L2FQohmiOjfGcrsezOgLgiWFl1B3+EL8ytArvtKhsFvr7WJsQuhYsQYzfY8shcfhNSltyqxLD422bDmU3NyZdhWY9313YG5I1U2vbO7zvXhxaCJYnpMrJR+inz8XsyqnGY1xu7AepY3pNd2wJH3twQJ42N6R2WlJVVN3oc3DvEHUbk85xrqHdwngd/FiMdEC2f5Kt51VYp8G/3R+sbFiy6Wt7wlZw2+/wI8EfxXs31HQ5q/RDUTXz6JMbzsR7EUOF+WkOrgi1nDugu13/O9hDnxPJnkzNGEfjt0xPxdhoDdl4vWdwRe1awBEn90SyJwc8+cFk1XACtvWoGwtPdf1xnHUwx5Ge1TqEd46xdjjlu+iTw2Xu5AsESUVVw81STsKA7vC8EBabQ+yXQHZlNFcFCKa1+AutNxfWHNQtnFK03kUCai4ZPJc/TQrhvf9DWjSyX+KknWdV6aQyz65KOpwtQWpd4ZlqAAKvf9vCQIBgk+YdsxFzAq6ySnLPcBLbFvP+Xyo5bcABg8IS9aJr6+05KT3ZOv49G1uYvz1ILaDED83D5NHF57ZswKR2911SevaqIO2i8NkZAJUMBpgroSejoJ1MxzpL/a7I26u6+p/08uMt/dT7vuo5OTTjayEtIlXy1IRXA/jU/uX/pKk1JrsZFhhwj7G5KEQpMAx+YvZUaaidqyfj3+fLb6+rsa8BukV8x0zfgUg20dm+Wu9XjDvyQHFP4Qt65CaUbhAKcVTgCChgTfSSdUJZIPPa5Yhzr7SmTuVGmYV/1cC4jGzNdSqr3Fq28fWukiEnRtqfZRXlOdA6xb - - - - - - - - - - false - - = - - - - - - - - https://${KEYCLOAK_LOGIN_URL}/auth/realms/standard/broker/bceidboth/endpoint?state=JvIyfmoj0AzmBZWw0ZS8lBmhMJXd7lA_uAR8JQvLNlE.KAxYXjoatGc.on-route-bc-direct-4598&session_state=f26f78a0-28d2-40b4-9e57-b83fa590e32e&code=c5719177-78e8-4d75-857a-0ef191c765d1.f26f78a0-28d2-40b4-9e57-b83fa590e32e.1123d85b-badf-4084-a3a6-b1c920ccb0c0 - GET - true - false - true - false - - - - - - - - - Host - ${KEYCLOAK_LOGIN_URL} - - - Connection - keep-alive - - - Cache-Control - max-age=0 - - - Upgrade-Insecure-Requests - 1 - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Accept - text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - navigate - - - Sec-Fetch-Dest - document - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - sec-ch-ua-mobile - ?0 - - - sec-ch-ua-platform - "Windows" - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - Cookie - AUTH_SESSION_ID=0e56ff7b-e277-400f-84f5-25801c43c829.ycloak-78b4c74bcf-kh476; AUTH_SESSION_ID_LEGACY=0e56ff7b-e277-400f-84f5-25801c43c829.ycloak-78b4c74bcf-kh476; KC_RESTART=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICIzMmI0MzNkNC02NjgwLTQxODMtOTc2Yy1kZDdjMTg0YjExMTQifQ.eyJjaWQiOiJvbi1yb3V0ZS1iYy1kaXJlY3QtNDU5OCIsInB0eSI6Im9wZW5pZC1jb25uZWN0IiwicnVyaSI6Imh0dHBzOi8vb25yb3V0ZWJjLXRlc3QtZnJvbnRlbmQuYXBwcy5zaWx2ZXIuZGV2b3BzLmdvdi5iYy5jYS8iLCJhY3QiOiJBVVRIRU5USUNBVEUiLCJub3RlcyI6eyJzY29wZSI6Im9wZW5pZCIsImlzcyI6Imh0dHBzOi8vdGVzdC5sb2dpbnByb3h5Lmdvdi5iYy5jYS9hdXRoL3JlYWxtcy9zdGFuZGFyZCIsInJlc3BvbnNlX3R5cGUiOiJjb2RlIiwiY29kZV9jaGFsbGVuZ2VfbWV0aG9kIjoiUzI1NiIsInJlZGlyZWN0X3VyaSI6Imh0dHBzOi8vb25yb3V0ZWJjLXRlc3QtZnJvbnRlbmQuYXBwcy5zaWx2ZXIuZGV2b3BzLmdvdi5iYy5jYS8iLCJzdGF0ZSI6IjdiZTBmNDk4ZGRmYTQ1ZTI4ZWU4ZjI0MTY0NzViYTQyIiwiY29kZV9jaGFsbGVuZ2UiOiJCNEpzelBjUzBIT1c3RUNUVFVVUkMxbXA2ejhhdDJiNkswbEQxdUtfMTFBIiwia2NfaWRwX2hpbnQiOiJiY2VpZGJvdGgiLCJyZXNwb25zZV9tb2RlIjoicXVlcnkifX0.2dLZTTjk8ZY0EFAaE88sAWQlfo7T17XcYLztnQwI_Yk; _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; FAILREASON=0; SMSESSION=Awk9KIrMNenX09Vl2cEMuy/VxV9CFVP4fsBzCp8Zo3AX2VsrDVWkOMVOdJyoY1Q1J9F8Vs8XFBtHTU29qS7+jlhEMK3f9j8tgudEVWHJq8LTizGhEj1cf8r7CX2QuxWMbdAHvK90hFnpocsL5xv2cAaFVdqhBKlIYkzwkY+r0YuH3Uh6DJVIhAhwjWeKfO6BAg5/jNFxQ31EPvzn4N7RxJK2bGyfAxzi6Cs6O7ieJ10MzcB8nWSIsO4ksfG8pzeGp9a+arl4maKnd9Je2L2FQohmiOjfGcrsezOgLgiWFl1B3+EL8ytArvtKhsFvr7WJsQuhYsQYzfY8shcfhNSltyqxLD422bDmU3NyZdhWY9313YG5I1U2vbO7zvXhxaCJYnpMrJR+inz8XsyqnGY1xu7AepY3pNd2wJH3twQJ42N6R2WlJVVN3oc3DvEHUbk85xrqHdwngd/FiMdEC2f5Kt51VYp8G/3R+sbFiy6Wt7wlZw2+/wI8EfxXs31HQ5q/RDUTXz6JMbzsR7EUOF+WkOrgi1nDugu13/O9hDnxPJnkzNGEfjt0xPxdhoDdl4vWdwRe1awBEn90SyJwc8+cFk1XACtvWoGwtPdf1xnHUwx5Ge1TqEd46xdjjlu+iTw2Xu5AsESUVVw81STsKA7vC8EBabQ+yXQHZlNFcFCKa1+AutNxfWHNQtnFK03kUCai4ZPJc/TQrhvf9DWjSyX+KknWdV6aQyz65KOpwtQWpd4ZlqAAKvf9vCQIBgk+YdsxFzAq6ySnLPcBLbFvP+Xyo5bcABg8IS9aJr6+05KT3ZOv49G1uYvz1ILaDED83D5NHF57ZswKR2911SevaqIO2i8NkZAJUMBpgroSejoJ1MxzpL/a7I26u6+p/08uMt/dT7vuo5OTTjayEtIlXy1IRXA/jU/uX/pKk1JrsZFhhwj7G5KEQpMAx+YvZUaaidqyfj3+fLb6+rsa8BukV8x0zfgUg20dm+Wu9XjDvyQHFP4Qt65CaUbhAKcVTgCChgTfSSdUJZIPPa5Yhzr7SmTuVGmYV/1cC4jGzNdSqr3Fq28fWukiEnRtqfZRXlOdA6xb - - - - - - - - - - false - - = - - - - - - - - https://${KEYCLOAK_LOGIN_URL}/auth/realms/standard/login-actions/post-broker-login?client_id=on-route-bc-direct-4598&tab_id=KAxYXjoatGc - GET - true - false - true - false - - - - - - - - - Host - ${KEYCLOAK_LOGIN_URL} - - - Connection - keep-alive - - - Cache-Control - max-age=0 - - - Upgrade-Insecure-Requests - 1 - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Accept - text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - navigate - - - Sec-Fetch-Dest - document - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - sec-ch-ua-mobile - ?0 - - - sec-ch-ua-platform - "Windows" - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - Cookie - AUTH_SESSION_ID=0e56ff7b-e277-400f-84f5-25801c43c829.ycloak-78b4c74bcf-kh476; AUTH_SESSION_ID_LEGACY=0e56ff7b-e277-400f-84f5-25801c43c829.ycloak-78b4c74bcf-kh476; KC_RESTART=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICIzMmI0MzNkNC02NjgwLTQxODMtOTc2Yy1kZDdjMTg0YjExMTQifQ.eyJjaWQiOiJvbi1yb3V0ZS1iYy1kaXJlY3QtNDU5OCIsInB0eSI6Im9wZW5pZC1jb25uZWN0IiwicnVyaSI6Imh0dHBzOi8vb25yb3V0ZWJjLXRlc3QtZnJvbnRlbmQuYXBwcy5zaWx2ZXIuZGV2b3BzLmdvdi5iYy5jYS8iLCJhY3QiOiJBVVRIRU5USUNBVEUiLCJub3RlcyI6eyJzY29wZSI6Im9wZW5pZCIsImlzcyI6Imh0dHBzOi8vdGVzdC5sb2dpbnByb3h5Lmdvdi5iYy5jYS9hdXRoL3JlYWxtcy9zdGFuZGFyZCIsInJlc3BvbnNlX3R5cGUiOiJjb2RlIiwiY29kZV9jaGFsbGVuZ2VfbWV0aG9kIjoiUzI1NiIsInJlZGlyZWN0X3VyaSI6Imh0dHBzOi8vb25yb3V0ZWJjLXRlc3QtZnJvbnRlbmQuYXBwcy5zaWx2ZXIuZGV2b3BzLmdvdi5iYy5jYS8iLCJzdGF0ZSI6IjdiZTBmNDk4ZGRmYTQ1ZTI4ZWU4ZjI0MTY0NzViYTQyIiwiY29kZV9jaGFsbGVuZ2UiOiJCNEpzelBjUzBIT1c3RUNUVFVVUkMxbXA2ejhhdDJiNkswbEQxdUtfMTFBIiwia2NfaWRwX2hpbnQiOiJiY2VpZGJvdGgiLCJyZXNwb25zZV9tb2RlIjoicXVlcnkifX0.2dLZTTjk8ZY0EFAaE88sAWQlfo7T17XcYLztnQwI_Yk; _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; FAILREASON=0; SMSESSION=Awk9KIrMNenX09Vl2cEMuy/VxV9CFVP4fsBzCp8Zo3AX2VsrDVWkOMVOdJyoY1Q1J9F8Vs8XFBtHTU29qS7+jlhEMK3f9j8tgudEVWHJq8LTizGhEj1cf8r7CX2QuxWMbdAHvK90hFnpocsL5xv2cAaFVdqhBKlIYkzwkY+r0YuH3Uh6DJVIhAhwjWeKfO6BAg5/jNFxQ31EPvzn4N7RxJK2bGyfAxzi6Cs6O7ieJ10MzcB8nWSIsO4ksfG8pzeGp9a+arl4maKnd9Je2L2FQohmiOjfGcrsezOgLgiWFl1B3+EL8ytArvtKhsFvr7WJsQuhYsQYzfY8shcfhNSltyqxLD422bDmU3NyZdhWY9313YG5I1U2vbO7zvXhxaCJYnpMrJR+inz8XsyqnGY1xu7AepY3pNd2wJH3twQJ42N6R2WlJVVN3oc3DvEHUbk85xrqHdwngd/FiMdEC2f5Kt51VYp8G/3R+sbFiy6Wt7wlZw2+/wI8EfxXs31HQ5q/RDUTXz6JMbzsR7EUOF+WkOrgi1nDugu13/O9hDnxPJnkzNGEfjt0xPxdhoDdl4vWdwRe1awBEn90SyJwc8+cFk1XACtvWoGwtPdf1xnHUwx5Ge1TqEd46xdjjlu+iTw2Xu5AsESUVVw81STsKA7vC8EBabQ+yXQHZlNFcFCKa1+AutNxfWHNQtnFK03kUCai4ZPJc/TQrhvf9DWjSyX+KknWdV6aQyz65KOpwtQWpd4ZlqAAKvf9vCQIBgk+YdsxFzAq6ySnLPcBLbFvP+Xyo5bcABg8IS9aJr6+05KT3ZOv49G1uYvz1ILaDED83D5NHF57ZswKR2911SevaqIO2i8NkZAJUMBpgroSejoJ1MxzpL/a7I26u6+p/08uMt/dT7vuo5OTTjayEtIlXy1IRXA/jU/uX/pKk1JrsZFhhwj7G5KEQpMAx+YvZUaaidqyfj3+fLb6+rsa8BukV8x0zfgUg20dm+Wu9XjDvyQHFP4Qt65CaUbhAKcVTgCChgTfSSdUJZIPPa5Yhzr7SmTuVGmYV/1cC4jGzNdSqr3Fq28fWukiEnRtqfZRXlOdA6xb - - - - - - - - - - false - - = - - - - - - - - https://${FRONTEND_API_URL}/?state=7be0f498ddfa45e28ee8f2416475ba42&session_state=0e56ff7b-e277-400f-84f5-25801c43c829&code=e1db6532-ce36-4aa5-845c-26c6d9f6e19f.0e56ff7b-e277-400f-84f5-25801c43c829.f462b30d-0893-4a2d-8169-3461d82c36eb - GET - true - false - true - false - - - - - - - - - Host - ${FRONTEND_API_URL} - - - Connection - keep-alive - - - Cache-Control - max-age=0 - - - Upgrade-Insecure-Requests - 1 - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Accept - text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - navigate - - - Sec-Fetch-Dest - document - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - sec-ch-ua-mobile - ?0 - - - sec-ch-ua-platform - "Windows" - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - Cookie - _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; FAILREASON=0; 9a75866e187615f9e3e688e8297548f9=1f5b60b83338df80ae3a11e1286008b7; SMSESSION=Awk9KIrMNenX09Vl2cEMuy/VxV9CFVP4fsBzCp8Zo3AX2VsrDVWkOMVOdJyoY1Q1J9F8Vs8XFBtHTU29qS7+jlhEMK3f9j8tgudEVWHJq8LTizGhEj1cf8r7CX2QuxWMbdAHvK90hFnpocsL5xv2cAaFVdqhBKlIYkzwkY+r0YuH3Uh6DJVIhAhwjWeKfO6BAg5/jNFxQ31EPvzn4N7RxJK2bGyfAxzi6Cs6O7ieJ10MzcB8nWSIsO4ksfG8pzeGp9a+arl4maKnd9Je2L2FQohmiOjfGcrsezOgLgiWFl1B3+EL8ytArvtKhsFvr7WJsQuhYsQYzfY8shcfhNSltyqxLD422bDmU3NyZdhWY9313YG5I1U2vbO7zvXhxaCJYnpMrJR+inz8XsyqnGY1xu7AepY3pNd2wJH3twQJ42N6R2WlJVVN3oc3DvEHUbk85xrqHdwngd/FiMdEC2f5Kt51VYp8G/3R+sbFiy6Wt7wlZw2+/wI8EfxXs31HQ5q/RDUTXz6JMbzsR7EUOF+WkOrgi1nDugu13/O9hDnxPJnkzNGEfjt0xPxdhoDdl4vWdwRe1awBEn90SyJwc8+cFk1XACtvWoGwtPdf1xnHUwx5Ge1TqEd46xdjjlu+iTw2Xu5AsESUVVw81STsKA7vC8EBabQ+yXQHZlNFcFCKa1+AutNxfWHNQtnFK03kUCai4ZPJc/TQrhvf9DWjSyX+KknWdV6aQyz65KOpwtQWpd4ZlqAAKvf9vCQIBgk+YdsxFzAq6ySnLPcBLbFvP+Xyo5bcABg8IS9aJr6+05KT3ZOv49G1uYvz1ILaDED83D5NHF57ZswKR2911SevaqIO2i8NkZAJUMBpgroSejoJ1MxzpL/a7I26u6+p/08uMt/dT7vuo5OTTjayEtIlXy1IRXA/jU/uX/pKk1JrsZFhhwj7G5KEQpMAx+YvZUaaidqyfj3+fLb6+rsa8BukV8x0zfgUg20dm+Wu9XjDvyQHFP4Qt65CaUbhAKcVTgCChgTfSSdUJZIPPa5Yhzr7SmTuVGmYV/1cC4jGzNdSqr3Fq28fWukiEnRtqfZRXlOdA6xb - - - - - - - - - - false - - = - - - - - - - - https://${KEYCLOAK_LOGIN_URL}/auth/realms/standard/.well-known/openid-configuration - GET - true - false - true - false - - - - - - - - - Host - ${KEYCLOAK_LOGIN_URL} - - - Connection - keep-alive - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - Accept - application/jwk-set+json, application/json - - - sec-ch-ua-mobile - ?0 - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - sec-ch-ua-platform - "Windows" - - - Origin - https://${FRONTEND_API_URL} - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - cors - - - Sec-Fetch-Dest - empty - - - Referer - https://${FRONTEND_API_URL}/ - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - - - - - - - - false - - = - - - - - - - - https://${VEHICLES_API_URL}/users/user-context - OPTIONS - true - false - true - false - - - - - - - - - Host - ${VEHICLES_API_URL} - - - Connection - keep-alive - - - Accept - */* - - - Access-Control-Request-Method - POST - - - Access-Control-Request-Headers - authorization,content-type - - - Origin - https://${FRONTEND_API_URL} - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Sec-Fetch-Mode - cors - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Dest - empty - - - Referer - https://${FRONTEND_API_URL}/ - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - - - - - true - - - - false - {} - = - - - - - - - - https://${VEHICLES_API_URL}/users/user-context - POST - true - false - true - false - - - - - - - - - Host - ${VEHICLES_API_URL} - - - Connection - keep-alive - - - Content-Length - 2 - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - Accept - application/json, text/plain, */* - - - Content-Type - application/json - - - sec-ch-ua-mobile - ?0 - - - Authorization - Bearer ${BCEID_BEARER_TOKEN} - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - sec-ch-ua-platform - "Windows" - - - Origin - https://${FRONTEND_API_URL} - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - cors - - - Sec-Fetch-Dest - empty - - - Referer - https://${FRONTEND_API_URL}/ - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - - - - - - - - false - - = - - - - - - - - https://${VEHICLES_API_URL}/users/roles?companyId=102 - OPTIONS - true - false - true - false - - - - - - - - - Host - ${VEHICLES_API_URL} - - - Connection - keep-alive - - - Accept - */* - - - Access-Control-Request-Method - GET - - - Access-Control-Request-Headers - authorization - - - Origin - https://${FRONTEND_API_URL} - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Sec-Fetch-Mode - cors - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Dest - empty - - - Referer - https://${FRONTEND_API_URL}/ - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - - - - - - - - false - - = - - - - - - - - https://${VEHICLES_API_URL}/users/roles?companyId=102 - GET - true - false - true - false - - - - - - - - - Host - ${VEHICLES_API_URL} - - - Connection - keep-alive - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - Accept - application/json, text/plain, */* - - - sec-ch-ua-mobile - ?0 - - - Authorization - Bearer ${BCEID_BEARER_TOKEN} - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - sec-ch-ua-platform - "Windows" - - - Origin - https://${FRONTEND_API_URL} - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - cors - - - Sec-Fetch-Dest - empty - - - Referer - https://${FRONTEND_API_URL}/ - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - If-None-Match - W/"1b4-DdYKGtaFZ5+U7pxjw6uu3owPOfo" - - - - - - - - - - false - - = - - - - - - - - https://${VEHICLES_API_URL}/permits/applications?status=IN_PROGRESS&companyId=102&userGUID=A9ED2C5742DC455998672CC2A118174B - OPTIONS - true - false - true - false - - - - - - - - - Host - ${VEHICLES_API_URL} - - - Connection - keep-alive - - - Accept - */* - - - Access-Control-Request-Method - GET - - - Access-Control-Request-Headers - authorization - - - Origin - https://${FRONTEND_API_URL} - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Sec-Fetch-Mode - cors - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Dest - empty - - - Referer - https://${FRONTEND_API_URL}/ - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - - - - - - - - false - - = - true - - - - - - - - https://${VEHICLES_API_URL}/permits/applications?status=IN_PROGRESS&companyId=102&userGUID=A9ED2C5742DC455998672CC2A118174B - GET - true - false - true - false - - - - - - - - - Host - ${VEHICLES_API_URL} - - - Connection - keep-alive - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - Accept - application/json, text/plain, */* - - - sec-ch-ua-mobile - ?0 - - - Authorization - Bearer ${BCEID_BEARER_TOKEN} - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - sec-ch-ua-platform - "Windows" - - - Origin - https://${FRONTEND_API_URL} - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - cors - - - Sec-Fetch-Dest - empty - - - Referer - https://${FRONTEND_API_URL}/ - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - If-None-Match - W/"17b2-OQs45yY+9rxT8oaE549bg+d9IqA" - - - - - - - - - - - - - - https://${VEHICLES_API_URL}/users/roles?companyId=102 - GET - true - false - true - false - - - - - - - - - Host - ${VEHICLES_API_URL} - - - Connection - keep-alive - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - Accept - application/json - - - sec-ch-ua-mobile - ?0 - - - Authorization - Bearer ${BCEID_BEARER_TOKEN} - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - sec-ch-ua-platform - "Windows" - - - Origin - https://${FRONTEND_API_URL} - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - cors - - - Sec-Fetch-Dest - empty - - - Referer - https://${FRONTEND_API_URL}/ - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - If-None-Match - W/"17b2-OQs45yY+9rxT8oaE549bg+d9IqA" - - - - - - - - Authorization - Bearer ${BCEID_BEARER_TOKEN} - - - Accept - */* - - - - - - - - - - false - - = - true - - - - - - - - https://${VEHICLES_API_URL}/permits/applications?companyId=102&status=IN_PROGRESS - GET - true - false - true - false - - - - - - - - - Host - ${VEHICLES_API_URL} - - - Connection - keep-alive - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - Accept - application/json - - - sec-ch-ua-mobile - ?0 - - - Authorization - Bearer ${BCEID_BEARER_TOKEN} - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - sec-ch-ua-platform - "Windows" - - - Origin - https://${FRONTEND_API_URL} - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - cors - - - Sec-Fetch-Dest - empty - - - Referer - https://${FRONTEND_API_URL}/ - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - If-None-Match - W/"17b2-OQs45yY+9rxT8oaE549bg+d9IqA" - - - - - - - - Authorization - Bearer ${BCEID_BEARER_TOKEN} - - - Accept - */* - - - - - - - - - - false - - = - true - - - - - - - - https://${VEHICLES_API_URL}/permits/applications/20?companyId=102 - GET - true - false - true - false - - - - - - - - - Host - ${VEHICLES_API_URL} - - - Connection - keep-alive - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - Accept - application/json - - - sec-ch-ua-mobile - ?0 - - - Authorization - Bearer ${BCEID_BEARER_TOKEN} - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - sec-ch-ua-platform - "Windows" - - - Origin - https://${FRONTEND_API_URL} - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - cors - - - Sec-Fetch-Dest - empty - - - Referer - https://${FRONTEND_API_URL}/ - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - If-None-Match - W/"17b2-OQs45yY+9rxT8oaE549bg+d9IqA" - - - - - - - - Authorization - Bearer ${BCEID_BEARER_TOKEN} - - - Accept - */* - - - - - - - true - - - - false - { - "companyId": 102, - "userGuid": "06267945F2EB4E31B585932F78B76269", - "permitType": "TROS", - "permitStatus": "IN_PROGRESS", - "permitApplicationOrigin": "ONLINE", - "permitData": {} -} - = - - - - - - - - https://${VEHICLES_API_URL}/permits/applications/A2-00010002-520-R00 - PUT - true - false - true - false - - - - - - - - - Authorization - Bearer ${BCEID_BEARER_TOKEN} - - - Accept - application/json - - - Content-Type - application/json - - - - - - - - Host - ${VEHICLES_API_URL} - - - Connection - keep-alive - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - Accept - application/json - - - sec-ch-ua-mobile - ?0 - - - Authorization - Bearer ${BCEID_BEARER_TOKEN} - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - sec-ch-ua-platform - "Windows" - - - Origin - https://${FRONTEND_API_URL} - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - cors - - - Sec-Fetch-Dest - empty - - - Referer - https://${FRONTEND_API_URL}/ - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - If-None-Match - W/"17b2-OQs45yY+9rxT8oaE549bg+d9IqA" - - - - - - - - - - false - - = - true - - - - - - - - https://${VEHICLES_API_URL}/permits/applications/20?companyId=102 - GET - true - false - true - false - - - - - - - - - Host - ${VEHICLES_API_URL} - - - Connection - keep-alive - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - Accept - application/json - - - sec-ch-ua-mobile - ?0 - - - Authorization - Bearer ${BCEID_BEARER_TOKEN} - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - sec-ch-ua-platform - "Windows" - - - Origin - https://${FRONTEND_API_URL} - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - cors - - - Sec-Fetch-Dest - empty - - - Referer - https://${FRONTEND_API_URL}/ - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - If-None-Match - W/"17b2-OQs45yY+9rxT8oaE549bg+d9IqA" - - - - - - - - Authorization - Bearer ${BCEID_BEARER_TOKEN} - - - Accept - */* - - - - - - - true - - - - false - { - "companyId": 102, - "userGuid": "06267945F2EB4E31B585932F78B76269", - "permitType": "TROS", - "permitStatus": "IN_PROGRESS", - "permitApplicationOrigin": "ONLINE", - "permitData": {} -} - = - - - - - - - - https://${VEHICLES_API_URL}/permits/applications/A2-00010002-520-R00 - PUT - true - false - true - false - - - - - - - - - Authorization - Bearer ${BCEID_BEARER_TOKEN} - - - Accept - application/json - - - Content-Type - application/json - - - - - - - - Host - ${VEHICLES_API_URL} - - - Connection - keep-alive - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - Accept - application/json - - - sec-ch-ua-mobile - ?0 - - - Authorization - Bearer ${BCEID_BEARER_TOKEN} - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - sec-ch-ua-platform - "Windows" - - - Origin - https://${FRONTEND_API_URL} - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - cors - - - Sec-Fetch-Dest - empty - - - Referer - https://${FRONTEND_API_URL}/ - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - If-None-Match - W/"17b2-OQs45yY+9rxT8oaE549bg+d9IqA" - - - - - - - + + false + true + C:\Users\BRWANG\Software\chromedriver-win64\chromedriver-win64\chromedriver.exe + false + false + true + + + SYSTEM + + + 8080 + true + + 8080 + true + + 8080 + true + + 8080 + localhost + + + + continue false 1 1 - ${__P(rampup,300)} - 1365261073000 - 1365261073000 - true - ${__P(duration,3000)} + 1 + false + true - - ${__P(Delay,10000)} - + + import org.openqa.selenium.By +import org.openqa.selenium.support.ui.ExpectedConditions +import org.openqa.selenium.support.ui.WebDriverWait +import org.openqa.selenium.WebElement + +WDS.sampleResult.sampleStart() +def frontendUrl = WDS.vars.get("FRONTEND_URL") +WDS.browser.get(frontendUrl); +Thread.sleep(5000) + + +def loginButton = WDS.browser.findElement(By.id('login-bceid')) +if (loginButton != null) { + loginButton.click() + WDS.log.info("Clicked on the login-bceid button") +} else { + WDS.log.info("Button with id 'login-bceid' not found") +} + +Thread.sleep(10000) +def user = WDS.browser.findElement(By.id('user')) +def password = WDS.browser.findElement(By.id('password')) + +def userValue = WDS.vars.get("USER") +def passwordValue = WDS.vars.get("PASSWORD") +user.sendKeys(userValue) +password.sendKeys(passwordValue) +Thread.sleep(5000) + +def submitButton = WDS.browser.findElement(By.name('btnSubmit')) +if (submitButton != null) { + submitButton.click() +} else { + WDS.log.info('Submit button with name="btnSubmit" not found') +} +Thread.sleep(10000) + +// start a new application +def newApplicationUrl = WDS.vars.get("NEW_APPLICATION_URL") +WDS.browser.get(newApplicationUrl); +Thread.sleep(5000) + +def selectedVehicle = WDS.browser.findElement(By.id('application-select-vehicle')) +selectedVehicle.sendKeys("MCL36") +Thread.sleep(5000) +def vin = WDS.browser.findElement(By.cssSelector('[name="permitData.vehicleDetails.vin"]')) +vin.sendKeys("MCL36A") +Thread.sleep(5000) +def plate = WDS.browser.findElement(By.cssSelector('[name="permitData.vehicleDetails.plate"]')) +plate.sendKeys("L4NDO") +Thread.sleep(5000) +def make = WDS.browser.findElement(By.cssSelector('[name="permitData.vehicleDetails.make"]')) +make.sendKeys("BMW") +Thread.sleep(5000) +def year = WDS.browser.findElement(By.cssSelector('[name="permitData.vehicleDetails.year"]')) +year.sendKeys("2020") +Thread.sleep(5000) +def country = WDS.browser.findElement(By.id('mui-component-select-permitData.vehicleDetails.countryCode')) +WDS.browser.executeScript("window.scrollTo(0, arguments[0].getBoundingClientRect().top + window.pageYOffset - 100);", country) +country.click() +Thread.sleep(5000) +def ca = WDS.browser.findElement(By.cssSelector('[data-value="CA"]')) +ca.click() +Thread.sleep(5000) +def province = WDS.browser.findElement(By.id('mui-component-select-permitData.vehicleDetails.provinceCode')) +province.click() +Thread.sleep(5000) +def bc = WDS.browser.findElement(By.cssSelector('[data-value="BC"]')) +bc.click() +Thread.sleep(5000) +def vehicleType = WDS.browser.findElement(By.id('mui-component-select-permitData.vehicleDetails.vehicleType')) +vehicleType.click() +def powerUnit = WDS.browser.findElement(By.cssSelector('[data-value="powerUnit"]')) +powerUnit.click() +Thread.sleep(5000) + + +Thread.sleep(5000) +def vehicleSubType = WDS.browser.findElement(By.id('mui-component-select-permitData.vehicleDetails.vehicleSubType')) +vehicleSubType.click() +def trucks = WDS.browser.findElement(By.cssSelector('[data-value="REGTRCK"]')) +trucks.click() +Thread.sleep(5000) + +def continueButton = WDS.browser.findElement(By.cssSelector('[data-testid="continue-application-button"]')) +Thread.sleep(5000) + +if (continueButton != null) { + continueButton.click() + WDS.log.info('Clicked the button with data-testid="continue-application-button"') +} else { + WDS.log.info('Button with data-testid="continue-application-button" not found') +} + +Thread.sleep(10000) +def checkboxes = WDS.browser.findElements(By.cssSelector('input[type="checkbox"]')) +checkboxes.each { checkbox -> + WDS.browser.executeScript("window.scrollTo(0, arguments[0].getBoundingClientRect().top + window.pageYOffset - 100);", checkbox) + if (!checkbox.isSelected()) { + checkbox.click() + } +} + +Thread.sleep(5000) +def addToCart = WDS.browser.findElement(By.cssSelector('[data-testid="add-to-cart-btn"]')) +addToCart.click() + +Thread.sleep(10000) +def shoppingCart = WDS.browser.findElement(By.className('shopping-cart-button')) +shoppingCart.click() + +Thread.sleep(5000) +def payNow = WDS.browser.findElement(By.cssSelector('[data-testid="pay-now-btn"]')) +WDS.browser.executeScript("window.scrollTo(0, arguments[0].getBoundingClientRect().top + window.pageYOffset - 100);", payNow) +payNow.click() + +Thread.sleep(5000) + +WDS.sampleResult.sampleEnd() + + + groovy + - - - - - false - - = - true - - - - - - - - https://${FRONTEND_API_URL}/ - GET - true - false - true - false - - - - - - - - - Host - ${FRONTEND_API_URL} - - - Connection - keep-alive - - - Cache-Control - max-age=0 - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - sec-ch-ua-mobile - ?0 - - - sec-ch-ua-platform - "Windows" - - - Upgrade-Insecure-Requests - 1 - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Accept - text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 - - - Sec-Fetch-Site - same-origin - - - Sec-Fetch-Mode - navigate - - - Sec-Fetch-User - ?1 - - - Sec-Fetch-Dest - document - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - Cookie - _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; FAILREASON=0; 9a75866e187615f9e3e688e8297548f9=1f5b60b83338df80ae3a11e1286008b7; SMSESSION=LOGGEDOFF - - - If-None-Match - W/"653ca247-308" - - - If-Modified-Since - Sat, 28 Oct 2023 05:55:19 GMT - - - - - - - - - - false - - = - true - - - - - - - - https://${KEYCLOAK_LOGIN_URL}/auth/realms/standard/.well-known/openid-configuration - GET - true - false - true - false - - - - - - - - - Host - ${KEYCLOAK_LOGIN_URL} - - - Connection - keep-alive - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - Accept - application/jwk-set+json, application/json - - - sec-ch-ua-mobile - ?0 - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - sec-ch-ua-platform - "Windows" - - - Origin - https://${FRONTEND_API_URL} - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - cors - - - Sec-Fetch-Dest - empty - - - Referer - https://${FRONTEND_API_URL}/ - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - - - - - - - - false - - = - true - - - - - - - - https://${KEYCLOAK_LOGIN_URL}/auth/realms/standard/protocol/openid-connect/auth?client_id=on-route-bc-direct-4598&redirect_uri=https%3A%2F%2F${FRONTEND_API_URL}%2F&response_type=code&scope=openid&state=7be0f498ddfa45e28ee8f2416475ba42&code_challenge=B4JszPcS0HOW7ECTTUURC1mp6z8at2b6K0lD1uK_11A&code_challenge_method=S256&response_mode=query&kc_idp_hint=bceidboth - GET - true - false - true - false - - - - - - - - - Host - ${KEYCLOAK_LOGIN_URL} - - - Connection - keep-alive - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - sec-ch-ua-mobile - ?0 - - - sec-ch-ua-platform - "Windows" - - - Upgrade-Insecure-Requests - 1 - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Accept - text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - navigate - - - Sec-Fetch-User - ?1 - - - Sec-Fetch-Dest - document - - - Referer - https://${FRONTEND_API_URL}/ - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - Cookie - AUTH_SESSION_ID=2e364c60-0ead-4ec1-98fb-0e1bba001f08.ycloak-78b4c74bcf-vtmwp; AUTH_SESSION_ID_LEGACY=2e364c60-0ead-4ec1-98fb-0e1bba001f08.ycloak-78b4c74bcf-vtmwp; _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; FAILREASON=0; SMSESSION=LOGGEDOFF - - - - - - - - - - false - - = - true - - - - - - - - https://${KEYCLOAK_LOGIN_URL}/auth/realms/standard/broker/bceidboth/login?session_code=5b_D1WNhNIzE-FZe70dEmhs_J2mpDyFSyQzWPAxnjYc&client_id=on-route-bc-direct-4598&tab_id=KAxYXjoatGc - GET - true - false - true - false - - - - - - - - - Host - ${KEYCLOAK_LOGIN_URL} - - - Connection - keep-alive - - - Upgrade-Insecure-Requests - 1 - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Accept - text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - navigate - - - Sec-Fetch-User - ?1 - - - Sec-Fetch-Dest - document - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - sec-ch-ua-mobile - ?0 - - - sec-ch-ua-platform - "Windows" - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - Cookie - AUTH_SESSION_ID=0e56ff7b-e277-400f-84f5-25801c43c829.ycloak-78b4c74bcf-kh476; AUTH_SESSION_ID_LEGACY=0e56ff7b-e277-400f-84f5-25801c43c829.ycloak-78b4c74bcf-kh476; KC_RESTART=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICIzMmI0MzNkNC02NjgwLTQxODMtOTc2Yy1kZDdjMTg0YjExMTQifQ.eyJjaWQiOiJvbi1yb3V0ZS1iYy1kaXJlY3QtNDU5OCIsInB0eSI6Im9wZW5pZC1jb25uZWN0IiwicnVyaSI6Imh0dHBzOi8vb25yb3V0ZWJjLXRlc3QtZnJvbnRlbmQuYXBwcy5zaWx2ZXIuZGV2b3BzLmdvdi5iYy5jYS8iLCJhY3QiOiJBVVRIRU5USUNBVEUiLCJub3RlcyI6eyJzY29wZSI6Im9wZW5pZCIsImlzcyI6Imh0dHBzOi8vdGVzdC5sb2dpbnByb3h5Lmdvdi5iYy5jYS9hdXRoL3JlYWxtcy9zdGFuZGFyZCIsInJlc3BvbnNlX3R5cGUiOiJjb2RlIiwiY29kZV9jaGFsbGVuZ2VfbWV0aG9kIjoiUzI1NiIsInJlZGlyZWN0X3VyaSI6Imh0dHBzOi8vb25yb3V0ZWJjLXRlc3QtZnJvbnRlbmQuYXBwcy5zaWx2ZXIuZGV2b3BzLmdvdi5iYy5jYS8iLCJzdGF0ZSI6IjdiZTBmNDk4ZGRmYTQ1ZTI4ZWU4ZjI0MTY0NzViYTQyIiwiY29kZV9jaGFsbGVuZ2UiOiJCNEpzelBjUzBIT1c3RUNUVFVVUkMxbXA2ejhhdDJiNkswbEQxdUtfMTFBIiwia2NfaWRwX2hpbnQiOiJiY2VpZGJvdGgiLCJyZXNwb25zZV9tb2RlIjoicXVlcnkifX0.2dLZTTjk8ZY0EFAaE88sAWQlfo7T17XcYLztnQwI_Yk; _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; FAILREASON=0; SMSESSION=LOGGEDOFF - - - - - - - - - - false - - = - true - - - - - - - - https://${KEYCLOAK_LOGIN_URL}/auth/realms/bceidboth/protocol/openid-connect/auth?scope=openid&state=JvIyfmoj0AzmBZWw0ZS8lBmhMJXd7lA_uAR8JQvLNlE.KAxYXjoatGc.on-route-bc-direct-4598&response_type=code&client_id=standard-realm&redirect_uri=https%3A%2F%2F${KEYCLOAK_LOGIN_URL}%2Fauth%2Frealms%2Fstandard%2Fbroker%2Fbceidboth%2Fendpoint&nonce=1sKWmdZ0aV6QIscb65Lrmg - GET - true - false - true - false - - - - - - - - - Host - ${KEYCLOAK_LOGIN_URL} - - - Connection - keep-alive - - - Upgrade-Insecure-Requests - 1 - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Accept - text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - navigate - - - Sec-Fetch-User - ?1 - - - Sec-Fetch-Dest - document - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - sec-ch-ua-mobile - ?0 - - - sec-ch-ua-platform - "Windows" - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - Cookie - AUTH_SESSION_ID=33769057-e4e2-49e9-821b-bab26d4e7507.ycloak-78b4c74bcf-gj9d6; AUTH_SESSION_ID_LEGACY=33769057-e4e2-49e9-821b-bab26d4e7507.ycloak-78b4c74bcf-gj9d6; KEYCLOAK_IDENTITY=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI1ZjExNjBiNS03Y2RjLTQ5NGQtYmFkOS0yZGRkNjU3MDU5Y2UifQ.eyJleHAiOjE2OTg3MzE3MzQsImlhdCI6MTY5ODY5NTczNCwianRpIjoiNzY3ZDEzMGEtMzczMC00NDdhLWEzNTUtNjhhNDhiMjgzZTI3IiwiaXNzIjoiaHR0cHM6Ly90ZXN0LmxvZ2lucHJveHkuZ292LmJjLmNhL2F1dGgvcmVhbG1zL2JjZWlkYm90aCIsInN1YiI6ImQ3M2FiN2IwLWUyMmEtNDg0NC04Yzc3LWU3YTQ2ODQyOTNmZCIsInR5cCI6IlNlcmlhbGl6ZWQtSUQiLCJzZXNzaW9uX3N0YXRlIjoiMzM3NjkwNTctZTRlMi00OWU5LTgyMWItYmFiMjZkNGU3NTA3Iiwic2lkIjoiMzM3NjkwNTctZTRlMi00OWU5LTgyMWItYmFiMjZkNGU3NTA3Iiwic3RhdGVfY2hlY2tlciI6Ik9SWEI4amY3Q3hPUWhzTUNhWU5nMHF2WHNzZG52cnlxUHFjMnFpUkthZncifQ.1kpL3Qpg4pyqSLBE0iDz7WZ0fdGzCCf6RCiN6HvFWqE; KEYCLOAK_IDENTITY_LEGACY=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI1ZjExNjBiNS03Y2RjLTQ5NGQtYmFkOS0yZGRkNjU3MDU5Y2UifQ.eyJleHAiOjE2OTg3MzE3MzQsImlhdCI6MTY5ODY5NTczNCwianRpIjoiNzY3ZDEzMGEtMzczMC00NDdhLWEzNTUtNjhhNDhiMjgzZTI3IiwiaXNzIjoiaHR0cHM6Ly90ZXN0LmxvZ2lucHJveHkuZ292LmJjLmNhL2F1dGgvcmVhbG1zL2JjZWlkYm90aCIsInN1YiI6ImQ3M2FiN2IwLWUyMmEtNDg0NC04Yzc3LWU3YTQ2ODQyOTNmZCIsInR5cCI6IlNlcmlhbGl6ZWQtSUQiLCJzZXNzaW9uX3N0YXRlIjoiMzM3NjkwNTctZTRlMi00OWU5LTgyMWItYmFiMjZkNGU3NTA3Iiwic2lkIjoiMzM3NjkwNTctZTRlMi00OWU5LTgyMWItYmFiMjZkNGU3NTA3Iiwic3RhdGVfY2hlY2tlciI6Ik9SWEI4amY3Q3hPUWhzTUNhWU5nMHF2WHNzZG52cnlxUHFjMnFpUkthZncifQ.1kpL3Qpg4pyqSLBE0iDz7WZ0fdGzCCf6RCiN6HvFWqE; KEYCLOAK_SESSION=bceidboth/d73ab7b0-e22a-4844-8c77-e7a4684293fd/33769057-e4e2-49e9-821b-bab26d4e7507; KEYCLOAK_SESSION_LEGACY=bceidboth/d73ab7b0-e22a-4844-8c77-e7a4684293fd/33769057-e4e2-49e9-821b-bab26d4e7507; _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; FAILREASON=0; SMSESSION=LOGGEDOFF - - - - - - - - - - false - - = - true - - - - - - - - https://${KEYCLOAK_LOGIN_URL}/auth/realms/bceidboth/broker/bceidboth/login?session_code=oRr0p7JZ9oL7vptnFPfNKhf_nrB8DND1rBojsNPjot0&client_id=standard-realm&tab_id=k5Vw5BDlfVQ - GET - true - false - true - false - - - - - - - - - Host - ${KEYCLOAK_LOGIN_URL} - - - Connection - keep-alive - - - Upgrade-Insecure-Requests - 1 - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Accept - text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - navigate - - - Sec-Fetch-User - ?1 - - - Sec-Fetch-Dest - document - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - sec-ch-ua-mobile - ?0 - - - sec-ch-ua-platform - "Windows" - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - Cookie - AUTH_SESSION_ID=f26f78a0-28d2-40b4-9e57-b83fa590e32e.ycloak-78b4c74bcf-vtmwp; AUTH_SESSION_ID_LEGACY=f26f78a0-28d2-40b4-9e57-b83fa590e32e.ycloak-78b4c74bcf-vtmwp; KC_RESTART=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI1ZjExNjBiNS03Y2RjLTQ5NGQtYmFkOS0yZGRkNjU3MDU5Y2UifQ.eyJjaWQiOiJzdGFuZGFyZC1yZWFsbSIsInB0eSI6Im9wZW5pZC1jb25uZWN0IiwicnVyaSI6Imh0dHBzOi8vdGVzdC5sb2dpbnByb3h5Lmdvdi5iYy5jYS9hdXRoL3JlYWxtcy9zdGFuZGFyZC9icm9rZXIvYmNlaWRib3RoL2VuZHBvaW50IiwiYWN0IjoiQVVUSEVOVElDQVRFIiwibm90ZXMiOnsic2NvcGUiOiJvcGVuaWQiLCJpc3MiOiJodHRwczovL3Rlc3QubG9naW5wcm94eS5nb3YuYmMuY2EvYXV0aC9yZWFsbXMvYmNlaWRib3RoIiwicmVzcG9uc2VfdHlwZSI6ImNvZGUiLCJyZWRpcmVjdF91cmkiOiJodHRwczovL3Rlc3QubG9naW5wcm94eS5nb3YuYmMuY2EvYXV0aC9yZWFsbXMvc3RhbmRhcmQvYnJva2VyL2JjZWlkYm90aC9lbmRwb2ludCIsInN0YXRlIjoiSnZJeWZtb2owQXptQlpXdzBaUzhsQm1oTUpYZDdsQV91QVI4SlF2TE5sRS5LQXhZWGpvYXRHYy5vbi1yb3V0ZS1iYy1kaXJlY3QtNDU5OCIsIm5vbmNlIjoiMXNLV21kWjBhVjZRSXNjYjY1THJtZyJ9fQ.08S_Qi57kTkuLj_eH5VElw2zeuH4AVhfOUois5IUzEI; _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; FAILREASON=0; SMSESSION=LOGGEDOFF - - - - - - - - - - false - - = - true - - - - - - - - https://${SITEMINDER_URL}/clp-cgi/capBceid/logon.cgi?flags=0101:0,7&TYPE=33554433&REALMOID=06-b02c7ed2-895e-4953-bd03-8008c64ec906&GUID=&SMAUTHREASON=0&METHOD=GET&SMAGENTNAME=$SM$Lk6VtkyHw8x3zQIIsMiOiEXYFJF%2fJzjVT7eioCjxBjJck5VMlbxxrR%2bLZSo%2flIBX&TARGET=$SM$HTTPS%3a%2f%2fsfstest7%2egov%2ebc%2eca%2faffwebservices%2fredirectjsp%2ftestkeycloak-basicbusinessbceid%2fredirect%2ejsp%3fSMPORTALURL%3dhttps$%3A$%2F$%2Fsfstest7%2egov%2ebc%2eca$%2Faffwebservices$%2Fpublic$%2Fsaml2sso%26SAMLTRANSACTIONID%3dc9f189ad-7324de1b-2e045e1a-e8bcf162-a78af00c-c5 - GET - true - false - true - false - - - - - - - - - Host - ${SITEMINDER_URL} - - - Connection - keep-alive - - - Cache-Control - max-age=0 - - - Upgrade-Insecure-Requests - 1 - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Accept - text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - navigate - - - Sec-Fetch-Dest - document - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - sec-ch-ua-mobile - ?0 - - - sec-ch-ua-platform - "Windows" - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - Cookie - _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; Dummy1=DummyVal1; BCGOVFlags=0101%3A0%2C7; BCGOVCustom=NULL; BCGOVBrand=NULL; BCGOVBehavior=NULL; Dummy2=DummyVal2; preDummy1=DummyVal1; preDummy2=DummyVal2; preDummy3=DummyVal3; BCGOVDoNotShow=1; preDummy4=DummyVal4; FAILREASON=0; BCGOVTarget=HTTPS%3A%2F%2Fsfstest7.gov.bc.ca%2Faffwebservices%2Fredirectjsp%2Ftestkeycloak-basicbusinessbceid%2Fredirect.jsp%3FSMPORTALURL%3Dhttps%253A%252F%252Fsfstest7.gov.bc.ca%252Faffwebservices%252Fpublic%252Fsaml2sso%26SAMLTRANSACTIONID%3Df7917115-57286b4a-df9cf6ff-b50e2f11-c566ac5a-f6; BCGOVclptryno=0; clp001=0; SMSESSION=LOGGEDOFF; SMFED_OLD_SESSION=""; SMFED_OLD_IDENTITY=""; GUID=1:26feb557-62af2c8c-4ef3a8d7-2e2277be-6a76895c-697 - - - - - - - true - - - - false - instance=instance_capBceid&user=ORBCTST3&password=orbcTST%2B2023 - = - - - - - - - - https://${SITEMINDER_URL}/clp-cgi/preLogon.cgi - POST - true - false - true - false - - - - - - - - - Host - ${SITEMINDER_URL} - - - Connection - keep-alive - - - Content-Length - 64 - - - Cache-Control - max-age=0 - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - sec-ch-ua-mobile - ?0 - - - sec-ch-ua-platform - "Windows" - - - Upgrade-Insecure-Requests - 1 - - - Origin - https://${SITEMINDER_URL} - - - Content-Type - application/x-www-form-urlencoded - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Accept - text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 - - - Sec-Fetch-Site - same-origin - - - Sec-Fetch-Mode - navigate - - - Sec-Fetch-User - ?1 - - - Sec-Fetch-Dest - document - - - Referer - https://${SITEMINDER_URL}/clp-cgi/capBceid/logon.cgi?flags=0101:0,7&TYPE=33554433&REALMOID=06-b02c7ed2-895e-4953-bd03-8008c64ec906&GUID=&SMAUTHREASON=0&METHOD=GET&SMAGENTNAME=$SM$Lk6VtkyHw8x3zQIIsMiOiEXYFJF%2fJzjVT7eioCjxBjJck5VMlbxxrR%2bLZSo%2flIBX&TARGET=$SM$HTTPS%3a%2f%2fsfstest7%2egov%2ebc%2eca%2faffwebservices%2fredirectjsp%2ftestkeycloak-basicbusinessbceid%2fredirect%2ejsp%3fSMPORTALURL%3dhttps$%3A$%2F$%2Fsfstest7%2egov%2ebc%2eca$%2Faffwebservices$%2Fpublic$%2Fsaml2sso%26SAMLTRANSACTIONID%3dc9f189ad-7324de1b-2e045e1a-e8bcf162-a78af00c-c5 - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - Cookie - _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; Dummy1=DummyVal1; BCGOVFlags=0101%3A0%2C7; BCGOVCustom=NULL; BCGOVBrand=NULL; BCGOVBehavior=NULL; Dummy2=DummyVal2; preDummy1=DummyVal1; preDummy2=DummyVal2; preDummy3=DummyVal3; BCGOVDoNotShow=1; preDummy4=DummyVal4; FAILREASON=0; clp001=0; SMSESSION=LOGGEDOFF; SMFED_OLD_SESSION=""; SMFED_OLD_IDENTITY=""; GUID=1:26feb557-62af2c8c-4ef3a8d7-2e2277be-6a76895c-697; BCGOVTarget=HTTPS%3A%2F%2Fsfstest7.gov.bc.ca%2Faffwebservices%2Fredirectjsp%2Ftestkeycloak-basicbusinessbceid%2Fredirect.jsp%3FSMPORTALURL%3Dhttps%253A%252F%252Fsfstest7.gov.bc.ca%252Faffwebservices%252Fpublic%252Fsaml2sso%26SAMLTRANSACTIONID%3Dc9f189ad-7324de1b-2e045e1a-e8bcf162-a78af00c-c5; BCGOVclptryno=1 - - - - - - - true - - - - false - SMENC=ISO-8859-1&SMLOCALE=US-EN&target=%2Fclp-cgi%2Fcap07%2Fprivate%2FpostLogon.cgi&smauthreason=0&smagentname=&user=ORBCTST3&password=orbcTST%2B2023 - = - - - - - - - - https://${SITEMINDER_URL}/clp-cgi/cap07/logon.fcc - POST - true - false - true - false - - - - - - - - - Host - ${SITEMINDER_URL} - - - Connection - keep-alive - - - Content-Length - 149 - - - Cache-Control - max-age=0 - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - sec-ch-ua-mobile - ?0 - - - sec-ch-ua-platform - "Windows" - - - Upgrade-Insecure-Requests - 1 - - - Origin - https://${SITEMINDER_URL} - - - Content-Type - application/x-www-form-urlencoded - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Accept - text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 - - - Sec-Fetch-Site - same-origin - - - Sec-Fetch-Mode - navigate - - - Sec-Fetch-Dest - document - - - Referer - https://${SITEMINDER_URL}/clp-cgi/preLogon.cgi - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - Cookie - _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; Dummy1=DummyVal1; BCGOVFlags=0101%3A0%2C7; BCGOVCustom=NULL; BCGOVBrand=NULL; BCGOVBehavior=NULL; Dummy2=DummyVal2; preDummy1=DummyVal1; preDummy2=DummyVal2; preDummy3=DummyVal3; BCGOVDoNotShow=1; preDummy4=DummyVal4; FAILREASON=0; SMSESSION=LOGGEDOFF; SMFED_OLD_SESSION=""; SMFED_OLD_IDENTITY=""; GUID=1:26feb557-62af2c8c-4ef3a8d7-2e2277be-6a76895c-697; BCGOVTarget=HTTPS%3A%2F%2Fsfstest7.gov.bc.ca%2Faffwebservices%2Fredirectjsp%2Ftestkeycloak-basicbusinessbceid%2Fredirect.jsp%3FSMPORTALURL%3Dhttps%253A%252F%252Fsfstest7.gov.bc.ca%252Faffwebservices%252Fpublic%252Fsaml2sso%26SAMLTRANSACTIONID%3Dc9f189ad-7324de1b-2e045e1a-e8bcf162-a78af00c-c5; BCGOVclptryno=1; clp001=Salted__%8E%F5%14%93%F3.%C8%8C%C2%B3%84%8B%8EC%E0%88%AAK%01%C77%B6%C4g%C3%D2%3ELS%06%7CdJp%18%E9TJ%8A%D3a%A9%AD%3C%5E%DBZ%D7 - - - - - - - - - - false - - = - - - - - - - - https://${SITEMINDER_URL}/clp-cgi/cap07/private/postLogon.cgi - GET - true - false - true - false - - - - - - - - - Host - ${SITEMINDER_URL} - - - Connection - keep-alive - - - Cache-Control - max-age=0 - - - Upgrade-Insecure-Requests - 1 - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Accept - text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 - - - Sec-Fetch-Site - same-origin - - - Sec-Fetch-Mode - navigate - - - Sec-Fetch-Dest - document - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - sec-ch-ua-mobile - ?0 - - - sec-ch-ua-platform - "Windows" - - - Referer - https://${SITEMINDER_URL}/clp-cgi/preLogon.cgi - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - Cookie - _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; Dummy1=DummyVal1; BCGOVFlags=0101%3A0%2C7; BCGOVCustom=NULL; BCGOVBrand=NULL; BCGOVBehavior=NULL; Dummy2=DummyVal2; preDummy1=DummyVal1; preDummy2=DummyVal2; preDummy3=DummyVal3; BCGOVDoNotShow=1; preDummy4=DummyVal4; FAILREASON=0; SMSESSION=LOGGEDOFF; SMFED_OLD_SESSION=""; SMFED_OLD_IDENTITY=""; GUID=1:26feb557-62af2c8c-4ef3a8d7-2e2277be-6a76895c-697; BCGOVTarget=HTTPS%3A%2F%2Fsfstest7.gov.bc.ca%2Faffwebservices%2Fredirectjsp%2Ftestkeycloak-basicbusinessbceid%2Fredirect.jsp%3FSMPORTALURL%3Dhttps%253A%252F%252Fsfstest7.gov.bc.ca%252Faffwebservices%252Fpublic%252Fsaml2sso%26SAMLTRANSACTIONID%3Dc9f189ad-7324de1b-2e045e1a-e8bcf162-a78af00c-c5; BCGOVclptryno=1; clp001=Salted__%8E%F5%14%93%F3.%C8%8C%C2%B3%84%8B%8EC%E0%88%AAK%01%C77%B6%C4g%C3%D2%3ELS%06%7CdJp%18%E9TJ%8A%D3a%A9%AD%3C%5E%DBZ%D7; FORMCRED=2ZS4S2F4tb41FWGyAD293ZV3eiMsCRYZ+ktOitYzjWY/fG/2BFtCWHSnbkvgJfBEm8aTuwAg3nMfeG0h8ahL0C1Q+SZp1d30x/imUNpQkjqP7yK+smpXGQMNWzNb15A+UXcYa0yUQLQ5rFoH720FIoiqZ4Nmikk7a67vktQxd8rpIduHeZJ7tAYb/b+pXPha - - - - - - - true - - - - false - RelayState=pkQKGHDSoVdRPpUZ1XHJWrVAUBtEl2EOcIu2bUhv0V0.k5Vw5BDlfVQ.standard-realm&SAMLResponse=PG5zNTpSZXNwb25zZSB4bWxuczpuczU9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpwcm90b2NvbCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDkveG1sZW5jMTEjIiB4bWxuczpuczI9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphc3NlcnRpb24iIHhtbG5zOm5zMz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyIgeG1sbnM6bnM0PSJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzA0L3htbGVuYyMiIERlc3RpbmF0aW9uPSJodHRwczovL3Rlc3QubG9naW5wcm94eS5nb3YuYmMuY2EvYXV0aC9yZWFsbXMvYmNlaWRib3RoL2Jyb2tlci9iY2VpZGJvdGgvZW5kcG9pbnQiIElEPSJfMzU0NWZlNjJmOGY3OThhNTk1ZWNlM2I2YzYxM2RmNmU5ZWFkIiBJblJlc3BvbnNlVG89IklEX2FhYTM1M2Q0LTdlNmMtNDQxNS05N2FkLWI2NmEzM2FhOTBkYyIgSXNzdWVJbnN0YW50PSIyMDIzLTEwLTMwVDE5OjU2OjM3LjE4MFoiIFZlcnNpb249IjIuMCI%2BDQogICAgPG5zMjpJc3N1ZXIgRm9ybWF0PSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6bmFtZWlkLWZvcm1hdDplbnRpdHkiPmh0dHBzOi8vdGVzdC5sb2dpbnByb3h5Lmdvdi5iYy5jYS9hdXRoL3JlYWxtcy9fYmNlaWRiYXNpY2J1c2luZXNzMS88L25zMjpJc3N1ZXI%2BDQogICAgPG5zNTpTdGF0dXM%2BDQogICAgICAgIDxuczU6U3RhdHVzQ29kZSBWYWx1ZT0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOnN0YXR1czpTdWNjZXNzIi8%2BDQogICAgPC9uczU6U3RhdHVzPg0KICAgIDxuczI6QXNzZXJ0aW9uIElEPSJfZWFmZTRjYWQ5MjU0MTEyZjQ5YTcxMDI1MGM3YjVhNDVjYmI2IiBJc3N1ZUluc3RhbnQ9IjIwMjMtMTAtMzBUMTk6NTY6MzcuMTgwWiIgVmVyc2lvbj0iMi4wIiB4bWxuczpuczI9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphc3NlcnRpb24iPg0KICAgICAgICA8bnMyOklzc3VlciBGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpuYW1laWQtZm9ybWF0OmVudGl0eSI%2BaHR0cHM6Ly90ZXN0LmxvZ2lucHJveHkuZ292LmJjLmNhL2F1dGgvcmVhbG1zL19iY2VpZGJhc2ljYnVzaW5lc3MxLzwvbnMyOklzc3Vlcj48ZHM6U2lnbmF0dXJlIHhtbG5zOmRzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIj48ZHM6U2lnbmVkSW5mbz48ZHM6Q2Fub25pY2FsaXphdGlvbk1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvMTAveG1sLWV4Yy1jMTRuIyIvPjxkczpTaWduYXR1cmVNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzA0L3htbGRzaWctbW9yZSNyc2Etc2hhMjU2Ii8%2BPGRzOlJlZmVyZW5jZSBVUkk9IiNfZWFmZTRjYWQ5MjU0MTEyZjQ5YTcxMDI1MGM3YjVhNDVjYmI2Ij48ZHM6VHJhbnNmb3Jtcz48ZHM6VHJhbnNmb3JtIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI2VudmVsb3BlZC1zaWduYXR1cmUiLz48ZHM6VHJhbnNmb3JtIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS8xMC94bWwtZXhjLWMxNG4jIi8%2BPC9kczpUcmFuc2Zvcm1zPjxkczpEaWdlc3RNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzA0L3htbGVuYyNzaGEyNTYiLz48ZHM6RGlnZXN0VmFsdWU%2BS0c3SWRyMko3ODNGVGFkNkVZM0hHUklyRFpnUXU1TmdOQ1JBRU1vcERkYz08L2RzOkRpZ2VzdFZhbHVlPjwvZHM6UmVmZXJlbmNlPjwvZHM6U2lnbmVkSW5mbz48ZHM6U2lnbmF0dXJlVmFsdWU%2BbHJlNnpwalpyUEpKZmVqYStkUHN3cUhlVDN6a3VkNjA4emppZE4vWlBRMjdmSW56aHFWQ2lreDhHcld4V29jSWM4ekhHb1cxZmJqTXlBSkIwNnRHS2pXdzBXMWExTlIyL2VlVGQ1MFY1RnF4NndIb001NFVmYUkvY0N6dDdsMUNUQ2lHZzB6UkVLZjRDK3RxcWJaQ3QyRlFCQ20vd0xaNHRrdXVsZUh4WTZqdGJxWXBlbmpvSzQ2TGlocE1CejIvczBDRmQ3c1BxVjF4bHJpWXVtd1dtSlV1b0o1d0M1L2ZMZ3djTUlmSVMwd29SZmQzclBTN1pBWk5vWXExVVpWQ2xmemZMZ1hNc3JsM2k2S0F3SS80N01pSVpzeGNaaFd1Q3dMTFdFSXdzRWQzWlNLZFhXUTF1U0RrSGlIUGIrcXFmSTJQRGJwK2l1bHFDdlo2S3BCVzdnPT08L2RzOlNpZ25hdHVyZVZhbHVlPjxkczpLZXlJbmZvIHhtbG5zOmRzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIj48ZHM6WDUwOURhdGE%2BPGRzOlg1MDlDZXJ0aWZpY2F0ZT5NSUlFQ3pDQ0F2TUNDUUNkb1dONFh0VUk2VEFOQmdrcWhraUc5dzBCQVFzRkFEQ0J5akVMTUFrR0ExVUVCaE1DUTBFeEdUQVhCZ05WQkFnVEVFSnlhWFJwYzJnZ1EyOXNkVzFpYVdFeEVUQVBCZ05WQkFjVENGWnBZM1J2Y21saE1UY3dOUVlEVlFRS0V5NUhiM1psY201dFpXNTBJRzltSUhSb1pTQlFjbTkyYVc1alpTQnZaaUJDY21sMGFYTm9JRU52YkhWdFltbGhNUTh3RFFZRFZRUUxFd1pUUmxNdFEwRXhJakFnQmdOVkJBTVRHVk5HVXlCRFpYSjBhV1pwWTJGMFpTQkJkWFJvYjNKcGRIa3hIekFkQmdrcWhraUc5dzBCQ1FFV0VGZFVVMWRCVFVCbmIzWXVZbU11WTJFd0hoY05NVE13TkRBMU1qSTFOalUzV2hjTk16TXdOREExTWpJMU5qVTNXakNCd3pFTE1Ba0dBMVVFQmhNQ1EwRXhHVEFYQmdOVkJBZ1RFRUp5YVhScGMyZ2dRMjlzZFcxaWFXRXhFVEFQQmdOVkJBY1RDRlpwWTNSdmNtbGhNVGN3TlFZRFZRUUtFeTVIYjNabGNtNXRaVzUwSUc5bUlIUm9aU0JRY205MmFXNWpaU0J2WmlCQ2NtbDBhWE5vSUVOdmJIVnRZbWxoTVF3d0NnWURWUVFMRXdOVFJsTXhIakFjQmdOVkJBTVRGWE5tY3kxelpuTjBaWE4wTG1kdmRpNWlZeTVqWVRFZk1CMEdDU3FHU0liM0RRRUpBUllRVjFSVFYwRk5RR2R2ZGk1aVl5NWpZVENDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFKdzVFMDQ1amxKK3NiU2dOZmt2eUpBMysyN0tSQm1BbHErTVVSb1IzT1NpV2MyME1XZHQ1cEt4ZFJVcTJmWXhyUWp0cnRQdUdxa2tFR2FlSTBpTlp3UkluYnk2SHU2dWJDd2YxUTdmVGxXNzhscytDak5rWU5VQzMvd3VDM21uMVFuZzhVMGxkUTd0UVU0Y1BPcXdMSXZTaUpkaUpacm1GOFJEcHBvZFljSGhiaWo3N3Q2dGlIVkN4UVlncXhOY3V0M2d3bnhWcjI0MTZ5V0hYVnFxcGNjS0xUaUkvSm9lQ2I1b0kyVVVDcmRldnlXZDRINXFOWmx5NGhMNVBCQ1lZNFR1cFVheWpoYldmeEpLNFVXY0R2N09PYSt1eHE0a1luR2V4RHBxQ2JXNmJ2Y0hiazQ3UDVSQVpJdmd2bkdvQmdTZm9oMzd6eFEvRnA2VkU0aVdBdWNDQXdFQUFUQU5CZ2txaGtpRzl3MEJBUXNGQUFPQ0FRRUFiZGtqUTl1SHB2ZGtTZUlHT25meHU0Vm5mM2pHTzR5bzgrQnJub0dhTEM4aTJDV21Wb2RpOUdPdTNIM2pyR3ZzU296N242QzJBK3ZJdkR4dkE3dHdqd0xBcXVaVlFKbkJDcE1LbXdsUENBQ0F3WitFbGI0cjJxTW14YTJGbTBJZVl6M3gyQldZT0FUdGljODFmRnpoSjhRa1dCdXdiOStkSiswbC9HR1FmOXBPMnFpSXFVRWQyb0lVVkR4cVdSWXpoUGV6ZWpwZlZqQnNUUFhZNXhRaGRCVUtITXIwWnBTVTlrTW9KemNNMW42bEpIN3BGSFpCVUtONzkyaG9FNTVPbEszTFFMVW9oKzNXNEROL1lWS2tEczZrSHI0b0w2dXo5ajJXODRIVVBYNURMbUZGaUorTHBTMDUyVkJ0WWNoangyQnQwRlBzSEpKNEMwRjByNUc0b3c9PTwvZHM6WDUwOUNlcnRpZmljYXRlPjwvZHM6WDUwOURhdGE%2BPC9kczpLZXlJbmZvPjwvZHM6U2lnbmF0dXJlPg0KICAgICAgICA8bnMyOlN1YmplY3Q%2BDQogICAgICAgICAgICA8bnMyOk5hbWVJRCBGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpuYW1laWQtZm9ybWF0OnBlcnNpc3RlbnQiPkE5RUQyQzU3NDJEQzQ1NTk5ODY3MkNDMkExMTgxNzRCPC9uczI6TmFtZUlEPg0KICAgICAgICAgICAgPG5zMjpTdWJqZWN0Q29uZmlybWF0aW9uIE1ldGhvZD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmNtOmJlYXJlciI%2BDQogICAgICAgICAgICAgICAgPG5zMjpTdWJqZWN0Q29uZmlybWF0aW9uRGF0YSBJblJlc3BvbnNlVG89IklEX2FhYTM1M2Q0LTdlNmMtNDQxNS05N2FkLWI2NmEzM2FhOTBkYyIgTm90T25PckFmdGVyPSIyMDIzLTEwLTMwVDE5OjU4OjA3LjE0OFoiIFJlY2lwaWVudD0iaHR0cHM6Ly90ZXN0LmxvZ2lucHJveHkuZ292LmJjLmNhL2F1dGgvcmVhbG1zL2JjZWlkYm90aC9icm9rZXIvYmNlaWRib3RoL2VuZHBvaW50Ii8%2BDQogICAgICAgICAgICA8L25zMjpTdWJqZWN0Q29uZmlybWF0aW9uPg0KICAgICAgICA8L25zMjpTdWJqZWN0Pg0KICAgICAgICA8bnMyOkNvbmRpdGlvbnMgTm90QmVmb3JlPSIyMDIzLTEwLTMwVDE5OjU2OjA3LjE0OFoiIE5vdE9uT3JBZnRlcj0iMjAyMy0xMC0zMFQxOTo1ODowNy4xNDhaIj4NCiAgICAgICAgICAgIDxuczI6QXVkaWVuY2VSZXN0cmljdGlvbj4NCiAgICAgICAgICAgICAgICA8bnMyOkF1ZGllbmNlPmh0dHBzOi8vdGVzdC5sb2dpbnByb3h5Lmdvdi5iYy5jYS9hdXRoL3JlYWxtcy9fYmNlaWRiYXNpY2J1c2luZXNzMS88L25zMjpBdWRpZW5jZT4NCiAgICAgICAgICAgIDwvbnMyOkF1ZGllbmNlUmVzdHJpY3Rpb24%2BDQogICAgICAgIDwvbnMyOkNvbmRpdGlvbnM%2BDQogICAgICAgIDxuczI6QXV0aG5TdGF0ZW1lbnQgQXV0aG5JbnN0YW50PSIyMDIzLTEwLTMwVDE5OjU2OjM1LjEzMloiIFNlc3Npb25JbmRleD0ibGdlQ1pvN01aRnpJaFFiU1dGcXg1SDJiK1U0PXlMMWRQUT09IiBTZXNzaW9uTm90T25PckFmdGVyPSIyMDIzLTEwLTMwVDE5OjU4OjA3LjEzMloiPg0KICAgICAgICAgICAgPG5zMjpBdXRobkNvbnRleHQ%2BDQogICAgICAgICAgICAgICAgPG5zMjpBdXRobkNvbnRleHRDbGFzc1JlZj51cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6YWM6Y2xhc3NlczpQYXNzd29yZDwvbnMyOkF1dGhuQ29udGV4dENsYXNzUmVmPg0KICAgICAgICAgICAgPC9uczI6QXV0aG5Db250ZXh0Pg0KICAgICAgICA8L25zMjpBdXRoblN0YXRlbWVudD4NCiAgICAgICAgPG5zMjpBdHRyaWJ1dGVTdGF0ZW1lbnQ%2BDQogICAgICAgICAgICA8bnMyOkF0dHJpYnV0ZSBOYW1lPSJiY2VpZF91c2VybmFtZSIgTmFtZUZvcm1hdD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmF0dHJuYW1lLWZvcm1hdDp1bnNwZWNpZmllZCI%2BDQogICAgICAgICAgICAgICAgPG5zMjpBdHRyaWJ1dGVWYWx1ZSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTp0eXBlPSJ4czpzdHJpbmciPk9SQkNUU1QzPC9uczI6QXR0cmlidXRlVmFsdWU%2BDQogICAgICAgICAgICA8L25zMjpBdHRyaWJ1dGU%2BDQogICAgICAgICAgICA8bnMyOkF0dHJpYnV0ZSBOYW1lPSJkaXNwbGF5X25hbWUiIE5hbWVGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphdHRybmFtZS1mb3JtYXQ6dW5zcGVjaWZpZWQiPg0KICAgICAgICAgICAgICAgIDxuczI6QXR0cmlidXRlVmFsdWUgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6dHlwZT0ieHM6c3RyaW5nIj5CcnlhbiBMYW5lPC9uczI6QXR0cmlidXRlVmFsdWU%2BDQogICAgICAgICAgICA8L25zMjpBdHRyaWJ1dGU%2BDQogICAgICAgICAgICA8bnMyOkF0dHJpYnV0ZSBOYW1lPSJiY2VpZF91c2VyX2d1aWQiIE5hbWVGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphdHRybmFtZS1mb3JtYXQ6dW5zcGVjaWZpZWQiPg0KICAgICAgICAgICAgICAgIDxuczI6QXR0cmlidXRlVmFsdWUgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6dHlwZT0ieHM6c3RyaW5nIj5BOUVEMkM1NzQyREM0NTU5OTg2NzJDQzJBMTE4MTc0QjwvbnMyOkF0dHJpYnV0ZVZhbHVlPg0KICAgICAgICAgICAgPC9uczI6QXR0cmlidXRlPg0KICAgICAgICAgICAgPG5zMjpBdHRyaWJ1dGUgTmFtZT0iZW1haWwiIE5hbWVGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphdHRybmFtZS1mb3JtYXQ6dW5zcGVjaWZpZWQiPg0KICAgICAgICAgICAgICAgIDxuczI6QXR0cmlidXRlVmFsdWUgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6dHlwZT0ieHM6c3RyaW5nIj5icnlhbi5sYW5lQGdvdi5iYy5jYTwvbnMyOkF0dHJpYnV0ZVZhbHVlPg0KICAgICAgICAgICAgPC9uczI6QXR0cmlidXRlPg0KICAgICAgICA8bnMyOkF0dHJpYnV0ZSBOYW1lPSJTTUdPVl9CVVNJTkVTU0dVSUQiIE5hbWVGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphdHRybmFtZS1mb3JtYXQ6dW5zcGVjaWZpZWQiPjxuczI6QXR0cmlidXRlVmFsdWU%2BRjQwMjNEQjNDMzBGNDg3QjlBRjVCMTRDOTU4OTg5Rjg8L25zMjpBdHRyaWJ1dGVWYWx1ZT48L25zMjpBdHRyaWJ1dGU%2BPG5zMjpBdHRyaWJ1dGUgTmFtZT0iU01HT1ZfQlVTSU5FU1NMRUdBTE5BTUUiIE5hbWVGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphdHRybmFtZS1mb3JtYXQ6dW5zcGVjaWZpZWQiPjxuczI6QXR0cmlidXRlVmFsdWU%2BU29uaWMgRGVsaXZlcnkgU2VydmljZXM8L25zMjpBdHRyaWJ1dGVWYWx1ZT48L25zMjpBdHRyaWJ1dGU%2BPC9uczI6QXR0cmlidXRlU3RhdGVtZW50Pg0KICAgIDwvbnMyOkFzc2VydGlvbj4NCjwvbnM1OlJlc3BvbnNlPg%3D%3D - = - - - - - - - - https://${KEYCLOAK_LOGIN_URL}/auth/realms/bceidboth/broker/bceidboth/endpoint - POST - true - false - true - false - - - - - - - - - Host - ${KEYCLOAK_LOGIN_URL} - - - Connection - keep-alive - - - Content-Length - 9217 - - - Cache-Control - max-age=0 - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - sec-ch-ua-mobile - ?0 - - - sec-ch-ua-platform - "Windows" - - - Upgrade-Insecure-Requests - 1 - - - Origin - https://sfstest7.gov.bc.ca - - - Content-Type - application/x-www-form-urlencoded - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Accept - text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - navigate - - - Sec-Fetch-Dest - document - - - Referer - https://sfstest7.gov.bc.ca/ - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - Cookie - AUTH_SESSION_ID=f26f78a0-28d2-40b4-9e57-b83fa590e32e.ycloak-78b4c74bcf-vtmwp; AUTH_SESSION_ID_LEGACY=f26f78a0-28d2-40b4-9e57-b83fa590e32e.ycloak-78b4c74bcf-vtmwp; KC_RESTART=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI1ZjExNjBiNS03Y2RjLTQ5NGQtYmFkOS0yZGRkNjU3MDU5Y2UifQ.eyJjaWQiOiJzdGFuZGFyZC1yZWFsbSIsInB0eSI6Im9wZW5pZC1jb25uZWN0IiwicnVyaSI6Imh0dHBzOi8vdGVzdC5sb2dpbnByb3h5Lmdvdi5iYy5jYS9hdXRoL3JlYWxtcy9zdGFuZGFyZC9icm9rZXIvYmNlaWRib3RoL2VuZHBvaW50IiwiYWN0IjoiQVVUSEVOVElDQVRFIiwibm90ZXMiOnsic2NvcGUiOiJvcGVuaWQiLCJpc3MiOiJodHRwczovL3Rlc3QubG9naW5wcm94eS5nb3YuYmMuY2EvYXV0aC9yZWFsbXMvYmNlaWRib3RoIiwicmVzcG9uc2VfdHlwZSI6ImNvZGUiLCJyZWRpcmVjdF91cmkiOiJodHRwczovL3Rlc3QubG9naW5wcm94eS5nb3YuYmMuY2EvYXV0aC9yZWFsbXMvc3RhbmRhcmQvYnJva2VyL2JjZWlkYm90aC9lbmRwb2ludCIsInN0YXRlIjoiSnZJeWZtb2owQXptQlpXdzBaUzhsQm1oTUpYZDdsQV91QVI4SlF2TE5sRS5LQXhZWGpvYXRHYy5vbi1yb3V0ZS1iYy1kaXJlY3QtNDU5OCIsIm5vbmNlIjoiMXNLV21kWjBhVjZRSXNjYjY1THJtZyJ9fQ.08S_Qi57kTkuLj_eH5VElw2zeuH4AVhfOUois5IUzEI; _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; FAILREASON=0; SMSESSION=Awk9KIrMNenX09Vl2cEMuy/VxV9CFVP4fsBzCp8Zo3AX2VsrDVWkOMVOdJyoY1Q1J9F8Vs8XFBtHTU29qS7+jlhEMK3f9j8tgudEVWHJq8LTizGhEj1cf8r7CX2QuxWMbdAHvK90hFnpocsL5xv2cAaFVdqhBKlIYkzwkY+r0YuH3Uh6DJVIhAhwjWeKfO6BAg5/jNFxQ31EPvzn4N7RxJK2bGyfAxzi6Cs6O7ieJ10MzcB8nWSIsO4ksfG8pzeGp9a+arl4maKnd9Je2L2FQohmiOjfGcrsezOgLgiWFl1B3+EL8ytArvtKhsFvr7WJsQuhYsQYzfY8shcfhNSltyqxLD422bDmU3NyZdhWY9313YG5I1U2vbO7zvXhxaCJYnpMrJR+inz8XsyqnGY1xu7AepY3pNd2wJH3twQJ42N6R2WlJVVN3oc3DvEHUbk85xrqHdwngd/FiMdEC2f5Kt51VYp8G/3R+sbFiy6Wt7wlZw2+/wI8EfxXs31HQ5q/RDUTXz6JMbzsR7EUOF+WkOrgi1nDugu13/O9hDnxPJnkzNGEfjt0xPxdhoDdl4vWdwRe1awBEn90SyJwc8+cFk1XACtvWoGwtPdf1xnHUwx5Ge1TqEd46xdjjlu+iTw2Xu5AsESUVVw81STsKA7vC8EBabQ+yXQHZlNFcFCKa1+AutNxfWHNQtnFK03kUCai4ZPJc/TQrhvf9DWjSyX+KknWdV6aQyz65KOpwtQWpd4ZlqAAKvf9vCQIBgk+YdsxFzAq6ySnLPcBLbFvP+Xyo5bcABg8IS9aJr6+05KT3ZOv49G1uYvz1ILaDED83D5NHF57ZswKR2911SevaqIO2i8NkZAJUMBpgroSejoJ1MxzpL/a7I26u6+p/08uMt/dT7vuo5OTTjayEtIlXy1IRXA/jU/uX/pKk1JrsZFhhwj7G5KEQpMAx+YvZUaaidqyfj3+fLb6+rsa8BukV8x0zfgUg20dm+Wu9XjDvyQHFP4Qt65CaUbhAKcVTgCChgTfSSdUJZIPPa5Yhzr7SmTuVGmYV/1cC4jGzNdSqr3Fq28fWukiEnRtqfZRXlOdA6xb - - - - - - - - - - false - - = - - - - - - - - https://${KEYCLOAK_LOGIN_URL}/auth/realms/standard/broker/bceidboth/endpoint?state=JvIyfmoj0AzmBZWw0ZS8lBmhMJXd7lA_uAR8JQvLNlE.KAxYXjoatGc.on-route-bc-direct-4598&session_state=f26f78a0-28d2-40b4-9e57-b83fa590e32e&code=c5719177-78e8-4d75-857a-0ef191c765d1.f26f78a0-28d2-40b4-9e57-b83fa590e32e.1123d85b-badf-4084-a3a6-b1c920ccb0c0 - GET - true - false - true - false - - - - - - - - - Host - ${KEYCLOAK_LOGIN_URL} - - - Connection - keep-alive - - - Cache-Control - max-age=0 - - - Upgrade-Insecure-Requests - 1 - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Accept - text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - navigate - - - Sec-Fetch-Dest - document - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - sec-ch-ua-mobile - ?0 - - - sec-ch-ua-platform - "Windows" - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - Cookie - AUTH_SESSION_ID=0e56ff7b-e277-400f-84f5-25801c43c829.ycloak-78b4c74bcf-kh476; AUTH_SESSION_ID_LEGACY=0e56ff7b-e277-400f-84f5-25801c43c829.ycloak-78b4c74bcf-kh476; KC_RESTART=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICIzMmI0MzNkNC02NjgwLTQxODMtOTc2Yy1kZDdjMTg0YjExMTQifQ.eyJjaWQiOiJvbi1yb3V0ZS1iYy1kaXJlY3QtNDU5OCIsInB0eSI6Im9wZW5pZC1jb25uZWN0IiwicnVyaSI6Imh0dHBzOi8vb25yb3V0ZWJjLXRlc3QtZnJvbnRlbmQuYXBwcy5zaWx2ZXIuZGV2b3BzLmdvdi5iYy5jYS8iLCJhY3QiOiJBVVRIRU5USUNBVEUiLCJub3RlcyI6eyJzY29wZSI6Im9wZW5pZCIsImlzcyI6Imh0dHBzOi8vdGVzdC5sb2dpbnByb3h5Lmdvdi5iYy5jYS9hdXRoL3JlYWxtcy9zdGFuZGFyZCIsInJlc3BvbnNlX3R5cGUiOiJjb2RlIiwiY29kZV9jaGFsbGVuZ2VfbWV0aG9kIjoiUzI1NiIsInJlZGlyZWN0X3VyaSI6Imh0dHBzOi8vb25yb3V0ZWJjLXRlc3QtZnJvbnRlbmQuYXBwcy5zaWx2ZXIuZGV2b3BzLmdvdi5iYy5jYS8iLCJzdGF0ZSI6IjdiZTBmNDk4ZGRmYTQ1ZTI4ZWU4ZjI0MTY0NzViYTQyIiwiY29kZV9jaGFsbGVuZ2UiOiJCNEpzelBjUzBIT1c3RUNUVFVVUkMxbXA2ejhhdDJiNkswbEQxdUtfMTFBIiwia2NfaWRwX2hpbnQiOiJiY2VpZGJvdGgiLCJyZXNwb25zZV9tb2RlIjoicXVlcnkifX0.2dLZTTjk8ZY0EFAaE88sAWQlfo7T17XcYLztnQwI_Yk; _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; FAILREASON=0; SMSESSION=Awk9KIrMNenX09Vl2cEMuy/VxV9CFVP4fsBzCp8Zo3AX2VsrDVWkOMVOdJyoY1Q1J9F8Vs8XFBtHTU29qS7+jlhEMK3f9j8tgudEVWHJq8LTizGhEj1cf8r7CX2QuxWMbdAHvK90hFnpocsL5xv2cAaFVdqhBKlIYkzwkY+r0YuH3Uh6DJVIhAhwjWeKfO6BAg5/jNFxQ31EPvzn4N7RxJK2bGyfAxzi6Cs6O7ieJ10MzcB8nWSIsO4ksfG8pzeGp9a+arl4maKnd9Je2L2FQohmiOjfGcrsezOgLgiWFl1B3+EL8ytArvtKhsFvr7WJsQuhYsQYzfY8shcfhNSltyqxLD422bDmU3NyZdhWY9313YG5I1U2vbO7zvXhxaCJYnpMrJR+inz8XsyqnGY1xu7AepY3pNd2wJH3twQJ42N6R2WlJVVN3oc3DvEHUbk85xrqHdwngd/FiMdEC2f5Kt51VYp8G/3R+sbFiy6Wt7wlZw2+/wI8EfxXs31HQ5q/RDUTXz6JMbzsR7EUOF+WkOrgi1nDugu13/O9hDnxPJnkzNGEfjt0xPxdhoDdl4vWdwRe1awBEn90SyJwc8+cFk1XACtvWoGwtPdf1xnHUwx5Ge1TqEd46xdjjlu+iTw2Xu5AsESUVVw81STsKA7vC8EBabQ+yXQHZlNFcFCKa1+AutNxfWHNQtnFK03kUCai4ZPJc/TQrhvf9DWjSyX+KknWdV6aQyz65KOpwtQWpd4ZlqAAKvf9vCQIBgk+YdsxFzAq6ySnLPcBLbFvP+Xyo5bcABg8IS9aJr6+05KT3ZOv49G1uYvz1ILaDED83D5NHF57ZswKR2911SevaqIO2i8NkZAJUMBpgroSejoJ1MxzpL/a7I26u6+p/08uMt/dT7vuo5OTTjayEtIlXy1IRXA/jU/uX/pKk1JrsZFhhwj7G5KEQpMAx+YvZUaaidqyfj3+fLb6+rsa8BukV8x0zfgUg20dm+Wu9XjDvyQHFP4Qt65CaUbhAKcVTgCChgTfSSdUJZIPPa5Yhzr7SmTuVGmYV/1cC4jGzNdSqr3Fq28fWukiEnRtqfZRXlOdA6xb - - - - - - - - - - false - - = - - - - - - - - https://${KEYCLOAK_LOGIN_URL}/auth/realms/standard/login-actions/post-broker-login?client_id=on-route-bc-direct-4598&tab_id=KAxYXjoatGc - GET - true - false - true - false - - - - - - - - - Host - ${KEYCLOAK_LOGIN_URL} - - - Connection - keep-alive - - - Cache-Control - max-age=0 - - - Upgrade-Insecure-Requests - 1 - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Accept - text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - navigate - - - Sec-Fetch-Dest - document - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - sec-ch-ua-mobile - ?0 - - - sec-ch-ua-platform - "Windows" - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - Cookie - AUTH_SESSION_ID=0e56ff7b-e277-400f-84f5-25801c43c829.ycloak-78b4c74bcf-kh476; AUTH_SESSION_ID_LEGACY=0e56ff7b-e277-400f-84f5-25801c43c829.ycloak-78b4c74bcf-kh476; KC_RESTART=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICIzMmI0MzNkNC02NjgwLTQxODMtOTc2Yy1kZDdjMTg0YjExMTQifQ.eyJjaWQiOiJvbi1yb3V0ZS1iYy1kaXJlY3QtNDU5OCIsInB0eSI6Im9wZW5pZC1jb25uZWN0IiwicnVyaSI6Imh0dHBzOi8vb25yb3V0ZWJjLXRlc3QtZnJvbnRlbmQuYXBwcy5zaWx2ZXIuZGV2b3BzLmdvdi5iYy5jYS8iLCJhY3QiOiJBVVRIRU5USUNBVEUiLCJub3RlcyI6eyJzY29wZSI6Im9wZW5pZCIsImlzcyI6Imh0dHBzOi8vdGVzdC5sb2dpbnByb3h5Lmdvdi5iYy5jYS9hdXRoL3JlYWxtcy9zdGFuZGFyZCIsInJlc3BvbnNlX3R5cGUiOiJjb2RlIiwiY29kZV9jaGFsbGVuZ2VfbWV0aG9kIjoiUzI1NiIsInJlZGlyZWN0X3VyaSI6Imh0dHBzOi8vb25yb3V0ZWJjLXRlc3QtZnJvbnRlbmQuYXBwcy5zaWx2ZXIuZGV2b3BzLmdvdi5iYy5jYS8iLCJzdGF0ZSI6IjdiZTBmNDk4ZGRmYTQ1ZTI4ZWU4ZjI0MTY0NzViYTQyIiwiY29kZV9jaGFsbGVuZ2UiOiJCNEpzelBjUzBIT1c3RUNUVFVVUkMxbXA2ejhhdDJiNkswbEQxdUtfMTFBIiwia2NfaWRwX2hpbnQiOiJiY2VpZGJvdGgiLCJyZXNwb25zZV9tb2RlIjoicXVlcnkifX0.2dLZTTjk8ZY0EFAaE88sAWQlfo7T17XcYLztnQwI_Yk; _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; FAILREASON=0; SMSESSION=Awk9KIrMNenX09Vl2cEMuy/VxV9CFVP4fsBzCp8Zo3AX2VsrDVWkOMVOdJyoY1Q1J9F8Vs8XFBtHTU29qS7+jlhEMK3f9j8tgudEVWHJq8LTizGhEj1cf8r7CX2QuxWMbdAHvK90hFnpocsL5xv2cAaFVdqhBKlIYkzwkY+r0YuH3Uh6DJVIhAhwjWeKfO6BAg5/jNFxQ31EPvzn4N7RxJK2bGyfAxzi6Cs6O7ieJ10MzcB8nWSIsO4ksfG8pzeGp9a+arl4maKnd9Je2L2FQohmiOjfGcrsezOgLgiWFl1B3+EL8ytArvtKhsFvr7WJsQuhYsQYzfY8shcfhNSltyqxLD422bDmU3NyZdhWY9313YG5I1U2vbO7zvXhxaCJYnpMrJR+inz8XsyqnGY1xu7AepY3pNd2wJH3twQJ42N6R2WlJVVN3oc3DvEHUbk85xrqHdwngd/FiMdEC2f5Kt51VYp8G/3R+sbFiy6Wt7wlZw2+/wI8EfxXs31HQ5q/RDUTXz6JMbzsR7EUOF+WkOrgi1nDugu13/O9hDnxPJnkzNGEfjt0xPxdhoDdl4vWdwRe1awBEn90SyJwc8+cFk1XACtvWoGwtPdf1xnHUwx5Ge1TqEd46xdjjlu+iTw2Xu5AsESUVVw81STsKA7vC8EBabQ+yXQHZlNFcFCKa1+AutNxfWHNQtnFK03kUCai4ZPJc/TQrhvf9DWjSyX+KknWdV6aQyz65KOpwtQWpd4ZlqAAKvf9vCQIBgk+YdsxFzAq6ySnLPcBLbFvP+Xyo5bcABg8IS9aJr6+05KT3ZOv49G1uYvz1ILaDED83D5NHF57ZswKR2911SevaqIO2i8NkZAJUMBpgroSejoJ1MxzpL/a7I26u6+p/08uMt/dT7vuo5OTTjayEtIlXy1IRXA/jU/uX/pKk1JrsZFhhwj7G5KEQpMAx+YvZUaaidqyfj3+fLb6+rsa8BukV8x0zfgUg20dm+Wu9XjDvyQHFP4Qt65CaUbhAKcVTgCChgTfSSdUJZIPPa5Yhzr7SmTuVGmYV/1cC4jGzNdSqr3Fq28fWukiEnRtqfZRXlOdA6xb - - - - - - - - - - false - - = - - - - - - - - https://${FRONTEND_API_URL}/?state=7be0f498ddfa45e28ee8f2416475ba42&session_state=0e56ff7b-e277-400f-84f5-25801c43c829&code=e1db6532-ce36-4aa5-845c-26c6d9f6e19f.0e56ff7b-e277-400f-84f5-25801c43c829.f462b30d-0893-4a2d-8169-3461d82c36eb - GET - true - false - true - false - - - - - - - - - Host - ${FRONTEND_API_URL} - - - Connection - keep-alive - - - Cache-Control - max-age=0 - - - Upgrade-Insecure-Requests - 1 - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Accept - text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - navigate - - - Sec-Fetch-Dest - document - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - sec-ch-ua-mobile - ?0 - - - sec-ch-ua-platform - "Windows" - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - Cookie - _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; FAILREASON=0; 9a75866e187615f9e3e688e8297548f9=1f5b60b83338df80ae3a11e1286008b7; SMSESSION=Awk9KIrMNenX09Vl2cEMuy/VxV9CFVP4fsBzCp8Zo3AX2VsrDVWkOMVOdJyoY1Q1J9F8Vs8XFBtHTU29qS7+jlhEMK3f9j8tgudEVWHJq8LTizGhEj1cf8r7CX2QuxWMbdAHvK90hFnpocsL5xv2cAaFVdqhBKlIYkzwkY+r0YuH3Uh6DJVIhAhwjWeKfO6BAg5/jNFxQ31EPvzn4N7RxJK2bGyfAxzi6Cs6O7ieJ10MzcB8nWSIsO4ksfG8pzeGp9a+arl4maKnd9Je2L2FQohmiOjfGcrsezOgLgiWFl1B3+EL8ytArvtKhsFvr7WJsQuhYsQYzfY8shcfhNSltyqxLD422bDmU3NyZdhWY9313YG5I1U2vbO7zvXhxaCJYnpMrJR+inz8XsyqnGY1xu7AepY3pNd2wJH3twQJ42N6R2WlJVVN3oc3DvEHUbk85xrqHdwngd/FiMdEC2f5Kt51VYp8G/3R+sbFiy6Wt7wlZw2+/wI8EfxXs31HQ5q/RDUTXz6JMbzsR7EUOF+WkOrgi1nDugu13/O9hDnxPJnkzNGEfjt0xPxdhoDdl4vWdwRe1awBEn90SyJwc8+cFk1XACtvWoGwtPdf1xnHUwx5Ge1TqEd46xdjjlu+iTw2Xu5AsESUVVw81STsKA7vC8EBabQ+yXQHZlNFcFCKa1+AutNxfWHNQtnFK03kUCai4ZPJc/TQrhvf9DWjSyX+KknWdV6aQyz65KOpwtQWpd4ZlqAAKvf9vCQIBgk+YdsxFzAq6ySnLPcBLbFvP+Xyo5bcABg8IS9aJr6+05KT3ZOv49G1uYvz1ILaDED83D5NHF57ZswKR2911SevaqIO2i8NkZAJUMBpgroSejoJ1MxzpL/a7I26u6+p/08uMt/dT7vuo5OTTjayEtIlXy1IRXA/jU/uX/pKk1JrsZFhhwj7G5KEQpMAx+YvZUaaidqyfj3+fLb6+rsa8BukV8x0zfgUg20dm+Wu9XjDvyQHFP4Qt65CaUbhAKcVTgCChgTfSSdUJZIPPa5Yhzr7SmTuVGmYV/1cC4jGzNdSqr3Fq28fWukiEnRtqfZRXlOdA6xb - - - - - - - - - - false - - = - true - - - - - - - - https://${KEYCLOAK_LOGIN_URL}/auth/realms/standard/.well-known/openid-configuration - GET - true - false - true - false - - - - - - - - - Host - ${KEYCLOAK_LOGIN_URL} - - - Connection - keep-alive - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - Accept - application/jwk-set+json, application/json - - - sec-ch-ua-mobile - ?0 - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - sec-ch-ua-platform - "Windows" - - - Origin - https://${FRONTEND_API_URL} - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - cors - - - Sec-Fetch-Dest - empty - - - Referer - https://${FRONTEND_API_URL}/ - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - - - - - - - - false - - = - - - - - - - - https://${VEHICLES_API_URL}/users/user-context - OPTIONS - true - false - true - false - - - - - - - - - Host - ${VEHICLES_API_URL} - - - Connection - keep-alive - - - Accept - */* - - - Access-Control-Request-Method - POST - - - Access-Control-Request-Headers - authorization,content-type - - - Origin - https://${FRONTEND_API_URL} - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Sec-Fetch-Mode - cors - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Dest - empty - - - Referer - https://${FRONTEND_API_URL}/ - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - - - - - true - - - - false - {} - = - - - - - - - - https://${VEHICLES_API_URL}/users/user-context - POST - true - false - true - false - - - - - - - - - Host - ${VEHICLES_API_URL} - - - Connection - keep-alive - - - Content-Length - 2 - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - Accept - application/json, text/plain, */* - - - Content-Type - application/json - - - sec-ch-ua-mobile - ?0 - - - Authorization - Bearer ${BCEID_BEARER_TOKEN} - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - sec-ch-ua-platform - "Windows" - - - Origin - https://${FRONTEND_API_URL} - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - cors - - - Sec-Fetch-Dest - empty - - - Referer - https://${FRONTEND_API_URL}/ - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - - - - - - - - false - - = - - - - - - - - https://${VEHICLES_API_URL}/users/roles?companyId=102 - OPTIONS - true - false - true - false - - - - - - - - - Host - ${VEHICLES_API_URL} - - - Connection - keep-alive - - - Accept - */* - - - Access-Control-Request-Method - GET - - - Access-Control-Request-Headers - authorization - - - Origin - https://${FRONTEND_API_URL} - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Sec-Fetch-Mode - cors - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Dest - empty - - - Referer - https://${FRONTEND_API_URL}/ - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - - - - - - - - false - - = - - - - - - - - https://${VEHICLES_API_URL}/users/roles?companyId=102 - GET - true - false - true - false - - - - - - - - - Host - ${VEHICLES_API_URL} - - - Connection - keep-alive - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - Accept - application/json, text/plain, */* - - - sec-ch-ua-mobile - ?0 - - - Authorization - Bearer ${BCEID_BEARER_TOKEN} - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - sec-ch-ua-platform - "Windows" - - - Origin - https://${FRONTEND_API_URL} - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - cors - - - Sec-Fetch-Dest - empty - - - Referer - https://${FRONTEND_API_URL}/ - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - If-None-Match - W/"1b4-DdYKGtaFZ5+U7pxjw6uu3owPOfo" - - - - - - - - - - false - - = - - - - - - - - https://${VEHICLES_API_URL}/permits/applications?status=IN_PROGRESS&companyId=102&userGUID=A9ED2C5742DC455998672CC2A118174B - OPTIONS - true - false - true - false - - - - - - - - - Host - ${VEHICLES_API_URL} - - - Connection - keep-alive - - - Accept - */* - - - Access-Control-Request-Method - GET - - - Access-Control-Request-Headers - authorization - - - Origin - https://${FRONTEND_API_URL} - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Sec-Fetch-Mode - cors - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Dest - empty - - - Referer - https://${FRONTEND_API_URL}/ - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - - - - - - - - false - - = - true - - - - - - - - https://${VEHICLES_API_URL}/permits/applications?status=IN_PROGRESS&companyId=102&userGUID=A9ED2C5742DC455998672CC2A118174B - GET - true - false - true - false - - - - - - - - - Host - ${VEHICLES_API_URL} - - - Connection - keep-alive - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - Accept - application/json, text/plain, */* - - - sec-ch-ua-mobile - ?0 - - - Authorization - Bearer ${BCEID_BEARER_TOKEN} - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - sec-ch-ua-platform - "Windows" - - - Origin - https://${FRONTEND_API_URL} - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - cors - - - Sec-Fetch-Dest - empty - - - Referer - https://${FRONTEND_API_URL}/ - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - If-None-Match - W/"17b2-OQs45yY+9rxT8oaE549bg+d9IqA" - - - - - - - - - - - - - - https://${VEHICLES_API_URL}/users/roles?companyId=102 - GET - true - false - true - false - - - - - - - - - Host - ${VEHICLES_API_URL} - - - Connection - keep-alive - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - Accept - application/json - - - sec-ch-ua-mobile - ?0 - - - Authorization - Bearer ${BCEID_BEARER_TOKEN} - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - sec-ch-ua-platform - "Windows" - - - Origin - https://${FRONTEND_API_URL} - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - cors - - - Sec-Fetch-Dest - empty - - - Referer - https://${FRONTEND_API_URL}/ - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - If-None-Match - W/"17b2-OQs45yY+9rxT8oaE549bg+d9IqA" - - - - - - - - Authorization - Bearer ${BCEID_BEARER_TOKEN} - - - Accept - */* - - - - - - - true - - - - false - { - "companyId": 102, - "permitId": null, - "originalPermitId": "", - "applicationNumber": null, - "previousRevision": "", - "revision": "", - "userGuid": "06267945F2EB4E31B585932F78B76269", - "permitType": "TROS", - "permitStatus": "IN_PROGRESS", - "permitApprovalSource": "PPC", - "permitApplicationOrigin": "ONLINE", - "permitData": { - "startDate": "2023-06-05T19:12:22Z", - "expiryDate": "2023-07-04T19:12:22Z", - "permitDuration": 30, - "feeSummary": "30", - "commodities": [ - { - "description": "General Permit Conditions", - "condition": "CVSE-1000", - "conditionLink": "https://www.th.gov.bc.ca/forms/getForm.aspx?formId=1251", - "checked": true - }, - { - "description": "Permit Scope and Limitation", - "condition": "CVSE-1070", - "conditionLink": "https://www.th.gov.bc.ca/forms/getForm.aspx?formId=1261", - "checked": true - }, - { - "description": "Log Permit Conditions", - "condition": "CVSE-1000L", - "conditionLink": "https://www.th.gov.bc.ca/forms/getForm.aspx?formId=1250", - "checked": true - } - ], - "contactDetails": { - "firstName": "Lewis", - "lastName": "Hamilton", - "phone1": "(778) 952-1234", - "email": "lewis@f1.com", - "phone1Extension": "1", - "phone2": null, - "phone2Extension": null, - "fax": null - }, - "mailingAddress": { - "addressLine1": "123 Short Street", - "addressLine2": null, - "city": "Victoria", - "provinceCode": "BC", - "countryCode": "CA", - "postalCode": "V8X2V5" - }, - "vehicleDetails": { - "vin": "781452", - "plate": "PRJZZP", - "make": "GMC", - "year": 2001, - "countryCode": "CA", - "provinceCode": "BC", - "vehicleType": "powerUnit", - "vehicleSubType": "LOGGING", - "saveVehicle": true - } - }, - "comment": "This application was amended because of so-and-so reason." -} - = - - - - - - - - https://${VEHICLES_API_URL}/permits/applications - POST - true - false - true - false - - - - - - - - - Host - ${VEHICLES_API_URL} - - - Connection - keep-alive - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - Accept - application/json - - - sec-ch-ua-mobile - ?0 - - - Authorization - Bearer ${BCEID_BEARER_TOKEN} - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - sec-ch-ua-platform - "Windows" - - - Origin - https://${FRONTEND_API_URL} - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - cors - - - Sec-Fetch-Dest - empty - - - Referer - https://${FRONTEND_API_URL}/ - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - If-None-Match - W/"17b2-OQs45yY+9rxT8oaE549bg+d9IqA" - - - - - - - - Authorization - Bearer ${BCEID_BEARER_TOKEN} - - - Content-Type - application/json - - - Accept - application/json - - - - - false diff --git a/loadtests/frontend/orbc_load_test_plan_frontend_idir.jmx b/loadtests/frontend/orbc_load_test_plan_frontend_idir.jmx index 2c5b961b0..ef1decf49 100644 --- a/loadtests/frontend/orbc_load_test_plan_frontend_idir.jmx +++ b/loadtests/frontend/orbc_load_test_plan_frontend_idir.jmx @@ -1,5 +1,5 @@ - + @@ -17,67 +17,6 @@ - - true - false - false - - - - - true - false - - - - - - Accept-Language - en-us,en;q=0.5 - - - Accept - text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 - - - Keep-Alive - 115 - - - User-Agent - Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13 - - - Accept-Encoding - gzip,deflate - - - Accept-Charset - ISO-8859-1,utf-8;q=0.7,*;q=0.7 - - - X-BlazeMeter-Session - ${__P(blazemeter.session_id)} - - - - - - - - - - - - - - true - 2 - ^((?!google|facebook|youtube|pinterest|twimg|doubleclick).)*$ - 60000 - 120000 - - @@ -85,24 +24,9 @@ 200 = - - FRONTEND_API_URL - onroutebc-test-frontend.apps.silver.devops.gov.bc.ca/ - = - - - VEHICLES_API_URL - onroutebc-test-vehicles.apps.silver.devops.gov.bc.ca/ - = - - - DOPS_API_URL - onroutebc-test-dops.apps.silver.devops.gov.bc.ca/ - = - - - IDIR_BEARER_TOKEN - + + FRONTEND_URL + https://onroutebc-test-frontend.apps.silver.devops.gov.bc.ca = @@ -110,6065 +34,123 @@ ~/results = - - KEYCLOAK_LOGIN_URL - test.loginproxy.gov.bc.ca + + USER + = - - SITEMINDER_URL - logontest7.gov.bc.ca + + PASSWORD + = - - continue - - false - 1 - - ${NUM_THREADS} - ${__P(rampup,300)} - 1365261073000 - 1365261073000 - true - ${__P(duration,3000)} - - true - - - - ${__P(Delay,10000)} - - - - - - - false - - = - true - - - - - - - - https://${FRONTEND_API_URL} - GET - true - false - true - false - - - - - - - - - Host - ${FRONTEND_API_URL} - - - Connection - keep-alive - - - Cache-Control - max-age=0 - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - sec-ch-ua-mobile - ?0 - - - sec-ch-ua-platform - "Windows" - - - Upgrade-Insecure-Requests - 1 - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Accept - text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 - - - Sec-Fetch-Site - same-origin - - - Sec-Fetch-Mode - navigate - - - Sec-Fetch-User - ?1 - - - Sec-Fetch-Dest - document - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - Cookie - _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; FAILREASON=0; 9a75866e187615f9e3e688e8297548f9=1f5b60b83338df80ae3a11e1286008b7; SMSESSION=LOGGEDOFF - - - If-None-Match - W/"653ca247-308" - - - If-Modified-Since - Sat, 28 Oct 2023 05:55:19 GMT - - - - - - - - - - false - - = - true - - - - - - - - https://${KEYCLOAK_LOGIN_URL}/auth/realms/standard/.well-known/openid-configuration - GET - true - false - true - false - - - - - - - - - Host - ${KEYCLOAK_LOGIN_URL} - - - Connection - keep-alive - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - Accept - application/jwk-set+json, application/json - - - sec-ch-ua-mobile - ?0 - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - sec-ch-ua-platform - "Windows" - - - Origin - https://${FRONTEND_API_URL} - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - cors - - - Sec-Fetch-Dest - empty - - - Referer - https://${FRONTEND_API_URL}/ - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - - - - - - - - false - - = - true - - - - - - - - https://${KEYCLOAK_LOGIN_URL}/auth/realms/standard/protocol/openid-connect/auth?client_id=on-route-bc-direct-4598&redirect_uri=https%3A%2F%2F${FRONTEND_API_URL}%2F&response_type=code&scope=openid&state=7be0f498ddfa45e28ee8f2416475ba42&code_challenge=B4JszPcS0HOW7ECTTUURC1mp6z8at2b6K0lD1uK_11A&code_challenge_method=S256&response_mode=query&kc_idp_hint=bceidboth - GET - true - false - true - false - - - - - - - - - Host - ${KEYCLOAK_LOGIN_URL} - - - Connection - keep-alive - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - sec-ch-ua-mobile - ?0 - - - sec-ch-ua-platform - "Windows" - - - Upgrade-Insecure-Requests - 1 - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Accept - text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - navigate - - - Sec-Fetch-User - ?1 - - - Sec-Fetch-Dest - document - - - Referer - https://${FRONTEND_API_URL}/ - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - Cookie - AUTH_SESSION_ID=2e364c60-0ead-4ec1-98fb-0e1bba001f08.ycloak-78b4c74bcf-vtmwp; AUTH_SESSION_ID_LEGACY=2e364c60-0ead-4ec1-98fb-0e1bba001f08.ycloak-78b4c74bcf-vtmwp; _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; FAILREASON=0; SMSESSION=LOGGEDOFF - - - - - - - - - - false - - = - true - - - - - - - - https://${KEYCLOAK_LOGIN_URL}/auth/realms/standard/broker/bceidboth/login?session_code=5b_D1WNhNIzE-FZe70dEmhs_J2mpDyFSyQzWPAxnjYc&client_id=on-route-bc-direct-4598&tab_id=KAxYXjoatGc - GET - true - false - true - false - - - - - - - - - Host - ${KEYCLOAK_LOGIN_URL} - - - Connection - keep-alive - - - Upgrade-Insecure-Requests - 1 - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Accept - text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - navigate - - - Sec-Fetch-User - ?1 - - - Sec-Fetch-Dest - document - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - sec-ch-ua-mobile - ?0 - - - sec-ch-ua-platform - "Windows" - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - Cookie - AUTH_SESSION_ID=0e56ff7b-e277-400f-84f5-25801c43c829.ycloak-78b4c74bcf-kh476; AUTH_SESSION_ID_LEGACY=0e56ff7b-e277-400f-84f5-25801c43c829.ycloak-78b4c74bcf-kh476; KC_RESTART=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICIzMmI0MzNkNC02NjgwLTQxODMtOTc2Yy1kZDdjMTg0YjExMTQifQ.eyJjaWQiOiJvbi1yb3V0ZS1iYy1kaXJlY3QtNDU5OCIsInB0eSI6Im9wZW5pZC1jb25uZWN0IiwicnVyaSI6Imh0dHBzOi8vb25yb3V0ZWJjLXRlc3QtZnJvbnRlbmQuYXBwcy5zaWx2ZXIuZGV2b3BzLmdvdi5iYy5jYS8iLCJhY3QiOiJBVVRIRU5USUNBVEUiLCJub3RlcyI6eyJzY29wZSI6Im9wZW5pZCIsImlzcyI6Imh0dHBzOi8vdGVzdC5sb2dpbnByb3h5Lmdvdi5iYy5jYS9hdXRoL3JlYWxtcy9zdGFuZGFyZCIsInJlc3BvbnNlX3R5cGUiOiJjb2RlIiwiY29kZV9jaGFsbGVuZ2VfbWV0aG9kIjoiUzI1NiIsInJlZGlyZWN0X3VyaSI6Imh0dHBzOi8vb25yb3V0ZWJjLXRlc3QtZnJvbnRlbmQuYXBwcy5zaWx2ZXIuZGV2b3BzLmdvdi5iYy5jYS8iLCJzdGF0ZSI6IjdiZTBmNDk4ZGRmYTQ1ZTI4ZWU4ZjI0MTY0NzViYTQyIiwiY29kZV9jaGFsbGVuZ2UiOiJCNEpzelBjUzBIT1c3RUNUVFVVUkMxbXA2ejhhdDJiNkswbEQxdUtfMTFBIiwia2NfaWRwX2hpbnQiOiJiY2VpZGJvdGgiLCJyZXNwb25zZV9tb2RlIjoicXVlcnkifX0.2dLZTTjk8ZY0EFAaE88sAWQlfo7T17XcYLztnQwI_Yk; _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; FAILREASON=0; SMSESSION=LOGGEDOFF - - - - - - - - - - false - - = - true - - - - - - - - https://${KEYCLOAK_LOGIN_URL}/auth/realms/bceidboth/protocol/openid-connect/auth?scope=openid&state=JvIyfmoj0AzmBZWw0ZS8lBmhMJXd7lA_uAR8JQvLNlE.KAxYXjoatGc.on-route-bc-direct-4598&response_type=code&client_id=standard-realm&redirect_uri=https%3A%2F%2F${KEYCLOAK_LOGIN_URL}%2Fauth%2Frealms%2Fstandard%2Fbroker%2Fbceidboth%2Fendpoint&nonce=1sKWmdZ0aV6QIscb65Lrmg - GET - true - false - true - false - - - - - - - - - Host - ${KEYCLOAK_LOGIN_URL} - - - Connection - keep-alive - - - Upgrade-Insecure-Requests - 1 - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Accept - text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - navigate - - - Sec-Fetch-User - ?1 - - - Sec-Fetch-Dest - document - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - sec-ch-ua-mobile - ?0 - - - sec-ch-ua-platform - "Windows" - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - Cookie - AUTH_SESSION_ID=33769057-e4e2-49e9-821b-bab26d4e7507.ycloak-78b4c74bcf-gj9d6; AUTH_SESSION_ID_LEGACY=33769057-e4e2-49e9-821b-bab26d4e7507.ycloak-78b4c74bcf-gj9d6; KEYCLOAK_IDENTITY=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI1ZjExNjBiNS03Y2RjLTQ5NGQtYmFkOS0yZGRkNjU3MDU5Y2UifQ.eyJleHAiOjE2OTg3MzE3MzQsImlhdCI6MTY5ODY5NTczNCwianRpIjoiNzY3ZDEzMGEtMzczMC00NDdhLWEzNTUtNjhhNDhiMjgzZTI3IiwiaXNzIjoiaHR0cHM6Ly90ZXN0LmxvZ2lucHJveHkuZ292LmJjLmNhL2F1dGgvcmVhbG1zL2JjZWlkYm90aCIsInN1YiI6ImQ3M2FiN2IwLWUyMmEtNDg0NC04Yzc3LWU3YTQ2ODQyOTNmZCIsInR5cCI6IlNlcmlhbGl6ZWQtSUQiLCJzZXNzaW9uX3N0YXRlIjoiMzM3NjkwNTctZTRlMi00OWU5LTgyMWItYmFiMjZkNGU3NTA3Iiwic2lkIjoiMzM3NjkwNTctZTRlMi00OWU5LTgyMWItYmFiMjZkNGU3NTA3Iiwic3RhdGVfY2hlY2tlciI6Ik9SWEI4amY3Q3hPUWhzTUNhWU5nMHF2WHNzZG52cnlxUHFjMnFpUkthZncifQ.1kpL3Qpg4pyqSLBE0iDz7WZ0fdGzCCf6RCiN6HvFWqE; KEYCLOAK_IDENTITY_LEGACY=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI1ZjExNjBiNS03Y2RjLTQ5NGQtYmFkOS0yZGRkNjU3MDU5Y2UifQ.eyJleHAiOjE2OTg3MzE3MzQsImlhdCI6MTY5ODY5NTczNCwianRpIjoiNzY3ZDEzMGEtMzczMC00NDdhLWEzNTUtNjhhNDhiMjgzZTI3IiwiaXNzIjoiaHR0cHM6Ly90ZXN0LmxvZ2lucHJveHkuZ292LmJjLmNhL2F1dGgvcmVhbG1zL2JjZWlkYm90aCIsInN1YiI6ImQ3M2FiN2IwLWUyMmEtNDg0NC04Yzc3LWU3YTQ2ODQyOTNmZCIsInR5cCI6IlNlcmlhbGl6ZWQtSUQiLCJzZXNzaW9uX3N0YXRlIjoiMzM3NjkwNTctZTRlMi00OWU5LTgyMWItYmFiMjZkNGU3NTA3Iiwic2lkIjoiMzM3NjkwNTctZTRlMi00OWU5LTgyMWItYmFiMjZkNGU3NTA3Iiwic3RhdGVfY2hlY2tlciI6Ik9SWEI4amY3Q3hPUWhzTUNhWU5nMHF2WHNzZG52cnlxUHFjMnFpUkthZncifQ.1kpL3Qpg4pyqSLBE0iDz7WZ0fdGzCCf6RCiN6HvFWqE; KEYCLOAK_SESSION=bceidboth/d73ab7b0-e22a-4844-8c77-e7a4684293fd/33769057-e4e2-49e9-821b-bab26d4e7507; KEYCLOAK_SESSION_LEGACY=bceidboth/d73ab7b0-e22a-4844-8c77-e7a4684293fd/33769057-e4e2-49e9-821b-bab26d4e7507; _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; FAILREASON=0; SMSESSION=LOGGEDOFF - - - - - - - - - - false - - = - true - - - - - - - - https://${KEYCLOAK_LOGIN_URL}/auth/realms/bceidboth/broker/bceidboth/login?session_code=oRr0p7JZ9oL7vptnFPfNKhf_nrB8DND1rBojsNPjot0&client_id=standard-realm&tab_id=k5Vw5BDlfVQ - GET - true - false - true - false - - - - - - - - - Host - ${KEYCLOAK_LOGIN_URL} - - - Connection - keep-alive - - - Upgrade-Insecure-Requests - 1 - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Accept - text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - navigate - - - Sec-Fetch-User - ?1 - - - Sec-Fetch-Dest - document - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - sec-ch-ua-mobile - ?0 - - - sec-ch-ua-platform - "Windows" - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - Cookie - AUTH_SESSION_ID=f26f78a0-28d2-40b4-9e57-b83fa590e32e.ycloak-78b4c74bcf-vtmwp; AUTH_SESSION_ID_LEGACY=f26f78a0-28d2-40b4-9e57-b83fa590e32e.ycloak-78b4c74bcf-vtmwp; KC_RESTART=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI1ZjExNjBiNS03Y2RjLTQ5NGQtYmFkOS0yZGRkNjU3MDU5Y2UifQ.eyJjaWQiOiJzdGFuZGFyZC1yZWFsbSIsInB0eSI6Im9wZW5pZC1jb25uZWN0IiwicnVyaSI6Imh0dHBzOi8vdGVzdC5sb2dpbnByb3h5Lmdvdi5iYy5jYS9hdXRoL3JlYWxtcy9zdGFuZGFyZC9icm9rZXIvYmNlaWRib3RoL2VuZHBvaW50IiwiYWN0IjoiQVVUSEVOVElDQVRFIiwibm90ZXMiOnsic2NvcGUiOiJvcGVuaWQiLCJpc3MiOiJodHRwczovL3Rlc3QubG9naW5wcm94eS5nb3YuYmMuY2EvYXV0aC9yZWFsbXMvYmNlaWRib3RoIiwicmVzcG9uc2VfdHlwZSI6ImNvZGUiLCJyZWRpcmVjdF91cmkiOiJodHRwczovL3Rlc3QubG9naW5wcm94eS5nb3YuYmMuY2EvYXV0aC9yZWFsbXMvc3RhbmRhcmQvYnJva2VyL2JjZWlkYm90aC9lbmRwb2ludCIsInN0YXRlIjoiSnZJeWZtb2owQXptQlpXdzBaUzhsQm1oTUpYZDdsQV91QVI4SlF2TE5sRS5LQXhZWGpvYXRHYy5vbi1yb3V0ZS1iYy1kaXJlY3QtNDU5OCIsIm5vbmNlIjoiMXNLV21kWjBhVjZRSXNjYjY1THJtZyJ9fQ.08S_Qi57kTkuLj_eH5VElw2zeuH4AVhfOUois5IUzEI; _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; FAILREASON=0; SMSESSION=LOGGEDOFF - - - - - - - - - - false - - = - true - - - - - - - - https://${SITEMINDER_URL}/clp-cgi/capBceid/logon.cgi?flags=0101:0,7&TYPE=33554433&REALMOID=06-b02c7ed2-895e-4953-bd03-8008c64ec906&GUID=&SMAUTHREASON=0&METHOD=GET&SMAGENTNAME=$SM$Lk6VtkyHw8x3zQIIsMiOiEXYFJF%2fJzjVT7eioCjxBjJck5VMlbxxrR%2bLZSo%2flIBX&TARGET=$SM$HTTPS%3a%2f%2fsfstest7%2egov%2ebc%2eca%2faffwebservices%2fredirectjsp%2ftestkeycloak-basicbusinessbceid%2fredirect%2ejsp%3fSMPORTALURL%3dhttps$%3A$%2F$%2Fsfstest7%2egov%2ebc%2eca$%2Faffwebservices$%2Fpublic$%2Fsaml2sso%26SAMLTRANSACTIONID%3dc9f189ad-7324de1b-2e045e1a-e8bcf162-a78af00c-c5 - GET - true - false - true - false - - - - - - - - - Host - ${SITEMINDER_URL} - - - Connection - keep-alive - - - Cache-Control - max-age=0 - - - Upgrade-Insecure-Requests - 1 - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Accept - text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - navigate - - - Sec-Fetch-Dest - document - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - sec-ch-ua-mobile - ?0 - - - sec-ch-ua-platform - "Windows" - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - Cookie - _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; Dummy1=DummyVal1; BCGOVFlags=0101%3A0%2C7; BCGOVCustom=NULL; BCGOVBrand=NULL; BCGOVBehavior=NULL; Dummy2=DummyVal2; preDummy1=DummyVal1; preDummy2=DummyVal2; preDummy3=DummyVal3; BCGOVDoNotShow=1; preDummy4=DummyVal4; FAILREASON=0; BCGOVTarget=HTTPS%3A%2F%2Fsfstest7.gov.bc.ca%2Faffwebservices%2Fredirectjsp%2Ftestkeycloak-basicbusinessbceid%2Fredirect.jsp%3FSMPORTALURL%3Dhttps%253A%252F%252Fsfstest7.gov.bc.ca%252Faffwebservices%252Fpublic%252Fsaml2sso%26SAMLTRANSACTIONID%3Df7917115-57286b4a-df9cf6ff-b50e2f11-c566ac5a-f6; BCGOVclptryno=0; clp001=0; SMSESSION=LOGGEDOFF; SMFED_OLD_SESSION=""; SMFED_OLD_IDENTITY=""; GUID=1:26feb557-62af2c8c-4ef3a8d7-2e2277be-6a76895c-697 - - - - - - - true - - - - false - instance=instance_capBceid&user=ORBCTST3&password=orbcTST%2B2023 - = - - - - - - - - https://${SITEMINDER_URL}/clp-cgi/preLogon.cgi - POST - true - false - true - false - - - - - - - - - Host - ${SITEMINDER_URL} - - - Connection - keep-alive - - - Content-Length - 64 - - - Cache-Control - max-age=0 - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - sec-ch-ua-mobile - ?0 - - - sec-ch-ua-platform - "Windows" - - - Upgrade-Insecure-Requests - 1 - - - Origin - https://${SITEMINDER_URL} - - - Content-Type - application/x-www-form-urlencoded - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Accept - text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 - - - Sec-Fetch-Site - same-origin - - - Sec-Fetch-Mode - navigate - - - Sec-Fetch-User - ?1 - - - Sec-Fetch-Dest - document - - - Referer - https://${SITEMINDER_URL}/clp-cgi/capBceid/logon.cgi?flags=0101:0,7&TYPE=33554433&REALMOID=06-b02c7ed2-895e-4953-bd03-8008c64ec906&GUID=&SMAUTHREASON=0&METHOD=GET&SMAGENTNAME=$SM$Lk6VtkyHw8x3zQIIsMiOiEXYFJF%2fJzjVT7eioCjxBjJck5VMlbxxrR%2bLZSo%2flIBX&TARGET=$SM$HTTPS%3a%2f%2fsfstest7%2egov%2ebc%2eca%2faffwebservices%2fredirectjsp%2ftestkeycloak-basicbusinessbceid%2fredirect%2ejsp%3fSMPORTALURL%3dhttps$%3A$%2F$%2Fsfstest7%2egov%2ebc%2eca$%2Faffwebservices$%2Fpublic$%2Fsaml2sso%26SAMLTRANSACTIONID%3dc9f189ad-7324de1b-2e045e1a-e8bcf162-a78af00c-c5 - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - Cookie - _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; Dummy1=DummyVal1; BCGOVFlags=0101%3A0%2C7; BCGOVCustom=NULL; BCGOVBrand=NULL; BCGOVBehavior=NULL; Dummy2=DummyVal2; preDummy1=DummyVal1; preDummy2=DummyVal2; preDummy3=DummyVal3; BCGOVDoNotShow=1; preDummy4=DummyVal4; FAILREASON=0; clp001=0; SMSESSION=LOGGEDOFF; SMFED_OLD_SESSION=""; SMFED_OLD_IDENTITY=""; GUID=1:26feb557-62af2c8c-4ef3a8d7-2e2277be-6a76895c-697; BCGOVTarget=HTTPS%3A%2F%2Fsfstest7.gov.bc.ca%2Faffwebservices%2Fredirectjsp%2Ftestkeycloak-basicbusinessbceid%2Fredirect.jsp%3FSMPORTALURL%3Dhttps%253A%252F%252Fsfstest7.gov.bc.ca%252Faffwebservices%252Fpublic%252Fsaml2sso%26SAMLTRANSACTIONID%3Dc9f189ad-7324de1b-2e045e1a-e8bcf162-a78af00c-c5; BCGOVclptryno=1 - - - - - - - true - - - - false - SMENC=ISO-8859-1&SMLOCALE=US-EN&target=%2Fclp-cgi%2Fcap07%2Fprivate%2FpostLogon.cgi&smauthreason=0&smagentname=&user=ORBCTST3&password=orbcTST%2B2023 - = - - - - - - - - https://${SITEMINDER_URL}/clp-cgi/cap07/logon.fcc - POST - true - false - true - false - - - - - - - - - Host - ${SITEMINDER_URL} - - - Connection - keep-alive - - - Content-Length - 149 - - - Cache-Control - max-age=0 - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - sec-ch-ua-mobile - ?0 - - - sec-ch-ua-platform - "Windows" - - - Upgrade-Insecure-Requests - 1 - - - Origin - https://${SITEMINDER_URL} - - - Content-Type - application/x-www-form-urlencoded - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Accept - text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 - - - Sec-Fetch-Site - same-origin - - - Sec-Fetch-Mode - navigate - - - Sec-Fetch-Dest - document - - - Referer - https://${SITEMINDER_URL}/clp-cgi/preLogon.cgi - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - Cookie - _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; Dummy1=DummyVal1; BCGOVFlags=0101%3A0%2C7; BCGOVCustom=NULL; BCGOVBrand=NULL; BCGOVBehavior=NULL; Dummy2=DummyVal2; preDummy1=DummyVal1; preDummy2=DummyVal2; preDummy3=DummyVal3; BCGOVDoNotShow=1; preDummy4=DummyVal4; FAILREASON=0; SMSESSION=LOGGEDOFF; SMFED_OLD_SESSION=""; SMFED_OLD_IDENTITY=""; GUID=1:26feb557-62af2c8c-4ef3a8d7-2e2277be-6a76895c-697; BCGOVTarget=HTTPS%3A%2F%2Fsfstest7.gov.bc.ca%2Faffwebservices%2Fredirectjsp%2Ftestkeycloak-basicbusinessbceid%2Fredirect.jsp%3FSMPORTALURL%3Dhttps%253A%252F%252Fsfstest7.gov.bc.ca%252Faffwebservices%252Fpublic%252Fsaml2sso%26SAMLTRANSACTIONID%3Dc9f189ad-7324de1b-2e045e1a-e8bcf162-a78af00c-c5; BCGOVclptryno=1; clp001=Salted__%8E%F5%14%93%F3.%C8%8C%C2%B3%84%8B%8EC%E0%88%AAK%01%C77%B6%C4g%C3%D2%3ELS%06%7CdJp%18%E9TJ%8A%D3a%A9%AD%3C%5E%DBZ%D7 - - - - - - - - - - false - - = - true - - - - - - - - https://${SITEMINDER_URL}/clp-cgi/cap07/private/postLogon.cgi - GET - true - false - true - false - - - - - - - - - Host - ${SITEMINDER_URL} - - - Connection - keep-alive - - - Cache-Control - max-age=0 - - - Upgrade-Insecure-Requests - 1 - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Accept - text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 - - - Sec-Fetch-Site - same-origin - - - Sec-Fetch-Mode - navigate - - - Sec-Fetch-Dest - document - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - sec-ch-ua-mobile - ?0 - - - sec-ch-ua-platform - "Windows" - - - Referer - https://${SITEMINDER_URL}/clp-cgi/preLogon.cgi - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - Cookie - _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; Dummy1=DummyVal1; BCGOVFlags=0101%3A0%2C7; BCGOVCustom=NULL; BCGOVBrand=NULL; BCGOVBehavior=NULL; Dummy2=DummyVal2; preDummy1=DummyVal1; preDummy2=DummyVal2; preDummy3=DummyVal3; BCGOVDoNotShow=1; preDummy4=DummyVal4; FAILREASON=0; SMSESSION=LOGGEDOFF; SMFED_OLD_SESSION=""; SMFED_OLD_IDENTITY=""; GUID=1:26feb557-62af2c8c-4ef3a8d7-2e2277be-6a76895c-697; BCGOVTarget=HTTPS%3A%2F%2Fsfstest7.gov.bc.ca%2Faffwebservices%2Fredirectjsp%2Ftestkeycloak-basicbusinessbceid%2Fredirect.jsp%3FSMPORTALURL%3Dhttps%253A%252F%252Fsfstest7.gov.bc.ca%252Faffwebservices%252Fpublic%252Fsaml2sso%26SAMLTRANSACTIONID%3Dc9f189ad-7324de1b-2e045e1a-e8bcf162-a78af00c-c5; BCGOVclptryno=1; clp001=Salted__%8E%F5%14%93%F3.%C8%8C%C2%B3%84%8B%8EC%E0%88%AAK%01%C77%B6%C4g%C3%D2%3ELS%06%7CdJp%18%E9TJ%8A%D3a%A9%AD%3C%5E%DBZ%D7; FORMCRED=2ZS4S2F4tb41FWGyAD293ZV3eiMsCRYZ+ktOitYzjWY/fG/2BFtCWHSnbkvgJfBEm8aTuwAg3nMfeG0h8ahL0C1Q+SZp1d30x/imUNpQkjqP7yK+smpXGQMNWzNb15A+UXcYa0yUQLQ5rFoH720FIoiqZ4Nmikk7a67vktQxd8rpIduHeZJ7tAYb/b+pXPha - - - - - - - true - - - - false - RelayState=pkQKGHDSoVdRPpUZ1XHJWrVAUBtEl2EOcIu2bUhv0V0.k5Vw5BDlfVQ.standard-realm&SAMLResponse=PG5zNTpSZXNwb25zZSB4bWxuczpuczU9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpwcm90b2NvbCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDkveG1sZW5jMTEjIiB4bWxuczpuczI9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphc3NlcnRpb24iIHhtbG5zOm5zMz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyIgeG1sbnM6bnM0PSJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzA0L3htbGVuYyMiIERlc3RpbmF0aW9uPSJodHRwczovL3Rlc3QubG9naW5wcm94eS5nb3YuYmMuY2EvYXV0aC9yZWFsbXMvYmNlaWRib3RoL2Jyb2tlci9iY2VpZGJvdGgvZW5kcG9pbnQiIElEPSJfMzU0NWZlNjJmOGY3OThhNTk1ZWNlM2I2YzYxM2RmNmU5ZWFkIiBJblJlc3BvbnNlVG89IklEX2FhYTM1M2Q0LTdlNmMtNDQxNS05N2FkLWI2NmEzM2FhOTBkYyIgSXNzdWVJbnN0YW50PSIyMDIzLTEwLTMwVDE5OjU2OjM3LjE4MFoiIFZlcnNpb249IjIuMCI%2BDQogICAgPG5zMjpJc3N1ZXIgRm9ybWF0PSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6bmFtZWlkLWZvcm1hdDplbnRpdHkiPmh0dHBzOi8vdGVzdC5sb2dpbnByb3h5Lmdvdi5iYy5jYS9hdXRoL3JlYWxtcy9fYmNlaWRiYXNpY2J1c2luZXNzMS88L25zMjpJc3N1ZXI%2BDQogICAgPG5zNTpTdGF0dXM%2BDQogICAgICAgIDxuczU6U3RhdHVzQ29kZSBWYWx1ZT0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOnN0YXR1czpTdWNjZXNzIi8%2BDQogICAgPC9uczU6U3RhdHVzPg0KICAgIDxuczI6QXNzZXJ0aW9uIElEPSJfZWFmZTRjYWQ5MjU0MTEyZjQ5YTcxMDI1MGM3YjVhNDVjYmI2IiBJc3N1ZUluc3RhbnQ9IjIwMjMtMTAtMzBUMTk6NTY6MzcuMTgwWiIgVmVyc2lvbj0iMi4wIiB4bWxuczpuczI9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphc3NlcnRpb24iPg0KICAgICAgICA8bnMyOklzc3VlciBGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpuYW1laWQtZm9ybWF0OmVudGl0eSI%2BaHR0cHM6Ly90ZXN0LmxvZ2lucHJveHkuZ292LmJjLmNhL2F1dGgvcmVhbG1zL19iY2VpZGJhc2ljYnVzaW5lc3MxLzwvbnMyOklzc3Vlcj48ZHM6U2lnbmF0dXJlIHhtbG5zOmRzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIj48ZHM6U2lnbmVkSW5mbz48ZHM6Q2Fub25pY2FsaXphdGlvbk1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvMTAveG1sLWV4Yy1jMTRuIyIvPjxkczpTaWduYXR1cmVNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzA0L3htbGRzaWctbW9yZSNyc2Etc2hhMjU2Ii8%2BPGRzOlJlZmVyZW5jZSBVUkk9IiNfZWFmZTRjYWQ5MjU0MTEyZjQ5YTcxMDI1MGM3YjVhNDVjYmI2Ij48ZHM6VHJhbnNmb3Jtcz48ZHM6VHJhbnNmb3JtIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI2VudmVsb3BlZC1zaWduYXR1cmUiLz48ZHM6VHJhbnNmb3JtIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS8xMC94bWwtZXhjLWMxNG4jIi8%2BPC9kczpUcmFuc2Zvcm1zPjxkczpEaWdlc3RNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzA0L3htbGVuYyNzaGEyNTYiLz48ZHM6RGlnZXN0VmFsdWU%2BS0c3SWRyMko3ODNGVGFkNkVZM0hHUklyRFpnUXU1TmdOQ1JBRU1vcERkYz08L2RzOkRpZ2VzdFZhbHVlPjwvZHM6UmVmZXJlbmNlPjwvZHM6U2lnbmVkSW5mbz48ZHM6U2lnbmF0dXJlVmFsdWU%2BbHJlNnpwalpyUEpKZmVqYStkUHN3cUhlVDN6a3VkNjA4emppZE4vWlBRMjdmSW56aHFWQ2lreDhHcld4V29jSWM4ekhHb1cxZmJqTXlBSkIwNnRHS2pXdzBXMWExTlIyL2VlVGQ1MFY1RnF4NndIb001NFVmYUkvY0N6dDdsMUNUQ2lHZzB6UkVLZjRDK3RxcWJaQ3QyRlFCQ20vd0xaNHRrdXVsZUh4WTZqdGJxWXBlbmpvSzQ2TGlocE1CejIvczBDRmQ3c1BxVjF4bHJpWXVtd1dtSlV1b0o1d0M1L2ZMZ3djTUlmSVMwd29SZmQzclBTN1pBWk5vWXExVVpWQ2xmemZMZ1hNc3JsM2k2S0F3SS80N01pSVpzeGNaaFd1Q3dMTFdFSXdzRWQzWlNLZFhXUTF1U0RrSGlIUGIrcXFmSTJQRGJwK2l1bHFDdlo2S3BCVzdnPT08L2RzOlNpZ25hdHVyZVZhbHVlPjxkczpLZXlJbmZvIHhtbG5zOmRzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIj48ZHM6WDUwOURhdGE%2BPGRzOlg1MDlDZXJ0aWZpY2F0ZT5NSUlFQ3pDQ0F2TUNDUUNkb1dONFh0VUk2VEFOQmdrcWhraUc5dzBCQVFzRkFEQ0J5akVMTUFrR0ExVUVCaE1DUTBFeEdUQVhCZ05WQkFnVEVFSnlhWFJwYzJnZ1EyOXNkVzFpYVdFeEVUQVBCZ05WQkFjVENGWnBZM1J2Y21saE1UY3dOUVlEVlFRS0V5NUhiM1psY201dFpXNTBJRzltSUhSb1pTQlFjbTkyYVc1alpTQnZaaUJDY21sMGFYTm9JRU52YkhWdFltbGhNUTh3RFFZRFZRUUxFd1pUUmxNdFEwRXhJakFnQmdOVkJBTVRHVk5HVXlCRFpYSjBhV1pwWTJGMFpTQkJkWFJvYjNKcGRIa3hIekFkQmdrcWhraUc5dzBCQ1FFV0VGZFVVMWRCVFVCbmIzWXVZbU11WTJFd0hoY05NVE13TkRBMU1qSTFOalUzV2hjTk16TXdOREExTWpJMU5qVTNXakNCd3pFTE1Ba0dBMVVFQmhNQ1EwRXhHVEFYQmdOVkJBZ1RFRUp5YVhScGMyZ2dRMjlzZFcxaWFXRXhFVEFQQmdOVkJBY1RDRlpwWTNSdmNtbGhNVGN3TlFZRFZRUUtFeTVIYjNabGNtNXRaVzUwSUc5bUlIUm9aU0JRY205MmFXNWpaU0J2WmlCQ2NtbDBhWE5vSUVOdmJIVnRZbWxoTVF3d0NnWURWUVFMRXdOVFJsTXhIakFjQmdOVkJBTVRGWE5tY3kxelpuTjBaWE4wTG1kdmRpNWlZeTVqWVRFZk1CMEdDU3FHU0liM0RRRUpBUllRVjFSVFYwRk5RR2R2ZGk1aVl5NWpZVENDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFKdzVFMDQ1amxKK3NiU2dOZmt2eUpBMysyN0tSQm1BbHErTVVSb1IzT1NpV2MyME1XZHQ1cEt4ZFJVcTJmWXhyUWp0cnRQdUdxa2tFR2FlSTBpTlp3UkluYnk2SHU2dWJDd2YxUTdmVGxXNzhscytDak5rWU5VQzMvd3VDM21uMVFuZzhVMGxkUTd0UVU0Y1BPcXdMSXZTaUpkaUpacm1GOFJEcHBvZFljSGhiaWo3N3Q2dGlIVkN4UVlncXhOY3V0M2d3bnhWcjI0MTZ5V0hYVnFxcGNjS0xUaUkvSm9lQ2I1b0kyVVVDcmRldnlXZDRINXFOWmx5NGhMNVBCQ1lZNFR1cFVheWpoYldmeEpLNFVXY0R2N09PYSt1eHE0a1luR2V4RHBxQ2JXNmJ2Y0hiazQ3UDVSQVpJdmd2bkdvQmdTZm9oMzd6eFEvRnA2VkU0aVdBdWNDQXdFQUFUQU5CZ2txaGtpRzl3MEJBUXNGQUFPQ0FRRUFiZGtqUTl1SHB2ZGtTZUlHT25meHU0Vm5mM2pHTzR5bzgrQnJub0dhTEM4aTJDV21Wb2RpOUdPdTNIM2pyR3ZzU296N242QzJBK3ZJdkR4dkE3dHdqd0xBcXVaVlFKbkJDcE1LbXdsUENBQ0F3WitFbGI0cjJxTW14YTJGbTBJZVl6M3gyQldZT0FUdGljODFmRnpoSjhRa1dCdXdiOStkSiswbC9HR1FmOXBPMnFpSXFVRWQyb0lVVkR4cVdSWXpoUGV6ZWpwZlZqQnNUUFhZNXhRaGRCVUtITXIwWnBTVTlrTW9KemNNMW42bEpIN3BGSFpCVUtONzkyaG9FNTVPbEszTFFMVW9oKzNXNEROL1lWS2tEczZrSHI0b0w2dXo5ajJXODRIVVBYNURMbUZGaUorTHBTMDUyVkJ0WWNoangyQnQwRlBzSEpKNEMwRjByNUc0b3c9PTwvZHM6WDUwOUNlcnRpZmljYXRlPjwvZHM6WDUwOURhdGE%2BPC9kczpLZXlJbmZvPjwvZHM6U2lnbmF0dXJlPg0KICAgICAgICA8bnMyOlN1YmplY3Q%2BDQogICAgICAgICAgICA8bnMyOk5hbWVJRCBGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpuYW1laWQtZm9ybWF0OnBlcnNpc3RlbnQiPkE5RUQyQzU3NDJEQzQ1NTk5ODY3MkNDMkExMTgxNzRCPC9uczI6TmFtZUlEPg0KICAgICAgICAgICAgPG5zMjpTdWJqZWN0Q29uZmlybWF0aW9uIE1ldGhvZD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmNtOmJlYXJlciI%2BDQogICAgICAgICAgICAgICAgPG5zMjpTdWJqZWN0Q29uZmlybWF0aW9uRGF0YSBJblJlc3BvbnNlVG89IklEX2FhYTM1M2Q0LTdlNmMtNDQxNS05N2FkLWI2NmEzM2FhOTBkYyIgTm90T25PckFmdGVyPSIyMDIzLTEwLTMwVDE5OjU4OjA3LjE0OFoiIFJlY2lwaWVudD0iaHR0cHM6Ly90ZXN0LmxvZ2lucHJveHkuZ292LmJjLmNhL2F1dGgvcmVhbG1zL2JjZWlkYm90aC9icm9rZXIvYmNlaWRib3RoL2VuZHBvaW50Ii8%2BDQogICAgICAgICAgICA8L25zMjpTdWJqZWN0Q29uZmlybWF0aW9uPg0KICAgICAgICA8L25zMjpTdWJqZWN0Pg0KICAgICAgICA8bnMyOkNvbmRpdGlvbnMgTm90QmVmb3JlPSIyMDIzLTEwLTMwVDE5OjU2OjA3LjE0OFoiIE5vdE9uT3JBZnRlcj0iMjAyMy0xMC0zMFQxOTo1ODowNy4xNDhaIj4NCiAgICAgICAgICAgIDxuczI6QXVkaWVuY2VSZXN0cmljdGlvbj4NCiAgICAgICAgICAgICAgICA8bnMyOkF1ZGllbmNlPmh0dHBzOi8vdGVzdC5sb2dpbnByb3h5Lmdvdi5iYy5jYS9hdXRoL3JlYWxtcy9fYmNlaWRiYXNpY2J1c2luZXNzMS88L25zMjpBdWRpZW5jZT4NCiAgICAgICAgICAgIDwvbnMyOkF1ZGllbmNlUmVzdHJpY3Rpb24%2BDQogICAgICAgIDwvbnMyOkNvbmRpdGlvbnM%2BDQogICAgICAgIDxuczI6QXV0aG5TdGF0ZW1lbnQgQXV0aG5JbnN0YW50PSIyMDIzLTEwLTMwVDE5OjU2OjM1LjEzMloiIFNlc3Npb25JbmRleD0ibGdlQ1pvN01aRnpJaFFiU1dGcXg1SDJiK1U0PXlMMWRQUT09IiBTZXNzaW9uTm90T25PckFmdGVyPSIyMDIzLTEwLTMwVDE5OjU4OjA3LjEzMloiPg0KICAgICAgICAgICAgPG5zMjpBdXRobkNvbnRleHQ%2BDQogICAgICAgICAgICAgICAgPG5zMjpBdXRobkNvbnRleHRDbGFzc1JlZj51cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6YWM6Y2xhc3NlczpQYXNzd29yZDwvbnMyOkF1dGhuQ29udGV4dENsYXNzUmVmPg0KICAgICAgICAgICAgPC9uczI6QXV0aG5Db250ZXh0Pg0KICAgICAgICA8L25zMjpBdXRoblN0YXRlbWVudD4NCiAgICAgICAgPG5zMjpBdHRyaWJ1dGVTdGF0ZW1lbnQ%2BDQogICAgICAgICAgICA8bnMyOkF0dHJpYnV0ZSBOYW1lPSJiY2VpZF91c2VybmFtZSIgTmFtZUZvcm1hdD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmF0dHJuYW1lLWZvcm1hdDp1bnNwZWNpZmllZCI%2BDQogICAgICAgICAgICAgICAgPG5zMjpBdHRyaWJ1dGVWYWx1ZSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTp0eXBlPSJ4czpzdHJpbmciPk9SQkNUU1QzPC9uczI6QXR0cmlidXRlVmFsdWU%2BDQogICAgICAgICAgICA8L25zMjpBdHRyaWJ1dGU%2BDQogICAgICAgICAgICA8bnMyOkF0dHJpYnV0ZSBOYW1lPSJkaXNwbGF5X25hbWUiIE5hbWVGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphdHRybmFtZS1mb3JtYXQ6dW5zcGVjaWZpZWQiPg0KICAgICAgICAgICAgICAgIDxuczI6QXR0cmlidXRlVmFsdWUgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6dHlwZT0ieHM6c3RyaW5nIj5CcnlhbiBMYW5lPC9uczI6QXR0cmlidXRlVmFsdWU%2BDQogICAgICAgICAgICA8L25zMjpBdHRyaWJ1dGU%2BDQogICAgICAgICAgICA8bnMyOkF0dHJpYnV0ZSBOYW1lPSJiY2VpZF91c2VyX2d1aWQiIE5hbWVGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphdHRybmFtZS1mb3JtYXQ6dW5zcGVjaWZpZWQiPg0KICAgICAgICAgICAgICAgIDxuczI6QXR0cmlidXRlVmFsdWUgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6dHlwZT0ieHM6c3RyaW5nIj5BOUVEMkM1NzQyREM0NTU5OTg2NzJDQzJBMTE4MTc0QjwvbnMyOkF0dHJpYnV0ZVZhbHVlPg0KICAgICAgICAgICAgPC9uczI6QXR0cmlidXRlPg0KICAgICAgICAgICAgPG5zMjpBdHRyaWJ1dGUgTmFtZT0iZW1haWwiIE5hbWVGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphdHRybmFtZS1mb3JtYXQ6dW5zcGVjaWZpZWQiPg0KICAgICAgICAgICAgICAgIDxuczI6QXR0cmlidXRlVmFsdWUgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6dHlwZT0ieHM6c3RyaW5nIj5icnlhbi5sYW5lQGdvdi5iYy5jYTwvbnMyOkF0dHJpYnV0ZVZhbHVlPg0KICAgICAgICAgICAgPC9uczI6QXR0cmlidXRlPg0KICAgICAgICA8bnMyOkF0dHJpYnV0ZSBOYW1lPSJTTUdPVl9CVVNJTkVTU0dVSUQiIE5hbWVGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphdHRybmFtZS1mb3JtYXQ6dW5zcGVjaWZpZWQiPjxuczI6QXR0cmlidXRlVmFsdWU%2BRjQwMjNEQjNDMzBGNDg3QjlBRjVCMTRDOTU4OTg5Rjg8L25zMjpBdHRyaWJ1dGVWYWx1ZT48L25zMjpBdHRyaWJ1dGU%2BPG5zMjpBdHRyaWJ1dGUgTmFtZT0iU01HT1ZfQlVTSU5FU1NMRUdBTE5BTUUiIE5hbWVGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphdHRybmFtZS1mb3JtYXQ6dW5zcGVjaWZpZWQiPjxuczI6QXR0cmlidXRlVmFsdWU%2BU29uaWMgRGVsaXZlcnkgU2VydmljZXM8L25zMjpBdHRyaWJ1dGVWYWx1ZT48L25zMjpBdHRyaWJ1dGU%2BPC9uczI6QXR0cmlidXRlU3RhdGVtZW50Pg0KICAgIDwvbnMyOkFzc2VydGlvbj4NCjwvbnM1OlJlc3BvbnNlPg%3D%3D - = - - - - - - - - https://${KEYCLOAK_LOGIN_URL}/auth/realms/bceidboth/broker/bceidboth/endpoint - POST - true - false - true - false - - - - - - - - - Host - ${KEYCLOAK_LOGIN_URL} - - - Connection - keep-alive - - - Content-Length - 9217 - - - Cache-Control - max-age=0 - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - sec-ch-ua-mobile - ?0 - - - sec-ch-ua-platform - "Windows" - - - Upgrade-Insecure-Requests - 1 - - - Origin - https://sfstest7.gov.bc.ca - - - Content-Type - application/x-www-form-urlencoded - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Accept - text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - navigate - - - Sec-Fetch-Dest - document - - - Referer - https://sfstest7.gov.bc.ca/ - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - Cookie - AUTH_SESSION_ID=f26f78a0-28d2-40b4-9e57-b83fa590e32e.ycloak-78b4c74bcf-vtmwp; AUTH_SESSION_ID_LEGACY=f26f78a0-28d2-40b4-9e57-b83fa590e32e.ycloak-78b4c74bcf-vtmwp; KC_RESTART=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI1ZjExNjBiNS03Y2RjLTQ5NGQtYmFkOS0yZGRkNjU3MDU5Y2UifQ.eyJjaWQiOiJzdGFuZGFyZC1yZWFsbSIsInB0eSI6Im9wZW5pZC1jb25uZWN0IiwicnVyaSI6Imh0dHBzOi8vdGVzdC5sb2dpbnByb3h5Lmdvdi5iYy5jYS9hdXRoL3JlYWxtcy9zdGFuZGFyZC9icm9rZXIvYmNlaWRib3RoL2VuZHBvaW50IiwiYWN0IjoiQVVUSEVOVElDQVRFIiwibm90ZXMiOnsic2NvcGUiOiJvcGVuaWQiLCJpc3MiOiJodHRwczovL3Rlc3QubG9naW5wcm94eS5nb3YuYmMuY2EvYXV0aC9yZWFsbXMvYmNlaWRib3RoIiwicmVzcG9uc2VfdHlwZSI6ImNvZGUiLCJyZWRpcmVjdF91cmkiOiJodHRwczovL3Rlc3QubG9naW5wcm94eS5nb3YuYmMuY2EvYXV0aC9yZWFsbXMvc3RhbmRhcmQvYnJva2VyL2JjZWlkYm90aC9lbmRwb2ludCIsInN0YXRlIjoiSnZJeWZtb2owQXptQlpXdzBaUzhsQm1oTUpYZDdsQV91QVI4SlF2TE5sRS5LQXhZWGpvYXRHYy5vbi1yb3V0ZS1iYy1kaXJlY3QtNDU5OCIsIm5vbmNlIjoiMXNLV21kWjBhVjZRSXNjYjY1THJtZyJ9fQ.08S_Qi57kTkuLj_eH5VElw2zeuH4AVhfOUois5IUzEI; _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; FAILREASON=0; SMSESSION=Awk9KIrMNenX09Vl2cEMuy/VxV9CFVP4fsBzCp8Zo3AX2VsrDVWkOMVOdJyoY1Q1J9F8Vs8XFBtHTU29qS7+jlhEMK3f9j8tgudEVWHJq8LTizGhEj1cf8r7CX2QuxWMbdAHvK90hFnpocsL5xv2cAaFVdqhBKlIYkzwkY+r0YuH3Uh6DJVIhAhwjWeKfO6BAg5/jNFxQ31EPvzn4N7RxJK2bGyfAxzi6Cs6O7ieJ10MzcB8nWSIsO4ksfG8pzeGp9a+arl4maKnd9Je2L2FQohmiOjfGcrsezOgLgiWFl1B3+EL8ytArvtKhsFvr7WJsQuhYsQYzfY8shcfhNSltyqxLD422bDmU3NyZdhWY9313YG5I1U2vbO7zvXhxaCJYnpMrJR+inz8XsyqnGY1xu7AepY3pNd2wJH3twQJ42N6R2WlJVVN3oc3DvEHUbk85xrqHdwngd/FiMdEC2f5Kt51VYp8G/3R+sbFiy6Wt7wlZw2+/wI8EfxXs31HQ5q/RDUTXz6JMbzsR7EUOF+WkOrgi1nDugu13/O9hDnxPJnkzNGEfjt0xPxdhoDdl4vWdwRe1awBEn90SyJwc8+cFk1XACtvWoGwtPdf1xnHUwx5Ge1TqEd46xdjjlu+iTw2Xu5AsESUVVw81STsKA7vC8EBabQ+yXQHZlNFcFCKa1+AutNxfWHNQtnFK03kUCai4ZPJc/TQrhvf9DWjSyX+KknWdV6aQyz65KOpwtQWpd4ZlqAAKvf9vCQIBgk+YdsxFzAq6ySnLPcBLbFvP+Xyo5bcABg8IS9aJr6+05KT3ZOv49G1uYvz1ILaDED83D5NHF57ZswKR2911SevaqIO2i8NkZAJUMBpgroSejoJ1MxzpL/a7I26u6+p/08uMt/dT7vuo5OTTjayEtIlXy1IRXA/jU/uX/pKk1JrsZFhhwj7G5KEQpMAx+YvZUaaidqyfj3+fLb6+rsa8BukV8x0zfgUg20dm+Wu9XjDvyQHFP4Qt65CaUbhAKcVTgCChgTfSSdUJZIPPa5Yhzr7SmTuVGmYV/1cC4jGzNdSqr3Fq28fWukiEnRtqfZRXlOdA6xb - - - - - - - - - - false - - = - true - - - - - - - - https://${KEYCLOAK_LOGIN_URL}/auth/realms/standard/broker/bceidboth/endpoint?state=JvIyfmoj0AzmBZWw0ZS8lBmhMJXd7lA_uAR8JQvLNlE.KAxYXjoatGc.on-route-bc-direct-4598&session_state=f26f78a0-28d2-40b4-9e57-b83fa590e32e&code=c5719177-78e8-4d75-857a-0ef191c765d1.f26f78a0-28d2-40b4-9e57-b83fa590e32e.1123d85b-badf-4084-a3a6-b1c920ccb0c0 - GET - true - false - true - false - - - - - - - - - Host - ${KEYCLOAK_LOGIN_URL} - - - Connection - keep-alive - - - Cache-Control - max-age=0 - - - Upgrade-Insecure-Requests - 1 - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Accept - text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - navigate - - - Sec-Fetch-Dest - document - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - sec-ch-ua-mobile - ?0 - - - sec-ch-ua-platform - "Windows" - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - Cookie - AUTH_SESSION_ID=0e56ff7b-e277-400f-84f5-25801c43c829.ycloak-78b4c74bcf-kh476; AUTH_SESSION_ID_LEGACY=0e56ff7b-e277-400f-84f5-25801c43c829.ycloak-78b4c74bcf-kh476; KC_RESTART=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICIzMmI0MzNkNC02NjgwLTQxODMtOTc2Yy1kZDdjMTg0YjExMTQifQ.eyJjaWQiOiJvbi1yb3V0ZS1iYy1kaXJlY3QtNDU5OCIsInB0eSI6Im9wZW5pZC1jb25uZWN0IiwicnVyaSI6Imh0dHBzOi8vb25yb3V0ZWJjLXRlc3QtZnJvbnRlbmQuYXBwcy5zaWx2ZXIuZGV2b3BzLmdvdi5iYy5jYS8iLCJhY3QiOiJBVVRIRU5USUNBVEUiLCJub3RlcyI6eyJzY29wZSI6Im9wZW5pZCIsImlzcyI6Imh0dHBzOi8vdGVzdC5sb2dpbnByb3h5Lmdvdi5iYy5jYS9hdXRoL3JlYWxtcy9zdGFuZGFyZCIsInJlc3BvbnNlX3R5cGUiOiJjb2RlIiwiY29kZV9jaGFsbGVuZ2VfbWV0aG9kIjoiUzI1NiIsInJlZGlyZWN0X3VyaSI6Imh0dHBzOi8vb25yb3V0ZWJjLXRlc3QtZnJvbnRlbmQuYXBwcy5zaWx2ZXIuZGV2b3BzLmdvdi5iYy5jYS8iLCJzdGF0ZSI6IjdiZTBmNDk4ZGRmYTQ1ZTI4ZWU4ZjI0MTY0NzViYTQyIiwiY29kZV9jaGFsbGVuZ2UiOiJCNEpzelBjUzBIT1c3RUNUVFVVUkMxbXA2ejhhdDJiNkswbEQxdUtfMTFBIiwia2NfaWRwX2hpbnQiOiJiY2VpZGJvdGgiLCJyZXNwb25zZV9tb2RlIjoicXVlcnkifX0.2dLZTTjk8ZY0EFAaE88sAWQlfo7T17XcYLztnQwI_Yk; _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; FAILREASON=0; SMSESSION=Awk9KIrMNenX09Vl2cEMuy/VxV9CFVP4fsBzCp8Zo3AX2VsrDVWkOMVOdJyoY1Q1J9F8Vs8XFBtHTU29qS7+jlhEMK3f9j8tgudEVWHJq8LTizGhEj1cf8r7CX2QuxWMbdAHvK90hFnpocsL5xv2cAaFVdqhBKlIYkzwkY+r0YuH3Uh6DJVIhAhwjWeKfO6BAg5/jNFxQ31EPvzn4N7RxJK2bGyfAxzi6Cs6O7ieJ10MzcB8nWSIsO4ksfG8pzeGp9a+arl4maKnd9Je2L2FQohmiOjfGcrsezOgLgiWFl1B3+EL8ytArvtKhsFvr7WJsQuhYsQYzfY8shcfhNSltyqxLD422bDmU3NyZdhWY9313YG5I1U2vbO7zvXhxaCJYnpMrJR+inz8XsyqnGY1xu7AepY3pNd2wJH3twQJ42N6R2WlJVVN3oc3DvEHUbk85xrqHdwngd/FiMdEC2f5Kt51VYp8G/3R+sbFiy6Wt7wlZw2+/wI8EfxXs31HQ5q/RDUTXz6JMbzsR7EUOF+WkOrgi1nDugu13/O9hDnxPJnkzNGEfjt0xPxdhoDdl4vWdwRe1awBEn90SyJwc8+cFk1XACtvWoGwtPdf1xnHUwx5Ge1TqEd46xdjjlu+iTw2Xu5AsESUVVw81STsKA7vC8EBabQ+yXQHZlNFcFCKa1+AutNxfWHNQtnFK03kUCai4ZPJc/TQrhvf9DWjSyX+KknWdV6aQyz65KOpwtQWpd4ZlqAAKvf9vCQIBgk+YdsxFzAq6ySnLPcBLbFvP+Xyo5bcABg8IS9aJr6+05KT3ZOv49G1uYvz1ILaDED83D5NHF57ZswKR2911SevaqIO2i8NkZAJUMBpgroSejoJ1MxzpL/a7I26u6+p/08uMt/dT7vuo5OTTjayEtIlXy1IRXA/jU/uX/pKk1JrsZFhhwj7G5KEQpMAx+YvZUaaidqyfj3+fLb6+rsa8BukV8x0zfgUg20dm+Wu9XjDvyQHFP4Qt65CaUbhAKcVTgCChgTfSSdUJZIPPa5Yhzr7SmTuVGmYV/1cC4jGzNdSqr3Fq28fWukiEnRtqfZRXlOdA6xb - - - - - - - - - - false - - = - true - - - - - - - - https://${KEYCLOAK_LOGIN_URL}/auth/realms/standard/login-actions/post-broker-login?client_id=on-route-bc-direct-4598&tab_id=KAxYXjoatGc - GET - true - false - true - false - - - - - - - - - Host - ${KEYCLOAK_LOGIN_URL} - - - Connection - keep-alive - - - Cache-Control - max-age=0 - - - Upgrade-Insecure-Requests - 1 - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Accept - text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - navigate - - - Sec-Fetch-Dest - document - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - sec-ch-ua-mobile - ?0 - - - sec-ch-ua-platform - "Windows" - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - Cookie - AUTH_SESSION_ID=0e56ff7b-e277-400f-84f5-25801c43c829.ycloak-78b4c74bcf-kh476; AUTH_SESSION_ID_LEGACY=0e56ff7b-e277-400f-84f5-25801c43c829.ycloak-78b4c74bcf-kh476; KC_RESTART=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICIzMmI0MzNkNC02NjgwLTQxODMtOTc2Yy1kZDdjMTg0YjExMTQifQ.eyJjaWQiOiJvbi1yb3V0ZS1iYy1kaXJlY3QtNDU5OCIsInB0eSI6Im9wZW5pZC1jb25uZWN0IiwicnVyaSI6Imh0dHBzOi8vb25yb3V0ZWJjLXRlc3QtZnJvbnRlbmQuYXBwcy5zaWx2ZXIuZGV2b3BzLmdvdi5iYy5jYS8iLCJhY3QiOiJBVVRIRU5USUNBVEUiLCJub3RlcyI6eyJzY29wZSI6Im9wZW5pZCIsImlzcyI6Imh0dHBzOi8vdGVzdC5sb2dpbnByb3h5Lmdvdi5iYy5jYS9hdXRoL3JlYWxtcy9zdGFuZGFyZCIsInJlc3BvbnNlX3R5cGUiOiJjb2RlIiwiY29kZV9jaGFsbGVuZ2VfbWV0aG9kIjoiUzI1NiIsInJlZGlyZWN0X3VyaSI6Imh0dHBzOi8vb25yb3V0ZWJjLXRlc3QtZnJvbnRlbmQuYXBwcy5zaWx2ZXIuZGV2b3BzLmdvdi5iYy5jYS8iLCJzdGF0ZSI6IjdiZTBmNDk4ZGRmYTQ1ZTI4ZWU4ZjI0MTY0NzViYTQyIiwiY29kZV9jaGFsbGVuZ2UiOiJCNEpzelBjUzBIT1c3RUNUVFVVUkMxbXA2ejhhdDJiNkswbEQxdUtfMTFBIiwia2NfaWRwX2hpbnQiOiJiY2VpZGJvdGgiLCJyZXNwb25zZV9tb2RlIjoicXVlcnkifX0.2dLZTTjk8ZY0EFAaE88sAWQlfo7T17XcYLztnQwI_Yk; _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; FAILREASON=0; SMSESSION=Awk9KIrMNenX09Vl2cEMuy/VxV9CFVP4fsBzCp8Zo3AX2VsrDVWkOMVOdJyoY1Q1J9F8Vs8XFBtHTU29qS7+jlhEMK3f9j8tgudEVWHJq8LTizGhEj1cf8r7CX2QuxWMbdAHvK90hFnpocsL5xv2cAaFVdqhBKlIYkzwkY+r0YuH3Uh6DJVIhAhwjWeKfO6BAg5/jNFxQ31EPvzn4N7RxJK2bGyfAxzi6Cs6O7ieJ10MzcB8nWSIsO4ksfG8pzeGp9a+arl4maKnd9Je2L2FQohmiOjfGcrsezOgLgiWFl1B3+EL8ytArvtKhsFvr7WJsQuhYsQYzfY8shcfhNSltyqxLD422bDmU3NyZdhWY9313YG5I1U2vbO7zvXhxaCJYnpMrJR+inz8XsyqnGY1xu7AepY3pNd2wJH3twQJ42N6R2WlJVVN3oc3DvEHUbk85xrqHdwngd/FiMdEC2f5Kt51VYp8G/3R+sbFiy6Wt7wlZw2+/wI8EfxXs31HQ5q/RDUTXz6JMbzsR7EUOF+WkOrgi1nDugu13/O9hDnxPJnkzNGEfjt0xPxdhoDdl4vWdwRe1awBEn90SyJwc8+cFk1XACtvWoGwtPdf1xnHUwx5Ge1TqEd46xdjjlu+iTw2Xu5AsESUVVw81STsKA7vC8EBabQ+yXQHZlNFcFCKa1+AutNxfWHNQtnFK03kUCai4ZPJc/TQrhvf9DWjSyX+KknWdV6aQyz65KOpwtQWpd4ZlqAAKvf9vCQIBgk+YdsxFzAq6ySnLPcBLbFvP+Xyo5bcABg8IS9aJr6+05KT3ZOv49G1uYvz1ILaDED83D5NHF57ZswKR2911SevaqIO2i8NkZAJUMBpgroSejoJ1MxzpL/a7I26u6+p/08uMt/dT7vuo5OTTjayEtIlXy1IRXA/jU/uX/pKk1JrsZFhhwj7G5KEQpMAx+YvZUaaidqyfj3+fLb6+rsa8BukV8x0zfgUg20dm+Wu9XjDvyQHFP4Qt65CaUbhAKcVTgCChgTfSSdUJZIPPa5Yhzr7SmTuVGmYV/1cC4jGzNdSqr3Fq28fWukiEnRtqfZRXlOdA6xb - - - - - - - - - - false - - = - true - - - - - - - - https://${FRONTEND_API_URL}/?state=7be0f498ddfa45e28ee8f2416475ba42&session_state=0e56ff7b-e277-400f-84f5-25801c43c829&code=e1db6532-ce36-4aa5-845c-26c6d9f6e19f.0e56ff7b-e277-400f-84f5-25801c43c829.f462b30d-0893-4a2d-8169-3461d82c36eb - GET - true - false - true - false - - - - - - - - - Host - ${FRONTEND_API_URL} - - - Connection - keep-alive - - - Cache-Control - max-age=0 - - - Upgrade-Insecure-Requests - 1 - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Accept - text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - navigate - - - Sec-Fetch-Dest - document - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - sec-ch-ua-mobile - ?0 - - - sec-ch-ua-platform - "Windows" - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - Cookie - _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; FAILREASON=0; 9a75866e187615f9e3e688e8297548f9=1f5b60b83338df80ae3a11e1286008b7; SMSESSION=Awk9KIrMNenX09Vl2cEMuy/VxV9CFVP4fsBzCp8Zo3AX2VsrDVWkOMVOdJyoY1Q1J9F8Vs8XFBtHTU29qS7+jlhEMK3f9j8tgudEVWHJq8LTizGhEj1cf8r7CX2QuxWMbdAHvK90hFnpocsL5xv2cAaFVdqhBKlIYkzwkY+r0YuH3Uh6DJVIhAhwjWeKfO6BAg5/jNFxQ31EPvzn4N7RxJK2bGyfAxzi6Cs6O7ieJ10MzcB8nWSIsO4ksfG8pzeGp9a+arl4maKnd9Je2L2FQohmiOjfGcrsezOgLgiWFl1B3+EL8ytArvtKhsFvr7WJsQuhYsQYzfY8shcfhNSltyqxLD422bDmU3NyZdhWY9313YG5I1U2vbO7zvXhxaCJYnpMrJR+inz8XsyqnGY1xu7AepY3pNd2wJH3twQJ42N6R2WlJVVN3oc3DvEHUbk85xrqHdwngd/FiMdEC2f5Kt51VYp8G/3R+sbFiy6Wt7wlZw2+/wI8EfxXs31HQ5q/RDUTXz6JMbzsR7EUOF+WkOrgi1nDugu13/O9hDnxPJnkzNGEfjt0xPxdhoDdl4vWdwRe1awBEn90SyJwc8+cFk1XACtvWoGwtPdf1xnHUwx5Ge1TqEd46xdjjlu+iTw2Xu5AsESUVVw81STsKA7vC8EBabQ+yXQHZlNFcFCKa1+AutNxfWHNQtnFK03kUCai4ZPJc/TQrhvf9DWjSyX+KknWdV6aQyz65KOpwtQWpd4ZlqAAKvf9vCQIBgk+YdsxFzAq6ySnLPcBLbFvP+Xyo5bcABg8IS9aJr6+05KT3ZOv49G1uYvz1ILaDED83D5NHF57ZswKR2911SevaqIO2i8NkZAJUMBpgroSejoJ1MxzpL/a7I26u6+p/08uMt/dT7vuo5OTTjayEtIlXy1IRXA/jU/uX/pKk1JrsZFhhwj7G5KEQpMAx+YvZUaaidqyfj3+fLb6+rsa8BukV8x0zfgUg20dm+Wu9XjDvyQHFP4Qt65CaUbhAKcVTgCChgTfSSdUJZIPPa5Yhzr7SmTuVGmYV/1cC4jGzNdSqr3Fq28fWukiEnRtqfZRXlOdA6xb - - - - - - - - continue - - false - 1 - - 1 - ${__P(rampup,300)} - 1365261073000 - 1365261073000 - true - ${__P(duration,3000)} - - true - - - - ${__P(Delay,10000)} - - - - - - - false - - = - true - - - - - - - - https://${FRONTEND_API_URL}/ - GET - true - false - true - false - - - - - - - - - Host - ${FRONTEND_API_URL} - - - Connection - keep-alive - - - Cache-Control - max-age=0 - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - sec-ch-ua-mobile - ?0 - - - sec-ch-ua-platform - "Windows" - - - Upgrade-Insecure-Requests - 1 - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Accept - text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 - - - Sec-Fetch-Site - same-origin - - - Sec-Fetch-Mode - navigate - - - Sec-Fetch-User - ?1 - - - Sec-Fetch-Dest - document - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - Cookie - _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; FAILREASON=0; 9a75866e187615f9e3e688e8297548f9=1f5b60b83338df80ae3a11e1286008b7; SMSESSION=LOGGEDOFF - - - If-None-Match - W/"653ca247-308" - - - If-Modified-Since - Sat, 28 Oct 2023 05:55:19 GMT - - - - - - - - - - false - - = - true - - - - - - - - https://${KEYCLOAK_LOGIN_URL}/auth/realms/standard/.well-known/openid-configuration - GET - true - false - true - false - - - - - - - - - Host - ${KEYCLOAK_LOGIN_URL} - - - Connection - keep-alive - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - Accept - application/jwk-set+json, application/json - - - sec-ch-ua-mobile - ?0 - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - sec-ch-ua-platform - "Windows" - - - Origin - https://${FRONTEND_API_URL} - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - cors - - - Sec-Fetch-Dest - empty - - - Referer - https://${FRONTEND_API_URL}/ - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - - - - - - - - false - - = - true - - - - - - - - https://${KEYCLOAK_LOGIN_URL}/auth/realms/standard/protocol/openid-connect/auth?client_id=on-route-bc-direct-4598&redirect_uri=https%3A%2F%2F${FRONTEND_API_URL}%2F&response_type=code&scope=openid&state=7be0f498ddfa45e28ee8f2416475ba42&code_challenge=B4JszPcS0HOW7ECTTUURC1mp6z8at2b6K0lD1uK_11A&code_challenge_method=S256&response_mode=query&kc_idp_hint=bceidboth - GET - true - false - true - false - - - - - - - - - Host - ${KEYCLOAK_LOGIN_URL} - - - Connection - keep-alive - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - sec-ch-ua-mobile - ?0 - - - sec-ch-ua-platform - "Windows" - - - Upgrade-Insecure-Requests - 1 - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Accept - text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - navigate - - - Sec-Fetch-User - ?1 - - - Sec-Fetch-Dest - document - - - Referer - https://${FRONTEND_API_URL}/ - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - Cookie - AUTH_SESSION_ID=2e364c60-0ead-4ec1-98fb-0e1bba001f08.ycloak-78b4c74bcf-vtmwp; AUTH_SESSION_ID_LEGACY=2e364c60-0ead-4ec1-98fb-0e1bba001f08.ycloak-78b4c74bcf-vtmwp; _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; FAILREASON=0; SMSESSION=LOGGEDOFF - - - - - - - - - - false - - = - true - - - - - - - - https://${KEYCLOAK_LOGIN_URL}/auth/realms/standard/broker/bceidboth/login?session_code=5b_D1WNhNIzE-FZe70dEmhs_J2mpDyFSyQzWPAxnjYc&client_id=on-route-bc-direct-4598&tab_id=KAxYXjoatGc - GET - true - false - true - false - - - - - - - - - Host - ${KEYCLOAK_LOGIN_URL} - - - Connection - keep-alive - - - Upgrade-Insecure-Requests - 1 - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Accept - text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - navigate - - - Sec-Fetch-User - ?1 - - - Sec-Fetch-Dest - document - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - sec-ch-ua-mobile - ?0 - - - sec-ch-ua-platform - "Windows" - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - Cookie - AUTH_SESSION_ID=0e56ff7b-e277-400f-84f5-25801c43c829.ycloak-78b4c74bcf-kh476; AUTH_SESSION_ID_LEGACY=0e56ff7b-e277-400f-84f5-25801c43c829.ycloak-78b4c74bcf-kh476; KC_RESTART=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICIzMmI0MzNkNC02NjgwLTQxODMtOTc2Yy1kZDdjMTg0YjExMTQifQ.eyJjaWQiOiJvbi1yb3V0ZS1iYy1kaXJlY3QtNDU5OCIsInB0eSI6Im9wZW5pZC1jb25uZWN0IiwicnVyaSI6Imh0dHBzOi8vb25yb3V0ZWJjLXRlc3QtZnJvbnRlbmQuYXBwcy5zaWx2ZXIuZGV2b3BzLmdvdi5iYy5jYS8iLCJhY3QiOiJBVVRIRU5USUNBVEUiLCJub3RlcyI6eyJzY29wZSI6Im9wZW5pZCIsImlzcyI6Imh0dHBzOi8vdGVzdC5sb2dpbnByb3h5Lmdvdi5iYy5jYS9hdXRoL3JlYWxtcy9zdGFuZGFyZCIsInJlc3BvbnNlX3R5cGUiOiJjb2RlIiwiY29kZV9jaGFsbGVuZ2VfbWV0aG9kIjoiUzI1NiIsInJlZGlyZWN0X3VyaSI6Imh0dHBzOi8vb25yb3V0ZWJjLXRlc3QtZnJvbnRlbmQuYXBwcy5zaWx2ZXIuZGV2b3BzLmdvdi5iYy5jYS8iLCJzdGF0ZSI6IjdiZTBmNDk4ZGRmYTQ1ZTI4ZWU4ZjI0MTY0NzViYTQyIiwiY29kZV9jaGFsbGVuZ2UiOiJCNEpzelBjUzBIT1c3RUNUVFVVUkMxbXA2ejhhdDJiNkswbEQxdUtfMTFBIiwia2NfaWRwX2hpbnQiOiJiY2VpZGJvdGgiLCJyZXNwb25zZV9tb2RlIjoicXVlcnkifX0.2dLZTTjk8ZY0EFAaE88sAWQlfo7T17XcYLztnQwI_Yk; _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; FAILREASON=0; SMSESSION=LOGGEDOFF - - - - - - - - - - false - - = - true - - - - - - - - https://${KEYCLOAK_LOGIN_URL}/auth/realms/bceidboth/protocol/openid-connect/auth?scope=openid&state=JvIyfmoj0AzmBZWw0ZS8lBmhMJXd7lA_uAR8JQvLNlE.KAxYXjoatGc.on-route-bc-direct-4598&response_type=code&client_id=standard-realm&redirect_uri=https%3A%2F%2F${KEYCLOAK_LOGIN_URL}%2Fauth%2Frealms%2Fstandard%2Fbroker%2Fbceidboth%2Fendpoint&nonce=1sKWmdZ0aV6QIscb65Lrmg - GET - true - false - true - false - - - - - - - - - Host - ${KEYCLOAK_LOGIN_URL} - - - Connection - keep-alive - - - Upgrade-Insecure-Requests - 1 - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Accept - text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - navigate - - - Sec-Fetch-User - ?1 - - - Sec-Fetch-Dest - document - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - sec-ch-ua-mobile - ?0 - - - sec-ch-ua-platform - "Windows" - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - Cookie - AUTH_SESSION_ID=33769057-e4e2-49e9-821b-bab26d4e7507.ycloak-78b4c74bcf-gj9d6; AUTH_SESSION_ID_LEGACY=33769057-e4e2-49e9-821b-bab26d4e7507.ycloak-78b4c74bcf-gj9d6; KEYCLOAK_IDENTITY=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI1ZjExNjBiNS03Y2RjLTQ5NGQtYmFkOS0yZGRkNjU3MDU5Y2UifQ.eyJleHAiOjE2OTg3MzE3MzQsImlhdCI6MTY5ODY5NTczNCwianRpIjoiNzY3ZDEzMGEtMzczMC00NDdhLWEzNTUtNjhhNDhiMjgzZTI3IiwiaXNzIjoiaHR0cHM6Ly90ZXN0LmxvZ2lucHJveHkuZ292LmJjLmNhL2F1dGgvcmVhbG1zL2JjZWlkYm90aCIsInN1YiI6ImQ3M2FiN2IwLWUyMmEtNDg0NC04Yzc3LWU3YTQ2ODQyOTNmZCIsInR5cCI6IlNlcmlhbGl6ZWQtSUQiLCJzZXNzaW9uX3N0YXRlIjoiMzM3NjkwNTctZTRlMi00OWU5LTgyMWItYmFiMjZkNGU3NTA3Iiwic2lkIjoiMzM3NjkwNTctZTRlMi00OWU5LTgyMWItYmFiMjZkNGU3NTA3Iiwic3RhdGVfY2hlY2tlciI6Ik9SWEI4amY3Q3hPUWhzTUNhWU5nMHF2WHNzZG52cnlxUHFjMnFpUkthZncifQ.1kpL3Qpg4pyqSLBE0iDz7WZ0fdGzCCf6RCiN6HvFWqE; KEYCLOAK_IDENTITY_LEGACY=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI1ZjExNjBiNS03Y2RjLTQ5NGQtYmFkOS0yZGRkNjU3MDU5Y2UifQ.eyJleHAiOjE2OTg3MzE3MzQsImlhdCI6MTY5ODY5NTczNCwianRpIjoiNzY3ZDEzMGEtMzczMC00NDdhLWEzNTUtNjhhNDhiMjgzZTI3IiwiaXNzIjoiaHR0cHM6Ly90ZXN0LmxvZ2lucHJveHkuZ292LmJjLmNhL2F1dGgvcmVhbG1zL2JjZWlkYm90aCIsInN1YiI6ImQ3M2FiN2IwLWUyMmEtNDg0NC04Yzc3LWU3YTQ2ODQyOTNmZCIsInR5cCI6IlNlcmlhbGl6ZWQtSUQiLCJzZXNzaW9uX3N0YXRlIjoiMzM3NjkwNTctZTRlMi00OWU5LTgyMWItYmFiMjZkNGU3NTA3Iiwic2lkIjoiMzM3NjkwNTctZTRlMi00OWU5LTgyMWItYmFiMjZkNGU3NTA3Iiwic3RhdGVfY2hlY2tlciI6Ik9SWEI4amY3Q3hPUWhzTUNhWU5nMHF2WHNzZG52cnlxUHFjMnFpUkthZncifQ.1kpL3Qpg4pyqSLBE0iDz7WZ0fdGzCCf6RCiN6HvFWqE; KEYCLOAK_SESSION=bceidboth/d73ab7b0-e22a-4844-8c77-e7a4684293fd/33769057-e4e2-49e9-821b-bab26d4e7507; KEYCLOAK_SESSION_LEGACY=bceidboth/d73ab7b0-e22a-4844-8c77-e7a4684293fd/33769057-e4e2-49e9-821b-bab26d4e7507; _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; FAILREASON=0; SMSESSION=LOGGEDOFF - - - - - - - - - - false - - = - true - - - - - - - - https://${KEYCLOAK_LOGIN_URL}/auth/realms/bceidboth/broker/bceidboth/login?session_code=oRr0p7JZ9oL7vptnFPfNKhf_nrB8DND1rBojsNPjot0&client_id=standard-realm&tab_id=k5Vw5BDlfVQ - GET - true - false - true - false - - - - - - - - - Host - ${KEYCLOAK_LOGIN_URL} - - - Connection - keep-alive - - - Upgrade-Insecure-Requests - 1 - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Accept - text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - navigate - - - Sec-Fetch-User - ?1 - - - Sec-Fetch-Dest - document - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - sec-ch-ua-mobile - ?0 - - - sec-ch-ua-platform - "Windows" - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - Cookie - AUTH_SESSION_ID=f26f78a0-28d2-40b4-9e57-b83fa590e32e.ycloak-78b4c74bcf-vtmwp; AUTH_SESSION_ID_LEGACY=f26f78a0-28d2-40b4-9e57-b83fa590e32e.ycloak-78b4c74bcf-vtmwp; KC_RESTART=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI1ZjExNjBiNS03Y2RjLTQ5NGQtYmFkOS0yZGRkNjU3MDU5Y2UifQ.eyJjaWQiOiJzdGFuZGFyZC1yZWFsbSIsInB0eSI6Im9wZW5pZC1jb25uZWN0IiwicnVyaSI6Imh0dHBzOi8vdGVzdC5sb2dpbnByb3h5Lmdvdi5iYy5jYS9hdXRoL3JlYWxtcy9zdGFuZGFyZC9icm9rZXIvYmNlaWRib3RoL2VuZHBvaW50IiwiYWN0IjoiQVVUSEVOVElDQVRFIiwibm90ZXMiOnsic2NvcGUiOiJvcGVuaWQiLCJpc3MiOiJodHRwczovL3Rlc3QubG9naW5wcm94eS5nb3YuYmMuY2EvYXV0aC9yZWFsbXMvYmNlaWRib3RoIiwicmVzcG9uc2VfdHlwZSI6ImNvZGUiLCJyZWRpcmVjdF91cmkiOiJodHRwczovL3Rlc3QubG9naW5wcm94eS5nb3YuYmMuY2EvYXV0aC9yZWFsbXMvc3RhbmRhcmQvYnJva2VyL2JjZWlkYm90aC9lbmRwb2ludCIsInN0YXRlIjoiSnZJeWZtb2owQXptQlpXdzBaUzhsQm1oTUpYZDdsQV91QVI4SlF2TE5sRS5LQXhZWGpvYXRHYy5vbi1yb3V0ZS1iYy1kaXJlY3QtNDU5OCIsIm5vbmNlIjoiMXNLV21kWjBhVjZRSXNjYjY1THJtZyJ9fQ.08S_Qi57kTkuLj_eH5VElw2zeuH4AVhfOUois5IUzEI; _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; FAILREASON=0; SMSESSION=LOGGEDOFF - - - - - - - - - - false - - = - true - - - - - - - - https://${SITEMINDER_URL}/clp-cgi/capBceid/logon.cgi?flags=0101:0,7&TYPE=33554433&REALMOID=06-b02c7ed2-895e-4953-bd03-8008c64ec906&GUID=&SMAUTHREASON=0&METHOD=GET&SMAGENTNAME=$SM$Lk6VtkyHw8x3zQIIsMiOiEXYFJF%2fJzjVT7eioCjxBjJck5VMlbxxrR%2bLZSo%2flIBX&TARGET=$SM$HTTPS%3a%2f%2fsfstest7%2egov%2ebc%2eca%2faffwebservices%2fredirectjsp%2ftestkeycloak-basicbusinessbceid%2fredirect%2ejsp%3fSMPORTALURL%3dhttps$%3A$%2F$%2Fsfstest7%2egov%2ebc%2eca$%2Faffwebservices$%2Fpublic$%2Fsaml2sso%26SAMLTRANSACTIONID%3dc9f189ad-7324de1b-2e045e1a-e8bcf162-a78af00c-c5 - GET - true - false - true - false - - - - - - - - - Host - ${SITEMINDER_URL} - - - Connection - keep-alive - - - Cache-Control - max-age=0 - - - Upgrade-Insecure-Requests - 1 - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Accept - text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - navigate - - - Sec-Fetch-Dest - document - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - sec-ch-ua-mobile - ?0 - - - sec-ch-ua-platform - "Windows" - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - Cookie - _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; Dummy1=DummyVal1; BCGOVFlags=0101%3A0%2C7; BCGOVCustom=NULL; BCGOVBrand=NULL; BCGOVBehavior=NULL; Dummy2=DummyVal2; preDummy1=DummyVal1; preDummy2=DummyVal2; preDummy3=DummyVal3; BCGOVDoNotShow=1; preDummy4=DummyVal4; FAILREASON=0; BCGOVTarget=HTTPS%3A%2F%2Fsfstest7.gov.bc.ca%2Faffwebservices%2Fredirectjsp%2Ftestkeycloak-basicbusinessbceid%2Fredirect.jsp%3FSMPORTALURL%3Dhttps%253A%252F%252Fsfstest7.gov.bc.ca%252Faffwebservices%252Fpublic%252Fsaml2sso%26SAMLTRANSACTIONID%3Df7917115-57286b4a-df9cf6ff-b50e2f11-c566ac5a-f6; BCGOVclptryno=0; clp001=0; SMSESSION=LOGGEDOFF; SMFED_OLD_SESSION=""; SMFED_OLD_IDENTITY=""; GUID=1:26feb557-62af2c8c-4ef3a8d7-2e2277be-6a76895c-697 - - - - - - - true - - - - false - instance=instance_capBceid&user=ORBCTST3&password=orbcTST%2B2023 - = - - - - - - - - https://${SITEMINDER_URL}/clp-cgi/preLogon.cgi - POST - true - false - true - false - - - - - - - - - Host - ${SITEMINDER_URL} - - - Connection - keep-alive - - - Content-Length - 64 - - - Cache-Control - max-age=0 - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - sec-ch-ua-mobile - ?0 - - - sec-ch-ua-platform - "Windows" - - - Upgrade-Insecure-Requests - 1 - - - Origin - https://${SITEMINDER_URL} - - - Content-Type - application/x-www-form-urlencoded - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Accept - text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 - - - Sec-Fetch-Site - same-origin - - - Sec-Fetch-Mode - navigate - - - Sec-Fetch-User - ?1 - - - Sec-Fetch-Dest - document - - - Referer - https://${SITEMINDER_URL}/clp-cgi/capBceid/logon.cgi?flags=0101:0,7&TYPE=33554433&REALMOID=06-b02c7ed2-895e-4953-bd03-8008c64ec906&GUID=&SMAUTHREASON=0&METHOD=GET&SMAGENTNAME=$SM$Lk6VtkyHw8x3zQIIsMiOiEXYFJF%2fJzjVT7eioCjxBjJck5VMlbxxrR%2bLZSo%2flIBX&TARGET=$SM$HTTPS%3a%2f%2fsfstest7%2egov%2ebc%2eca%2faffwebservices%2fredirectjsp%2ftestkeycloak-basicbusinessbceid%2fredirect%2ejsp%3fSMPORTALURL%3dhttps$%3A$%2F$%2Fsfstest7%2egov%2ebc%2eca$%2Faffwebservices$%2Fpublic$%2Fsaml2sso%26SAMLTRANSACTIONID%3dc9f189ad-7324de1b-2e045e1a-e8bcf162-a78af00c-c5 - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - Cookie - _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; Dummy1=DummyVal1; BCGOVFlags=0101%3A0%2C7; BCGOVCustom=NULL; BCGOVBrand=NULL; BCGOVBehavior=NULL; Dummy2=DummyVal2; preDummy1=DummyVal1; preDummy2=DummyVal2; preDummy3=DummyVal3; BCGOVDoNotShow=1; preDummy4=DummyVal4; FAILREASON=0; clp001=0; SMSESSION=LOGGEDOFF; SMFED_OLD_SESSION=""; SMFED_OLD_IDENTITY=""; GUID=1:26feb557-62af2c8c-4ef3a8d7-2e2277be-6a76895c-697; BCGOVTarget=HTTPS%3A%2F%2Fsfstest7.gov.bc.ca%2Faffwebservices%2Fredirectjsp%2Ftestkeycloak-basicbusinessbceid%2Fredirect.jsp%3FSMPORTALURL%3Dhttps%253A%252F%252Fsfstest7.gov.bc.ca%252Faffwebservices%252Fpublic%252Fsaml2sso%26SAMLTRANSACTIONID%3Dc9f189ad-7324de1b-2e045e1a-e8bcf162-a78af00c-c5; BCGOVclptryno=1 - - - - - - - true - - - - false - SMENC=ISO-8859-1&SMLOCALE=US-EN&target=%2Fclp-cgi%2Fcap07%2Fprivate%2FpostLogon.cgi&smauthreason=0&smagentname=&user=ORBCTST3&password=orbcTST%2B2023 - = - - - - - - - - https://${SITEMINDER_URL}/clp-cgi/cap07/logon.fcc - POST - true - false - true - false - - - - - - - - - Host - ${SITEMINDER_URL} - - - Connection - keep-alive - - - Content-Length - 149 - - - Cache-Control - max-age=0 - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - sec-ch-ua-mobile - ?0 - - - sec-ch-ua-platform - "Windows" - - - Upgrade-Insecure-Requests - 1 - - - Origin - https://${SITEMINDER_URL} - - - Content-Type - application/x-www-form-urlencoded - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Accept - text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 - - - Sec-Fetch-Site - same-origin - - - Sec-Fetch-Mode - navigate - - - Sec-Fetch-Dest - document - - - Referer - https://${SITEMINDER_URL}/clp-cgi/preLogon.cgi - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - Cookie - _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; Dummy1=DummyVal1; BCGOVFlags=0101%3A0%2C7; BCGOVCustom=NULL; BCGOVBrand=NULL; BCGOVBehavior=NULL; Dummy2=DummyVal2; preDummy1=DummyVal1; preDummy2=DummyVal2; preDummy3=DummyVal3; BCGOVDoNotShow=1; preDummy4=DummyVal4; FAILREASON=0; SMSESSION=LOGGEDOFF; SMFED_OLD_SESSION=""; SMFED_OLD_IDENTITY=""; GUID=1:26feb557-62af2c8c-4ef3a8d7-2e2277be-6a76895c-697; BCGOVTarget=HTTPS%3A%2F%2Fsfstest7.gov.bc.ca%2Faffwebservices%2Fredirectjsp%2Ftestkeycloak-basicbusinessbceid%2Fredirect.jsp%3FSMPORTALURL%3Dhttps%253A%252F%252Fsfstest7.gov.bc.ca%252Faffwebservices%252Fpublic%252Fsaml2sso%26SAMLTRANSACTIONID%3Dc9f189ad-7324de1b-2e045e1a-e8bcf162-a78af00c-c5; BCGOVclptryno=1; clp001=Salted__%8E%F5%14%93%F3.%C8%8C%C2%B3%84%8B%8EC%E0%88%AAK%01%C77%B6%C4g%C3%D2%3ELS%06%7CdJp%18%E9TJ%8A%D3a%A9%AD%3C%5E%DBZ%D7 - - - - - - - - - - false - - = - true - - - - - - - - https://${SITEMINDER_URL}/clp-cgi/cap07/private/postLogon.cgi - GET - true - false - true - false - - - - - - - - - Host - ${SITEMINDER_URL} - - - Connection - keep-alive - - - Cache-Control - max-age=0 - - - Upgrade-Insecure-Requests - 1 - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Accept - text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 - - - Sec-Fetch-Site - same-origin - - - Sec-Fetch-Mode - navigate - - - Sec-Fetch-Dest - document - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - sec-ch-ua-mobile - ?0 - - - sec-ch-ua-platform - "Windows" - - - Referer - https://${SITEMINDER_URL}/clp-cgi/preLogon.cgi - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - Cookie - _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; Dummy1=DummyVal1; BCGOVFlags=0101%3A0%2C7; BCGOVCustom=NULL; BCGOVBrand=NULL; BCGOVBehavior=NULL; Dummy2=DummyVal2; preDummy1=DummyVal1; preDummy2=DummyVal2; preDummy3=DummyVal3; BCGOVDoNotShow=1; preDummy4=DummyVal4; FAILREASON=0; SMSESSION=LOGGEDOFF; SMFED_OLD_SESSION=""; SMFED_OLD_IDENTITY=""; GUID=1:26feb557-62af2c8c-4ef3a8d7-2e2277be-6a76895c-697; BCGOVTarget=HTTPS%3A%2F%2Fsfstest7.gov.bc.ca%2Faffwebservices%2Fredirectjsp%2Ftestkeycloak-basicbusinessbceid%2Fredirect.jsp%3FSMPORTALURL%3Dhttps%253A%252F%252Fsfstest7.gov.bc.ca%252Faffwebservices%252Fpublic%252Fsaml2sso%26SAMLTRANSACTIONID%3Dc9f189ad-7324de1b-2e045e1a-e8bcf162-a78af00c-c5; BCGOVclptryno=1; clp001=Salted__%8E%F5%14%93%F3.%C8%8C%C2%B3%84%8B%8EC%E0%88%AAK%01%C77%B6%C4g%C3%D2%3ELS%06%7CdJp%18%E9TJ%8A%D3a%A9%AD%3C%5E%DBZ%D7; FORMCRED=2ZS4S2F4tb41FWGyAD293ZV3eiMsCRYZ+ktOitYzjWY/fG/2BFtCWHSnbkvgJfBEm8aTuwAg3nMfeG0h8ahL0C1Q+SZp1d30x/imUNpQkjqP7yK+smpXGQMNWzNb15A+UXcYa0yUQLQ5rFoH720FIoiqZ4Nmikk7a67vktQxd8rpIduHeZJ7tAYb/b+pXPha - - - - - - - true - - - - false - RelayState=pkQKGHDSoVdRPpUZ1XHJWrVAUBtEl2EOcIu2bUhv0V0.k5Vw5BDlfVQ.standard-realm&SAMLResponse=PG5zNTpSZXNwb25zZSB4bWxuczpuczU9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpwcm90b2NvbCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDkveG1sZW5jMTEjIiB4bWxuczpuczI9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphc3NlcnRpb24iIHhtbG5zOm5zMz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyIgeG1sbnM6bnM0PSJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzA0L3htbGVuYyMiIERlc3RpbmF0aW9uPSJodHRwczovL3Rlc3QubG9naW5wcm94eS5nb3YuYmMuY2EvYXV0aC9yZWFsbXMvYmNlaWRib3RoL2Jyb2tlci9iY2VpZGJvdGgvZW5kcG9pbnQiIElEPSJfMzU0NWZlNjJmOGY3OThhNTk1ZWNlM2I2YzYxM2RmNmU5ZWFkIiBJblJlc3BvbnNlVG89IklEX2FhYTM1M2Q0LTdlNmMtNDQxNS05N2FkLWI2NmEzM2FhOTBkYyIgSXNzdWVJbnN0YW50PSIyMDIzLTEwLTMwVDE5OjU2OjM3LjE4MFoiIFZlcnNpb249IjIuMCI%2BDQogICAgPG5zMjpJc3N1ZXIgRm9ybWF0PSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6bmFtZWlkLWZvcm1hdDplbnRpdHkiPmh0dHBzOi8vdGVzdC5sb2dpbnByb3h5Lmdvdi5iYy5jYS9hdXRoL3JlYWxtcy9fYmNlaWRiYXNpY2J1c2luZXNzMS88L25zMjpJc3N1ZXI%2BDQogICAgPG5zNTpTdGF0dXM%2BDQogICAgICAgIDxuczU6U3RhdHVzQ29kZSBWYWx1ZT0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOnN0YXR1czpTdWNjZXNzIi8%2BDQogICAgPC9uczU6U3RhdHVzPg0KICAgIDxuczI6QXNzZXJ0aW9uIElEPSJfZWFmZTRjYWQ5MjU0MTEyZjQ5YTcxMDI1MGM3YjVhNDVjYmI2IiBJc3N1ZUluc3RhbnQ9IjIwMjMtMTAtMzBUMTk6NTY6MzcuMTgwWiIgVmVyc2lvbj0iMi4wIiB4bWxuczpuczI9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphc3NlcnRpb24iPg0KICAgICAgICA8bnMyOklzc3VlciBGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpuYW1laWQtZm9ybWF0OmVudGl0eSI%2BaHR0cHM6Ly90ZXN0LmxvZ2lucHJveHkuZ292LmJjLmNhL2F1dGgvcmVhbG1zL19iY2VpZGJhc2ljYnVzaW5lc3MxLzwvbnMyOklzc3Vlcj48ZHM6U2lnbmF0dXJlIHhtbG5zOmRzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIj48ZHM6U2lnbmVkSW5mbz48ZHM6Q2Fub25pY2FsaXphdGlvbk1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvMTAveG1sLWV4Yy1jMTRuIyIvPjxkczpTaWduYXR1cmVNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzA0L3htbGRzaWctbW9yZSNyc2Etc2hhMjU2Ii8%2BPGRzOlJlZmVyZW5jZSBVUkk9IiNfZWFmZTRjYWQ5MjU0MTEyZjQ5YTcxMDI1MGM3YjVhNDVjYmI2Ij48ZHM6VHJhbnNmb3Jtcz48ZHM6VHJhbnNmb3JtIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI2VudmVsb3BlZC1zaWduYXR1cmUiLz48ZHM6VHJhbnNmb3JtIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS8xMC94bWwtZXhjLWMxNG4jIi8%2BPC9kczpUcmFuc2Zvcm1zPjxkczpEaWdlc3RNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzA0L3htbGVuYyNzaGEyNTYiLz48ZHM6RGlnZXN0VmFsdWU%2BS0c3SWRyMko3ODNGVGFkNkVZM0hHUklyRFpnUXU1TmdOQ1JBRU1vcERkYz08L2RzOkRpZ2VzdFZhbHVlPjwvZHM6UmVmZXJlbmNlPjwvZHM6U2lnbmVkSW5mbz48ZHM6U2lnbmF0dXJlVmFsdWU%2BbHJlNnpwalpyUEpKZmVqYStkUHN3cUhlVDN6a3VkNjA4emppZE4vWlBRMjdmSW56aHFWQ2lreDhHcld4V29jSWM4ekhHb1cxZmJqTXlBSkIwNnRHS2pXdzBXMWExTlIyL2VlVGQ1MFY1RnF4NndIb001NFVmYUkvY0N6dDdsMUNUQ2lHZzB6UkVLZjRDK3RxcWJaQ3QyRlFCQ20vd0xaNHRrdXVsZUh4WTZqdGJxWXBlbmpvSzQ2TGlocE1CejIvczBDRmQ3c1BxVjF4bHJpWXVtd1dtSlV1b0o1d0M1L2ZMZ3djTUlmSVMwd29SZmQzclBTN1pBWk5vWXExVVpWQ2xmemZMZ1hNc3JsM2k2S0F3SS80N01pSVpzeGNaaFd1Q3dMTFdFSXdzRWQzWlNLZFhXUTF1U0RrSGlIUGIrcXFmSTJQRGJwK2l1bHFDdlo2S3BCVzdnPT08L2RzOlNpZ25hdHVyZVZhbHVlPjxkczpLZXlJbmZvIHhtbG5zOmRzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIj48ZHM6WDUwOURhdGE%2BPGRzOlg1MDlDZXJ0aWZpY2F0ZT5NSUlFQ3pDQ0F2TUNDUUNkb1dONFh0VUk2VEFOQmdrcWhraUc5dzBCQVFzRkFEQ0J5akVMTUFrR0ExVUVCaE1DUTBFeEdUQVhCZ05WQkFnVEVFSnlhWFJwYzJnZ1EyOXNkVzFpYVdFeEVUQVBCZ05WQkFjVENGWnBZM1J2Y21saE1UY3dOUVlEVlFRS0V5NUhiM1psY201dFpXNTBJRzltSUhSb1pTQlFjbTkyYVc1alpTQnZaaUJDY21sMGFYTm9JRU52YkhWdFltbGhNUTh3RFFZRFZRUUxFd1pUUmxNdFEwRXhJakFnQmdOVkJBTVRHVk5HVXlCRFpYSjBhV1pwWTJGMFpTQkJkWFJvYjNKcGRIa3hIekFkQmdrcWhraUc5dzBCQ1FFV0VGZFVVMWRCVFVCbmIzWXVZbU11WTJFd0hoY05NVE13TkRBMU1qSTFOalUzV2hjTk16TXdOREExTWpJMU5qVTNXakNCd3pFTE1Ba0dBMVVFQmhNQ1EwRXhHVEFYQmdOVkJBZ1RFRUp5YVhScGMyZ2dRMjlzZFcxaWFXRXhFVEFQQmdOVkJBY1RDRlpwWTNSdmNtbGhNVGN3TlFZRFZRUUtFeTVIYjNabGNtNXRaVzUwSUc5bUlIUm9aU0JRY205MmFXNWpaU0J2WmlCQ2NtbDBhWE5vSUVOdmJIVnRZbWxoTVF3d0NnWURWUVFMRXdOVFJsTXhIakFjQmdOVkJBTVRGWE5tY3kxelpuTjBaWE4wTG1kdmRpNWlZeTVqWVRFZk1CMEdDU3FHU0liM0RRRUpBUllRVjFSVFYwRk5RR2R2ZGk1aVl5NWpZVENDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFKdzVFMDQ1amxKK3NiU2dOZmt2eUpBMysyN0tSQm1BbHErTVVSb1IzT1NpV2MyME1XZHQ1cEt4ZFJVcTJmWXhyUWp0cnRQdUdxa2tFR2FlSTBpTlp3UkluYnk2SHU2dWJDd2YxUTdmVGxXNzhscytDak5rWU5VQzMvd3VDM21uMVFuZzhVMGxkUTd0UVU0Y1BPcXdMSXZTaUpkaUpacm1GOFJEcHBvZFljSGhiaWo3N3Q2dGlIVkN4UVlncXhOY3V0M2d3bnhWcjI0MTZ5V0hYVnFxcGNjS0xUaUkvSm9lQ2I1b0kyVVVDcmRldnlXZDRINXFOWmx5NGhMNVBCQ1lZNFR1cFVheWpoYldmeEpLNFVXY0R2N09PYSt1eHE0a1luR2V4RHBxQ2JXNmJ2Y0hiazQ3UDVSQVpJdmd2bkdvQmdTZm9oMzd6eFEvRnA2VkU0aVdBdWNDQXdFQUFUQU5CZ2txaGtpRzl3MEJBUXNGQUFPQ0FRRUFiZGtqUTl1SHB2ZGtTZUlHT25meHU0Vm5mM2pHTzR5bzgrQnJub0dhTEM4aTJDV21Wb2RpOUdPdTNIM2pyR3ZzU296N242QzJBK3ZJdkR4dkE3dHdqd0xBcXVaVlFKbkJDcE1LbXdsUENBQ0F3WitFbGI0cjJxTW14YTJGbTBJZVl6M3gyQldZT0FUdGljODFmRnpoSjhRa1dCdXdiOStkSiswbC9HR1FmOXBPMnFpSXFVRWQyb0lVVkR4cVdSWXpoUGV6ZWpwZlZqQnNUUFhZNXhRaGRCVUtITXIwWnBTVTlrTW9KemNNMW42bEpIN3BGSFpCVUtONzkyaG9FNTVPbEszTFFMVW9oKzNXNEROL1lWS2tEczZrSHI0b0w2dXo5ajJXODRIVVBYNURMbUZGaUorTHBTMDUyVkJ0WWNoangyQnQwRlBzSEpKNEMwRjByNUc0b3c9PTwvZHM6WDUwOUNlcnRpZmljYXRlPjwvZHM6WDUwOURhdGE%2BPC9kczpLZXlJbmZvPjwvZHM6U2lnbmF0dXJlPg0KICAgICAgICA8bnMyOlN1YmplY3Q%2BDQogICAgICAgICAgICA8bnMyOk5hbWVJRCBGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpuYW1laWQtZm9ybWF0OnBlcnNpc3RlbnQiPkE5RUQyQzU3NDJEQzQ1NTk5ODY3MkNDMkExMTgxNzRCPC9uczI6TmFtZUlEPg0KICAgICAgICAgICAgPG5zMjpTdWJqZWN0Q29uZmlybWF0aW9uIE1ldGhvZD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmNtOmJlYXJlciI%2BDQogICAgICAgICAgICAgICAgPG5zMjpTdWJqZWN0Q29uZmlybWF0aW9uRGF0YSBJblJlc3BvbnNlVG89IklEX2FhYTM1M2Q0LTdlNmMtNDQxNS05N2FkLWI2NmEzM2FhOTBkYyIgTm90T25PckFmdGVyPSIyMDIzLTEwLTMwVDE5OjU4OjA3LjE0OFoiIFJlY2lwaWVudD0iaHR0cHM6Ly90ZXN0LmxvZ2lucHJveHkuZ292LmJjLmNhL2F1dGgvcmVhbG1zL2JjZWlkYm90aC9icm9rZXIvYmNlaWRib3RoL2VuZHBvaW50Ii8%2BDQogICAgICAgICAgICA8L25zMjpTdWJqZWN0Q29uZmlybWF0aW9uPg0KICAgICAgICA8L25zMjpTdWJqZWN0Pg0KICAgICAgICA8bnMyOkNvbmRpdGlvbnMgTm90QmVmb3JlPSIyMDIzLTEwLTMwVDE5OjU2OjA3LjE0OFoiIE5vdE9uT3JBZnRlcj0iMjAyMy0xMC0zMFQxOTo1ODowNy4xNDhaIj4NCiAgICAgICAgICAgIDxuczI6QXVkaWVuY2VSZXN0cmljdGlvbj4NCiAgICAgICAgICAgICAgICA8bnMyOkF1ZGllbmNlPmh0dHBzOi8vdGVzdC5sb2dpbnByb3h5Lmdvdi5iYy5jYS9hdXRoL3JlYWxtcy9fYmNlaWRiYXNpY2J1c2luZXNzMS88L25zMjpBdWRpZW5jZT4NCiAgICAgICAgICAgIDwvbnMyOkF1ZGllbmNlUmVzdHJpY3Rpb24%2BDQogICAgICAgIDwvbnMyOkNvbmRpdGlvbnM%2BDQogICAgICAgIDxuczI6QXV0aG5TdGF0ZW1lbnQgQXV0aG5JbnN0YW50PSIyMDIzLTEwLTMwVDE5OjU2OjM1LjEzMloiIFNlc3Npb25JbmRleD0ibGdlQ1pvN01aRnpJaFFiU1dGcXg1SDJiK1U0PXlMMWRQUT09IiBTZXNzaW9uTm90T25PckFmdGVyPSIyMDIzLTEwLTMwVDE5OjU4OjA3LjEzMloiPg0KICAgICAgICAgICAgPG5zMjpBdXRobkNvbnRleHQ%2BDQogICAgICAgICAgICAgICAgPG5zMjpBdXRobkNvbnRleHRDbGFzc1JlZj51cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6YWM6Y2xhc3NlczpQYXNzd29yZDwvbnMyOkF1dGhuQ29udGV4dENsYXNzUmVmPg0KICAgICAgICAgICAgPC9uczI6QXV0aG5Db250ZXh0Pg0KICAgICAgICA8L25zMjpBdXRoblN0YXRlbWVudD4NCiAgICAgICAgPG5zMjpBdHRyaWJ1dGVTdGF0ZW1lbnQ%2BDQogICAgICAgICAgICA8bnMyOkF0dHJpYnV0ZSBOYW1lPSJiY2VpZF91c2VybmFtZSIgTmFtZUZvcm1hdD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmF0dHJuYW1lLWZvcm1hdDp1bnNwZWNpZmllZCI%2BDQogICAgICAgICAgICAgICAgPG5zMjpBdHRyaWJ1dGVWYWx1ZSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTp0eXBlPSJ4czpzdHJpbmciPk9SQkNUU1QzPC9uczI6QXR0cmlidXRlVmFsdWU%2BDQogICAgICAgICAgICA8L25zMjpBdHRyaWJ1dGU%2BDQogICAgICAgICAgICA8bnMyOkF0dHJpYnV0ZSBOYW1lPSJkaXNwbGF5X25hbWUiIE5hbWVGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphdHRybmFtZS1mb3JtYXQ6dW5zcGVjaWZpZWQiPg0KICAgICAgICAgICAgICAgIDxuczI6QXR0cmlidXRlVmFsdWUgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6dHlwZT0ieHM6c3RyaW5nIj5CcnlhbiBMYW5lPC9uczI6QXR0cmlidXRlVmFsdWU%2BDQogICAgICAgICAgICA8L25zMjpBdHRyaWJ1dGU%2BDQogICAgICAgICAgICA8bnMyOkF0dHJpYnV0ZSBOYW1lPSJiY2VpZF91c2VyX2d1aWQiIE5hbWVGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphdHRybmFtZS1mb3JtYXQ6dW5zcGVjaWZpZWQiPg0KICAgICAgICAgICAgICAgIDxuczI6QXR0cmlidXRlVmFsdWUgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6dHlwZT0ieHM6c3RyaW5nIj5BOUVEMkM1NzQyREM0NTU5OTg2NzJDQzJBMTE4MTc0QjwvbnMyOkF0dHJpYnV0ZVZhbHVlPg0KICAgICAgICAgICAgPC9uczI6QXR0cmlidXRlPg0KICAgICAgICAgICAgPG5zMjpBdHRyaWJ1dGUgTmFtZT0iZW1haWwiIE5hbWVGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphdHRybmFtZS1mb3JtYXQ6dW5zcGVjaWZpZWQiPg0KICAgICAgICAgICAgICAgIDxuczI6QXR0cmlidXRlVmFsdWUgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6dHlwZT0ieHM6c3RyaW5nIj5icnlhbi5sYW5lQGdvdi5iYy5jYTwvbnMyOkF0dHJpYnV0ZVZhbHVlPg0KICAgICAgICAgICAgPC9uczI6QXR0cmlidXRlPg0KICAgICAgICA8bnMyOkF0dHJpYnV0ZSBOYW1lPSJTTUdPVl9CVVNJTkVTU0dVSUQiIE5hbWVGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphdHRybmFtZS1mb3JtYXQ6dW5zcGVjaWZpZWQiPjxuczI6QXR0cmlidXRlVmFsdWU%2BRjQwMjNEQjNDMzBGNDg3QjlBRjVCMTRDOTU4OTg5Rjg8L25zMjpBdHRyaWJ1dGVWYWx1ZT48L25zMjpBdHRyaWJ1dGU%2BPG5zMjpBdHRyaWJ1dGUgTmFtZT0iU01HT1ZfQlVTSU5FU1NMRUdBTE5BTUUiIE5hbWVGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphdHRybmFtZS1mb3JtYXQ6dW5zcGVjaWZpZWQiPjxuczI6QXR0cmlidXRlVmFsdWU%2BU29uaWMgRGVsaXZlcnkgU2VydmljZXM8L25zMjpBdHRyaWJ1dGVWYWx1ZT48L25zMjpBdHRyaWJ1dGU%2BPC9uczI6QXR0cmlidXRlU3RhdGVtZW50Pg0KICAgIDwvbnMyOkFzc2VydGlvbj4NCjwvbnM1OlJlc3BvbnNlPg%3D%3D - = - - - - - - - - https://${KEYCLOAK_LOGIN_URL}/auth/realms/bceidboth/broker/bceidboth/endpoint - POST - true - false - true - false - - - - - - - - - Host - ${KEYCLOAK_LOGIN_URL} - - - Connection - keep-alive - - - Content-Length - 9217 - - - Cache-Control - max-age=0 - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - sec-ch-ua-mobile - ?0 - - - sec-ch-ua-platform - "Windows" - - - Upgrade-Insecure-Requests - 1 - - - Origin - https://sfstest7.gov.bc.ca - - - Content-Type - application/x-www-form-urlencoded - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Accept - text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - navigate - - - Sec-Fetch-Dest - document - - - Referer - https://sfstest7.gov.bc.ca/ - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - Cookie - AUTH_SESSION_ID=f26f78a0-28d2-40b4-9e57-b83fa590e32e.ycloak-78b4c74bcf-vtmwp; AUTH_SESSION_ID_LEGACY=f26f78a0-28d2-40b4-9e57-b83fa590e32e.ycloak-78b4c74bcf-vtmwp; KC_RESTART=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI1ZjExNjBiNS03Y2RjLTQ5NGQtYmFkOS0yZGRkNjU3MDU5Y2UifQ.eyJjaWQiOiJzdGFuZGFyZC1yZWFsbSIsInB0eSI6Im9wZW5pZC1jb25uZWN0IiwicnVyaSI6Imh0dHBzOi8vdGVzdC5sb2dpbnByb3h5Lmdvdi5iYy5jYS9hdXRoL3JlYWxtcy9zdGFuZGFyZC9icm9rZXIvYmNlaWRib3RoL2VuZHBvaW50IiwiYWN0IjoiQVVUSEVOVElDQVRFIiwibm90ZXMiOnsic2NvcGUiOiJvcGVuaWQiLCJpc3MiOiJodHRwczovL3Rlc3QubG9naW5wcm94eS5nb3YuYmMuY2EvYXV0aC9yZWFsbXMvYmNlaWRib3RoIiwicmVzcG9uc2VfdHlwZSI6ImNvZGUiLCJyZWRpcmVjdF91cmkiOiJodHRwczovL3Rlc3QubG9naW5wcm94eS5nb3YuYmMuY2EvYXV0aC9yZWFsbXMvc3RhbmRhcmQvYnJva2VyL2JjZWlkYm90aC9lbmRwb2ludCIsInN0YXRlIjoiSnZJeWZtb2owQXptQlpXdzBaUzhsQm1oTUpYZDdsQV91QVI4SlF2TE5sRS5LQXhZWGpvYXRHYy5vbi1yb3V0ZS1iYy1kaXJlY3QtNDU5OCIsIm5vbmNlIjoiMXNLV21kWjBhVjZRSXNjYjY1THJtZyJ9fQ.08S_Qi57kTkuLj_eH5VElw2zeuH4AVhfOUois5IUzEI; _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; FAILREASON=0; SMSESSION=Awk9KIrMNenX09Vl2cEMuy/VxV9CFVP4fsBzCp8Zo3AX2VsrDVWkOMVOdJyoY1Q1J9F8Vs8XFBtHTU29qS7+jlhEMK3f9j8tgudEVWHJq8LTizGhEj1cf8r7CX2QuxWMbdAHvK90hFnpocsL5xv2cAaFVdqhBKlIYkzwkY+r0YuH3Uh6DJVIhAhwjWeKfO6BAg5/jNFxQ31EPvzn4N7RxJK2bGyfAxzi6Cs6O7ieJ10MzcB8nWSIsO4ksfG8pzeGp9a+arl4maKnd9Je2L2FQohmiOjfGcrsezOgLgiWFl1B3+EL8ytArvtKhsFvr7WJsQuhYsQYzfY8shcfhNSltyqxLD422bDmU3NyZdhWY9313YG5I1U2vbO7zvXhxaCJYnpMrJR+inz8XsyqnGY1xu7AepY3pNd2wJH3twQJ42N6R2WlJVVN3oc3DvEHUbk85xrqHdwngd/FiMdEC2f5Kt51VYp8G/3R+sbFiy6Wt7wlZw2+/wI8EfxXs31HQ5q/RDUTXz6JMbzsR7EUOF+WkOrgi1nDugu13/O9hDnxPJnkzNGEfjt0xPxdhoDdl4vWdwRe1awBEn90SyJwc8+cFk1XACtvWoGwtPdf1xnHUwx5Ge1TqEd46xdjjlu+iTw2Xu5AsESUVVw81STsKA7vC8EBabQ+yXQHZlNFcFCKa1+AutNxfWHNQtnFK03kUCai4ZPJc/TQrhvf9DWjSyX+KknWdV6aQyz65KOpwtQWpd4ZlqAAKvf9vCQIBgk+YdsxFzAq6ySnLPcBLbFvP+Xyo5bcABg8IS9aJr6+05KT3ZOv49G1uYvz1ILaDED83D5NHF57ZswKR2911SevaqIO2i8NkZAJUMBpgroSejoJ1MxzpL/a7I26u6+p/08uMt/dT7vuo5OTTjayEtIlXy1IRXA/jU/uX/pKk1JrsZFhhwj7G5KEQpMAx+YvZUaaidqyfj3+fLb6+rsa8BukV8x0zfgUg20dm+Wu9XjDvyQHFP4Qt65CaUbhAKcVTgCChgTfSSdUJZIPPa5Yhzr7SmTuVGmYV/1cC4jGzNdSqr3Fq28fWukiEnRtqfZRXlOdA6xb - - - - - - - - - - false - - = - true - - - - - - - - https://${KEYCLOAK_LOGIN_URL}/auth/realms/standard/broker/bceidboth/endpoint?state=JvIyfmoj0AzmBZWw0ZS8lBmhMJXd7lA_uAR8JQvLNlE.KAxYXjoatGc.on-route-bc-direct-4598&session_state=f26f78a0-28d2-40b4-9e57-b83fa590e32e&code=c5719177-78e8-4d75-857a-0ef191c765d1.f26f78a0-28d2-40b4-9e57-b83fa590e32e.1123d85b-badf-4084-a3a6-b1c920ccb0c0 - GET - true - false - true - false - - - - - - - - - Host - ${KEYCLOAK_LOGIN_URL} - - - Connection - keep-alive - - - Cache-Control - max-age=0 - - - Upgrade-Insecure-Requests - 1 - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Accept - text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - navigate - - - Sec-Fetch-Dest - document - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - sec-ch-ua-mobile - ?0 - - - sec-ch-ua-platform - "Windows" - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - Cookie - AUTH_SESSION_ID=0e56ff7b-e277-400f-84f5-25801c43c829.ycloak-78b4c74bcf-kh476; AUTH_SESSION_ID_LEGACY=0e56ff7b-e277-400f-84f5-25801c43c829.ycloak-78b4c74bcf-kh476; KC_RESTART=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICIzMmI0MzNkNC02NjgwLTQxODMtOTc2Yy1kZDdjMTg0YjExMTQifQ.eyJjaWQiOiJvbi1yb3V0ZS1iYy1kaXJlY3QtNDU5OCIsInB0eSI6Im9wZW5pZC1jb25uZWN0IiwicnVyaSI6Imh0dHBzOi8vb25yb3V0ZWJjLXRlc3QtZnJvbnRlbmQuYXBwcy5zaWx2ZXIuZGV2b3BzLmdvdi5iYy5jYS8iLCJhY3QiOiJBVVRIRU5USUNBVEUiLCJub3RlcyI6eyJzY29wZSI6Im9wZW5pZCIsImlzcyI6Imh0dHBzOi8vdGVzdC5sb2dpbnByb3h5Lmdvdi5iYy5jYS9hdXRoL3JlYWxtcy9zdGFuZGFyZCIsInJlc3BvbnNlX3R5cGUiOiJjb2RlIiwiY29kZV9jaGFsbGVuZ2VfbWV0aG9kIjoiUzI1NiIsInJlZGlyZWN0X3VyaSI6Imh0dHBzOi8vb25yb3V0ZWJjLXRlc3QtZnJvbnRlbmQuYXBwcy5zaWx2ZXIuZGV2b3BzLmdvdi5iYy5jYS8iLCJzdGF0ZSI6IjdiZTBmNDk4ZGRmYTQ1ZTI4ZWU4ZjI0MTY0NzViYTQyIiwiY29kZV9jaGFsbGVuZ2UiOiJCNEpzelBjUzBIT1c3RUNUVFVVUkMxbXA2ejhhdDJiNkswbEQxdUtfMTFBIiwia2NfaWRwX2hpbnQiOiJiY2VpZGJvdGgiLCJyZXNwb25zZV9tb2RlIjoicXVlcnkifX0.2dLZTTjk8ZY0EFAaE88sAWQlfo7T17XcYLztnQwI_Yk; _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; FAILREASON=0; SMSESSION=Awk9KIrMNenX09Vl2cEMuy/VxV9CFVP4fsBzCp8Zo3AX2VsrDVWkOMVOdJyoY1Q1J9F8Vs8XFBtHTU29qS7+jlhEMK3f9j8tgudEVWHJq8LTizGhEj1cf8r7CX2QuxWMbdAHvK90hFnpocsL5xv2cAaFVdqhBKlIYkzwkY+r0YuH3Uh6DJVIhAhwjWeKfO6BAg5/jNFxQ31EPvzn4N7RxJK2bGyfAxzi6Cs6O7ieJ10MzcB8nWSIsO4ksfG8pzeGp9a+arl4maKnd9Je2L2FQohmiOjfGcrsezOgLgiWFl1B3+EL8ytArvtKhsFvr7WJsQuhYsQYzfY8shcfhNSltyqxLD422bDmU3NyZdhWY9313YG5I1U2vbO7zvXhxaCJYnpMrJR+inz8XsyqnGY1xu7AepY3pNd2wJH3twQJ42N6R2WlJVVN3oc3DvEHUbk85xrqHdwngd/FiMdEC2f5Kt51VYp8G/3R+sbFiy6Wt7wlZw2+/wI8EfxXs31HQ5q/RDUTXz6JMbzsR7EUOF+WkOrgi1nDugu13/O9hDnxPJnkzNGEfjt0xPxdhoDdl4vWdwRe1awBEn90SyJwc8+cFk1XACtvWoGwtPdf1xnHUwx5Ge1TqEd46xdjjlu+iTw2Xu5AsESUVVw81STsKA7vC8EBabQ+yXQHZlNFcFCKa1+AutNxfWHNQtnFK03kUCai4ZPJc/TQrhvf9DWjSyX+KknWdV6aQyz65KOpwtQWpd4ZlqAAKvf9vCQIBgk+YdsxFzAq6ySnLPcBLbFvP+Xyo5bcABg8IS9aJr6+05KT3ZOv49G1uYvz1ILaDED83D5NHF57ZswKR2911SevaqIO2i8NkZAJUMBpgroSejoJ1MxzpL/a7I26u6+p/08uMt/dT7vuo5OTTjayEtIlXy1IRXA/jU/uX/pKk1JrsZFhhwj7G5KEQpMAx+YvZUaaidqyfj3+fLb6+rsa8BukV8x0zfgUg20dm+Wu9XjDvyQHFP4Qt65CaUbhAKcVTgCChgTfSSdUJZIPPa5Yhzr7SmTuVGmYV/1cC4jGzNdSqr3Fq28fWukiEnRtqfZRXlOdA6xb - - - - - - - - - - false - - = - true - - - - - - - - https://${KEYCLOAK_LOGIN_URL}/auth/realms/standard/login-actions/post-broker-login?client_id=on-route-bc-direct-4598&tab_id=KAxYXjoatGc - GET - true - false - true - false - - - - - - - - - Host - ${KEYCLOAK_LOGIN_URL} - - - Connection - keep-alive - - - Cache-Control - max-age=0 - - - Upgrade-Insecure-Requests - 1 - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Accept - text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - navigate - - - Sec-Fetch-Dest - document - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - sec-ch-ua-mobile - ?0 - - - sec-ch-ua-platform - "Windows" - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - Cookie - AUTH_SESSION_ID=0e56ff7b-e277-400f-84f5-25801c43c829.ycloak-78b4c74bcf-kh476; AUTH_SESSION_ID_LEGACY=0e56ff7b-e277-400f-84f5-25801c43c829.ycloak-78b4c74bcf-kh476; KC_RESTART=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICIzMmI0MzNkNC02NjgwLTQxODMtOTc2Yy1kZDdjMTg0YjExMTQifQ.eyJjaWQiOiJvbi1yb3V0ZS1iYy1kaXJlY3QtNDU5OCIsInB0eSI6Im9wZW5pZC1jb25uZWN0IiwicnVyaSI6Imh0dHBzOi8vb25yb3V0ZWJjLXRlc3QtZnJvbnRlbmQuYXBwcy5zaWx2ZXIuZGV2b3BzLmdvdi5iYy5jYS8iLCJhY3QiOiJBVVRIRU5USUNBVEUiLCJub3RlcyI6eyJzY29wZSI6Im9wZW5pZCIsImlzcyI6Imh0dHBzOi8vdGVzdC5sb2dpbnByb3h5Lmdvdi5iYy5jYS9hdXRoL3JlYWxtcy9zdGFuZGFyZCIsInJlc3BvbnNlX3R5cGUiOiJjb2RlIiwiY29kZV9jaGFsbGVuZ2VfbWV0aG9kIjoiUzI1NiIsInJlZGlyZWN0X3VyaSI6Imh0dHBzOi8vb25yb3V0ZWJjLXRlc3QtZnJvbnRlbmQuYXBwcy5zaWx2ZXIuZGV2b3BzLmdvdi5iYy5jYS8iLCJzdGF0ZSI6IjdiZTBmNDk4ZGRmYTQ1ZTI4ZWU4ZjI0MTY0NzViYTQyIiwiY29kZV9jaGFsbGVuZ2UiOiJCNEpzelBjUzBIT1c3RUNUVFVVUkMxbXA2ejhhdDJiNkswbEQxdUtfMTFBIiwia2NfaWRwX2hpbnQiOiJiY2VpZGJvdGgiLCJyZXNwb25zZV9tb2RlIjoicXVlcnkifX0.2dLZTTjk8ZY0EFAaE88sAWQlfo7T17XcYLztnQwI_Yk; _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; FAILREASON=0; SMSESSION=Awk9KIrMNenX09Vl2cEMuy/VxV9CFVP4fsBzCp8Zo3AX2VsrDVWkOMVOdJyoY1Q1J9F8Vs8XFBtHTU29qS7+jlhEMK3f9j8tgudEVWHJq8LTizGhEj1cf8r7CX2QuxWMbdAHvK90hFnpocsL5xv2cAaFVdqhBKlIYkzwkY+r0YuH3Uh6DJVIhAhwjWeKfO6BAg5/jNFxQ31EPvzn4N7RxJK2bGyfAxzi6Cs6O7ieJ10MzcB8nWSIsO4ksfG8pzeGp9a+arl4maKnd9Je2L2FQohmiOjfGcrsezOgLgiWFl1B3+EL8ytArvtKhsFvr7WJsQuhYsQYzfY8shcfhNSltyqxLD422bDmU3NyZdhWY9313YG5I1U2vbO7zvXhxaCJYnpMrJR+inz8XsyqnGY1xu7AepY3pNd2wJH3twQJ42N6R2WlJVVN3oc3DvEHUbk85xrqHdwngd/FiMdEC2f5Kt51VYp8G/3R+sbFiy6Wt7wlZw2+/wI8EfxXs31HQ5q/RDUTXz6JMbzsR7EUOF+WkOrgi1nDugu13/O9hDnxPJnkzNGEfjt0xPxdhoDdl4vWdwRe1awBEn90SyJwc8+cFk1XACtvWoGwtPdf1xnHUwx5Ge1TqEd46xdjjlu+iTw2Xu5AsESUVVw81STsKA7vC8EBabQ+yXQHZlNFcFCKa1+AutNxfWHNQtnFK03kUCai4ZPJc/TQrhvf9DWjSyX+KknWdV6aQyz65KOpwtQWpd4ZlqAAKvf9vCQIBgk+YdsxFzAq6ySnLPcBLbFvP+Xyo5bcABg8IS9aJr6+05KT3ZOv49G1uYvz1ILaDED83D5NHF57ZswKR2911SevaqIO2i8NkZAJUMBpgroSejoJ1MxzpL/a7I26u6+p/08uMt/dT7vuo5OTTjayEtIlXy1IRXA/jU/uX/pKk1JrsZFhhwj7G5KEQpMAx+YvZUaaidqyfj3+fLb6+rsa8BukV8x0zfgUg20dm+Wu9XjDvyQHFP4Qt65CaUbhAKcVTgCChgTfSSdUJZIPPa5Yhzr7SmTuVGmYV/1cC4jGzNdSqr3Fq28fWukiEnRtqfZRXlOdA6xb - - - - - - - - - - false - - = - true - - - - - - - - https://${FRONTEND_API_URL}/?state=7be0f498ddfa45e28ee8f2416475ba42&session_state=0e56ff7b-e277-400f-84f5-25801c43c829&code=e1db6532-ce36-4aa5-845c-26c6d9f6e19f.0e56ff7b-e277-400f-84f5-25801c43c829.f462b30d-0893-4a2d-8169-3461d82c36eb - GET - true - false - true - false - - - - - - - - - Host - ${FRONTEND_API_URL} - - - Connection - keep-alive - - - Cache-Control - max-age=0 - - - Upgrade-Insecure-Requests - 1 - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Accept - text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - navigate - - - Sec-Fetch-Dest - document - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - sec-ch-ua-mobile - ?0 - - - sec-ch-ua-platform - "Windows" - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - Cookie - _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; FAILREASON=0; 9a75866e187615f9e3e688e8297548f9=1f5b60b83338df80ae3a11e1286008b7; SMSESSION=Awk9KIrMNenX09Vl2cEMuy/VxV9CFVP4fsBzCp8Zo3AX2VsrDVWkOMVOdJyoY1Q1J9F8Vs8XFBtHTU29qS7+jlhEMK3f9j8tgudEVWHJq8LTizGhEj1cf8r7CX2QuxWMbdAHvK90hFnpocsL5xv2cAaFVdqhBKlIYkzwkY+r0YuH3Uh6DJVIhAhwjWeKfO6BAg5/jNFxQ31EPvzn4N7RxJK2bGyfAxzi6Cs6O7ieJ10MzcB8nWSIsO4ksfG8pzeGp9a+arl4maKnd9Je2L2FQohmiOjfGcrsezOgLgiWFl1B3+EL8ytArvtKhsFvr7WJsQuhYsQYzfY8shcfhNSltyqxLD422bDmU3NyZdhWY9313YG5I1U2vbO7zvXhxaCJYnpMrJR+inz8XsyqnGY1xu7AepY3pNd2wJH3twQJ42N6R2WlJVVN3oc3DvEHUbk85xrqHdwngd/FiMdEC2f5Kt51VYp8G/3R+sbFiy6Wt7wlZw2+/wI8EfxXs31HQ5q/RDUTXz6JMbzsR7EUOF+WkOrgi1nDugu13/O9hDnxPJnkzNGEfjt0xPxdhoDdl4vWdwRe1awBEn90SyJwc8+cFk1XACtvWoGwtPdf1xnHUwx5Ge1TqEd46xdjjlu+iTw2Xu5AsESUVVw81STsKA7vC8EBabQ+yXQHZlNFcFCKa1+AutNxfWHNQtnFK03kUCai4ZPJc/TQrhvf9DWjSyX+KknWdV6aQyz65KOpwtQWpd4ZlqAAKvf9vCQIBgk+YdsxFzAq6ySnLPcBLbFvP+Xyo5bcABg8IS9aJr6+05KT3ZOv49G1uYvz1ILaDED83D5NHF57ZswKR2911SevaqIO2i8NkZAJUMBpgroSejoJ1MxzpL/a7I26u6+p/08uMt/dT7vuo5OTTjayEtIlXy1IRXA/jU/uX/pKk1JrsZFhhwj7G5KEQpMAx+YvZUaaidqyfj3+fLb6+rsa8BukV8x0zfgUg20dm+Wu9XjDvyQHFP4Qt65CaUbhAKcVTgCChgTfSSdUJZIPPa5Yhzr7SmTuVGmYV/1cC4jGzNdSqr3Fq28fWukiEnRtqfZRXlOdA6xb - - - - - - - - - - false - - = - true - - - - - - - - https://${VEHICLES_API_URL}/users/user-context - OPTIONS - true - false - true - false - - - - - - - - - Host - ${VEHICLES_API_URL} - - - Connection - keep-alive - - - Accept - */* - - - Access-Control-Request-Method - POST - - - Access-Control-Request-Headers - authorization,content-type - - - Origin - https://${FRONTEND_API_URL} - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Sec-Fetch-Mode - cors - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Dest - empty - - - Referer - https://${FRONTEND_API_URL}/ - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - - - - - true - - - - false - {} - = - - - - - - - - https://${VEHICLES_API_URL}/users/user-context - POST - true - false - true - false - - - - - - - - - Host - ${VEHICLES_API_URL} - - - Connection - keep-alive - - - Content-Length - 2 - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - Accept - application/json, text/plain, */* - - - Content-Type - application/json - - - sec-ch-ua-mobile - ?0 - - - Authorization - Bearer ${IDIR_BEARER_TOKEN} - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - sec-ch-ua-platform - "Windows" - - - Origin - https://${FRONTEND_API_URL} - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - cors - - - Sec-Fetch-Dest - empty - - - Referer - https://${FRONTEND_API_URL}/ - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - - - - - - - - false - - = - true - - - - - - - - https://${VEHICLES_API_URL}/users/roles?companyId=102 - OPTIONS - true - false - true - false - - - - - - - - - Host - ${VEHICLES_API_URL} - - - Connection - keep-alive - - - Accept - */* - - - Access-Control-Request-Method - GET - - - Access-Control-Request-Headers - authorization - - - Origin - https://${FRONTEND_API_URL} - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Sec-Fetch-Mode - cors - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Dest - empty - - - Referer - https://${FRONTEND_API_URL}/ - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - - - - - - - - false - - = - true - - - - - - - - https://${VEHICLES_API_URL}/users/roles?companyId=102 - GET - true - false - true - false - - - - - - - - - Host - ${VEHICLES_API_URL} - - - Connection - keep-alive - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - Accept - application/json, text/plain, */* - - - sec-ch-ua-mobile - ?0 - - - Authorization - Bearer ${IDIR_BEARER_TOKEN} - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - sec-ch-ua-platform - "Windows" - - - Origin - https://${FRONTEND_API_URL} - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - cors - - - Sec-Fetch-Dest - empty - - - Referer - https://${FRONTEND_API_URL}/ - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - If-None-Match - W/"1b4-DdYKGtaFZ5+U7pxjw6uu3owPOfo" - - - - - - - - - - false - - = - - - - - - - - https://${VEHICLES_API_URL}/permits/applications?status=IN_PROGRESS&companyId=102&userGUID=A9ED2C5742DC455998672CC2A118174B - OPTIONS - true - false - true - false - - - - - - - - - Host - ${VEHICLES_API_URL} - - - Connection - keep-alive - - - Accept - */* - - - Access-Control-Request-Method - GET - - - Access-Control-Request-Headers - authorization - - - Origin - https://${FRONTEND_API_URL} - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Sec-Fetch-Mode - cors - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Dest - empty - - - Referer - https://${FRONTEND_API_URL}/ - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - - - - - - - - false - - = - true - - - - - - - - https://${VEHICLES_API_URL}/permits/applications?status=IN_PROGRESS&companyId=102&userGUID=A9ED2C5742DC455998672CC2A118174B - GET - true - false - true - false - - - - - - - - - Host - ${VEHICLES_API_URL} - - - Connection - keep-alive - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - Accept - application/json, text/plain, */* - - - sec-ch-ua-mobile - ?0 - - - Authorization - Bearer ${IDIR_BEARER_TOKEN} - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - sec-ch-ua-platform - "Windows" - - - Origin - https://${FRONTEND_API_URL} - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - cors - - - Sec-Fetch-Dest - empty - - - Referer - https://${FRONTEND_API_URL}/ - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - If-None-Match - W/"17b2-OQs45yY+9rxT8oaE549bg+d9IqA" - - - - - - - - - - - - - - https://${VEHICLES_API_URL}/users/roles?companyId=103 - GET - true - false - true - false - - - - - - - - - Host - ${VEHICLES_API_URL} - - - Connection - keep-alive - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - Accept - application/json - - - sec-ch-ua-mobile - ?0 - - - Authorization - Bearer ${IDIR_BEARER_TOKEN} - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - sec-ch-ua-platform - "Windows" - - - Origin - https://${FRONTEND_API_URL} - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - cors - - - Sec-Fetch-Dest - empty - - - Referer - https://${FRONTEND_API_URL}/ - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - If-None-Match - W/"17b2-OQs45yY+9rxT8oaE549bg+d9IqA" - - - - - - - - Authorization - Bearer ${IDIR_BEARER_TOKEN} - - - Accept - */* - - - - - - - - - - false - - = - true - - - - - - - - https://${VEHICLES_API_URL}/permits/ppc/search?searchColumn=permitNumber&searchString= - GET - true - false - true - false - - - - - - - - - Host - ${VEHICLES_API_URL} - - - Connection - keep-alive - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - Accept - application/json - - - sec-ch-ua-mobile - ?0 - - - Authorization - Bearer ${IDIR_BEARER_TOKEN} - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - sec-ch-ua-platform - "Windows" - - - Origin - https://${FRONTEND_API_URL} - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - cors - - - Sec-Fetch-Dest - empty - - - Referer - https://${FRONTEND_API_URL}/ - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - If-None-Match - W/"17b2-OQs45yY+9rxT8oaE549bg+d9IqA" - - - - - - - - Authorization - Bearer ${IDIR_BEARER_TOKEN} - - - Accept - application/json - - - - - - - - - - false - - = - true - - - - - - - - https://${VEHICLES_API_URL}/permits/applications/9?amendment=true&companyId=103 - GET - true - false - true - false - - - - - - - - - Host - ${VEHICLES_API_URL} - - - Connection - keep-alive - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - Accept - application/json - - - sec-ch-ua-mobile - ?0 - - - Authorization - Bearer ${IDIR_BEARER_TOKEN} - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - sec-ch-ua-platform - "Windows" - - - Origin - https://${FRONTEND_API_URL} - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - cors - - - Sec-Fetch-Dest - empty - - - Referer - https://${FRONTEND_API_URL}/ - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - If-None-Match - W/"17b2-OQs45yY+9rxT8oaE549bg+d9IqA" - - - - - - - - Authorization - Bearer ${IDIR_BEARER_TOKEN} - - - Accept - application/json - - - - - - - - - - false - - = - true - - - - - - - - https://${VEHICLES_API_URL}/permits/11/pdf?download=url - GET - true - false - true - false - - - - - - - - - Host - ${VEHICLES_API_URL} - - - Connection - keep-alive - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - Accept - application/json - - - sec-ch-ua-mobile - ?0 - - - Authorization - Bearer ${IDIR_BEARER_TOKEN} - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - sec-ch-ua-platform - "Windows" - - - Origin - https://${FRONTEND_API_URL} - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - cors - - - Sec-Fetch-Dest - empty - - - Referer - https://${FRONTEND_API_URL}/ - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - If-None-Match - W/"17b2-OQs45yY+9rxT8oaE549bg+d9IqA" - - - - - - - - Authorization - Bearer ${IDIR_BEARER_TOKEN} - - - Accept - application/json - - - - - - - + + false + true + C:\Users\BRWANG\Software\chromedriver-win64\chromedriver-win64\chromedriver.exe + false + false + true + + + SYSTEM + + + 8080 + true + + 8080 + true + + 8080 + true + + 8080 + localhost + + + + continue false 1 1 - ${__P(rampup,300)} - 1365261073000 - 1365261073000 - true - ${__P(duration,3000)} + 1 + false + true - - ${__P(Delay,10000)} - + + import org.openqa.selenium.By +import org.openqa.selenium.support.ui.ExpectedConditions +import org.openqa.selenium.support.ui.WebDriverWait +import org.openqa.selenium.WebElement + +WDS.sampleResult.sampleStart() +def frontendUrl = WDS.vars.get("FRONTEND_URL") +WDS.browser.get(frontendUrl); +Thread.sleep(5000) + + +def loginButton = WDS.browser.findElement(By.id('login-idir')) +if (loginButton != null) { + loginButton.click() + WDS.log.info("Clicked on the login-bceid button") +} else { + WDS.log.info("Button with id 'login-bceid' not found") +} + +Thread.sleep(10000) +/* +def user = WDS.browser.findElement(By.id('user')) +def password = WDS.browser.findElement(By.id('password')) + +def userValue = WDS.vars.get("USER") +def passwordValue = WDS.vars.get("PASSWORD") +if(user != null && password != null) +{ + user.sendKeys(userValue) + password.sendKeys(passwordValue) + Thread.sleep(5000) + } + + +def submitButton = WDS.browser.findElement(By.name('btnSubmit')) +if (submitButton != null) { + submitButton.click() +} else { + WDS.log.info('Submit button with name="btnSubmit" not found') +} +Thread.sleep(10000) +*/ + +// idir user search applications + +def searchIcon = WDS.browser.findElement(By.className('search-button')) +searchIcon.click() +Thread.sleep(5000) + +def searchInput = WDS.browser.findElement(By.className('css-1pog434')) +searchInput.sendKeys('p') +Thread.sleep(5000) + +def searchButton = WDS.browser.findElement(By.className('search-by__search')) +searchButton.click() +Thread.sleep(5000) + +WDS.sampleResult.sampleEnd() + + + groovy + - - - - - false - - = - true - - - - - - - - https://${FRONTEND_API_URL}/ - GET - true - false - true - false - - - - - - - - - Host - ${FRONTEND_API_URL} - - - Connection - keep-alive - - - Cache-Control - max-age=0 - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - sec-ch-ua-mobile - ?0 - - - sec-ch-ua-platform - "Windows" - - - Upgrade-Insecure-Requests - 1 - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Accept - text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 - - - Sec-Fetch-Site - same-origin - - - Sec-Fetch-Mode - navigate - - - Sec-Fetch-User - ?1 - - - Sec-Fetch-Dest - document - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - Cookie - _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; FAILREASON=0; 9a75866e187615f9e3e688e8297548f9=1f5b60b83338df80ae3a11e1286008b7; SMSESSION=LOGGEDOFF - - - If-None-Match - W/"653ca247-308" - - - If-Modified-Since - Sat, 28 Oct 2023 05:55:19 GMT - - - - - - - - - - false - - = - true - - - - - - - - https://${KEYCLOAK_LOGIN_URL}/auth/realms/standard/.well-known/openid-configuration - GET - true - false - true - false - - - - - - - - - Host - ${KEYCLOAK_LOGIN_URL} - - - Connection - keep-alive - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - Accept - application/jwk-set+json, application/json - - - sec-ch-ua-mobile - ?0 - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - sec-ch-ua-platform - "Windows" - - - Origin - https://${FRONTEND_API_URL} - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - cors - - - Sec-Fetch-Dest - empty - - - Referer - https://${FRONTEND_API_URL}/ - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - - - - - - - - false - - = - true - - - - - - - - https://${KEYCLOAK_LOGIN_URL}/auth/realms/standard/protocol/openid-connect/auth?client_id=on-route-bc-direct-4598&redirect_uri=https%3A%2F%2F${FRONTEND_API_URL}%2F&response_type=code&scope=openid&state=7be0f498ddfa45e28ee8f2416475ba42&code_challenge=B4JszPcS0HOW7ECTTUURC1mp6z8at2b6K0lD1uK_11A&code_challenge_method=S256&response_mode=query&kc_idp_hint=bceidboth - GET - true - false - true - false - - - - - - - - - Host - ${KEYCLOAK_LOGIN_URL} - - - Connection - keep-alive - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - sec-ch-ua-mobile - ?0 - - - sec-ch-ua-platform - "Windows" - - - Upgrade-Insecure-Requests - 1 - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Accept - text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - navigate - - - Sec-Fetch-User - ?1 - - - Sec-Fetch-Dest - document - - - Referer - https://${FRONTEND_API_URL}/ - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - Cookie - AUTH_SESSION_ID=2e364c60-0ead-4ec1-98fb-0e1bba001f08.ycloak-78b4c74bcf-vtmwp; AUTH_SESSION_ID_LEGACY=2e364c60-0ead-4ec1-98fb-0e1bba001f08.ycloak-78b4c74bcf-vtmwp; _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; FAILREASON=0; SMSESSION=LOGGEDOFF - - - - - - - - - - false - - = - true - - - - - - - - https://${KEYCLOAK_LOGIN_URL}/auth/realms/standard/broker/bceidboth/login?session_code=5b_D1WNhNIzE-FZe70dEmhs_J2mpDyFSyQzWPAxnjYc&client_id=on-route-bc-direct-4598&tab_id=KAxYXjoatGc - GET - true - false - true - false - - - - - - - - - Host - ${KEYCLOAK_LOGIN_URL} - - - Connection - keep-alive - - - Upgrade-Insecure-Requests - 1 - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Accept - text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - navigate - - - Sec-Fetch-User - ?1 - - - Sec-Fetch-Dest - document - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - sec-ch-ua-mobile - ?0 - - - sec-ch-ua-platform - "Windows" - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - Cookie - AUTH_SESSION_ID=0e56ff7b-e277-400f-84f5-25801c43c829.ycloak-78b4c74bcf-kh476; AUTH_SESSION_ID_LEGACY=0e56ff7b-e277-400f-84f5-25801c43c829.ycloak-78b4c74bcf-kh476; KC_RESTART=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICIzMmI0MzNkNC02NjgwLTQxODMtOTc2Yy1kZDdjMTg0YjExMTQifQ.eyJjaWQiOiJvbi1yb3V0ZS1iYy1kaXJlY3QtNDU5OCIsInB0eSI6Im9wZW5pZC1jb25uZWN0IiwicnVyaSI6Imh0dHBzOi8vb25yb3V0ZWJjLXRlc3QtZnJvbnRlbmQuYXBwcy5zaWx2ZXIuZGV2b3BzLmdvdi5iYy5jYS8iLCJhY3QiOiJBVVRIRU5USUNBVEUiLCJub3RlcyI6eyJzY29wZSI6Im9wZW5pZCIsImlzcyI6Imh0dHBzOi8vdGVzdC5sb2dpbnByb3h5Lmdvdi5iYy5jYS9hdXRoL3JlYWxtcy9zdGFuZGFyZCIsInJlc3BvbnNlX3R5cGUiOiJjb2RlIiwiY29kZV9jaGFsbGVuZ2VfbWV0aG9kIjoiUzI1NiIsInJlZGlyZWN0X3VyaSI6Imh0dHBzOi8vb25yb3V0ZWJjLXRlc3QtZnJvbnRlbmQuYXBwcy5zaWx2ZXIuZGV2b3BzLmdvdi5iYy5jYS8iLCJzdGF0ZSI6IjdiZTBmNDk4ZGRmYTQ1ZTI4ZWU4ZjI0MTY0NzViYTQyIiwiY29kZV9jaGFsbGVuZ2UiOiJCNEpzelBjUzBIT1c3RUNUVFVVUkMxbXA2ejhhdDJiNkswbEQxdUtfMTFBIiwia2NfaWRwX2hpbnQiOiJiY2VpZGJvdGgiLCJyZXNwb25zZV9tb2RlIjoicXVlcnkifX0.2dLZTTjk8ZY0EFAaE88sAWQlfo7T17XcYLztnQwI_Yk; _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; FAILREASON=0; SMSESSION=LOGGEDOFF - - - - - - - - - - false - - = - true - - - - - - - - https://${KEYCLOAK_LOGIN_URL}/auth/realms/bceidboth/protocol/openid-connect/auth?scope=openid&state=JvIyfmoj0AzmBZWw0ZS8lBmhMJXd7lA_uAR8JQvLNlE.KAxYXjoatGc.on-route-bc-direct-4598&response_type=code&client_id=standard-realm&redirect_uri=https%3A%2F%2F${KEYCLOAK_LOGIN_URL}%2Fauth%2Frealms%2Fstandard%2Fbroker%2Fbceidboth%2Fendpoint&nonce=1sKWmdZ0aV6QIscb65Lrmg - GET - true - false - true - false - - - - - - - - - Host - ${KEYCLOAK_LOGIN_URL} - - - Connection - keep-alive - - - Upgrade-Insecure-Requests - 1 - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Accept - text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - navigate - - - Sec-Fetch-User - ?1 - - - Sec-Fetch-Dest - document - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - sec-ch-ua-mobile - ?0 - - - sec-ch-ua-platform - "Windows" - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - Cookie - AUTH_SESSION_ID=33769057-e4e2-49e9-821b-bab26d4e7507.ycloak-78b4c74bcf-gj9d6; AUTH_SESSION_ID_LEGACY=33769057-e4e2-49e9-821b-bab26d4e7507.ycloak-78b4c74bcf-gj9d6; KEYCLOAK_IDENTITY=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI1ZjExNjBiNS03Y2RjLTQ5NGQtYmFkOS0yZGRkNjU3MDU5Y2UifQ.eyJleHAiOjE2OTg3MzE3MzQsImlhdCI6MTY5ODY5NTczNCwianRpIjoiNzY3ZDEzMGEtMzczMC00NDdhLWEzNTUtNjhhNDhiMjgzZTI3IiwiaXNzIjoiaHR0cHM6Ly90ZXN0LmxvZ2lucHJveHkuZ292LmJjLmNhL2F1dGgvcmVhbG1zL2JjZWlkYm90aCIsInN1YiI6ImQ3M2FiN2IwLWUyMmEtNDg0NC04Yzc3LWU3YTQ2ODQyOTNmZCIsInR5cCI6IlNlcmlhbGl6ZWQtSUQiLCJzZXNzaW9uX3N0YXRlIjoiMzM3NjkwNTctZTRlMi00OWU5LTgyMWItYmFiMjZkNGU3NTA3Iiwic2lkIjoiMzM3NjkwNTctZTRlMi00OWU5LTgyMWItYmFiMjZkNGU3NTA3Iiwic3RhdGVfY2hlY2tlciI6Ik9SWEI4amY3Q3hPUWhzTUNhWU5nMHF2WHNzZG52cnlxUHFjMnFpUkthZncifQ.1kpL3Qpg4pyqSLBE0iDz7WZ0fdGzCCf6RCiN6HvFWqE; KEYCLOAK_IDENTITY_LEGACY=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI1ZjExNjBiNS03Y2RjLTQ5NGQtYmFkOS0yZGRkNjU3MDU5Y2UifQ.eyJleHAiOjE2OTg3MzE3MzQsImlhdCI6MTY5ODY5NTczNCwianRpIjoiNzY3ZDEzMGEtMzczMC00NDdhLWEzNTUtNjhhNDhiMjgzZTI3IiwiaXNzIjoiaHR0cHM6Ly90ZXN0LmxvZ2lucHJveHkuZ292LmJjLmNhL2F1dGgvcmVhbG1zL2JjZWlkYm90aCIsInN1YiI6ImQ3M2FiN2IwLWUyMmEtNDg0NC04Yzc3LWU3YTQ2ODQyOTNmZCIsInR5cCI6IlNlcmlhbGl6ZWQtSUQiLCJzZXNzaW9uX3N0YXRlIjoiMzM3NjkwNTctZTRlMi00OWU5LTgyMWItYmFiMjZkNGU3NTA3Iiwic2lkIjoiMzM3NjkwNTctZTRlMi00OWU5LTgyMWItYmFiMjZkNGU3NTA3Iiwic3RhdGVfY2hlY2tlciI6Ik9SWEI4amY3Q3hPUWhzTUNhWU5nMHF2WHNzZG52cnlxUHFjMnFpUkthZncifQ.1kpL3Qpg4pyqSLBE0iDz7WZ0fdGzCCf6RCiN6HvFWqE; KEYCLOAK_SESSION=bceidboth/d73ab7b0-e22a-4844-8c77-e7a4684293fd/33769057-e4e2-49e9-821b-bab26d4e7507; KEYCLOAK_SESSION_LEGACY=bceidboth/d73ab7b0-e22a-4844-8c77-e7a4684293fd/33769057-e4e2-49e9-821b-bab26d4e7507; _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; FAILREASON=0; SMSESSION=LOGGEDOFF - - - - - - - - - - false - - = - true - - - - - - - - https://${KEYCLOAK_LOGIN_URL}/auth/realms/bceidboth/broker/bceidboth/login?session_code=oRr0p7JZ9oL7vptnFPfNKhf_nrB8DND1rBojsNPjot0&client_id=standard-realm&tab_id=k5Vw5BDlfVQ - GET - true - false - true - false - - - - - - - - - Host - ${KEYCLOAK_LOGIN_URL} - - - Connection - keep-alive - - - Upgrade-Insecure-Requests - 1 - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Accept - text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - navigate - - - Sec-Fetch-User - ?1 - - - Sec-Fetch-Dest - document - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - sec-ch-ua-mobile - ?0 - - - sec-ch-ua-platform - "Windows" - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - Cookie - AUTH_SESSION_ID=f26f78a0-28d2-40b4-9e57-b83fa590e32e.ycloak-78b4c74bcf-vtmwp; AUTH_SESSION_ID_LEGACY=f26f78a0-28d2-40b4-9e57-b83fa590e32e.ycloak-78b4c74bcf-vtmwp; KC_RESTART=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI1ZjExNjBiNS03Y2RjLTQ5NGQtYmFkOS0yZGRkNjU3MDU5Y2UifQ.eyJjaWQiOiJzdGFuZGFyZC1yZWFsbSIsInB0eSI6Im9wZW5pZC1jb25uZWN0IiwicnVyaSI6Imh0dHBzOi8vdGVzdC5sb2dpbnByb3h5Lmdvdi5iYy5jYS9hdXRoL3JlYWxtcy9zdGFuZGFyZC9icm9rZXIvYmNlaWRib3RoL2VuZHBvaW50IiwiYWN0IjoiQVVUSEVOVElDQVRFIiwibm90ZXMiOnsic2NvcGUiOiJvcGVuaWQiLCJpc3MiOiJodHRwczovL3Rlc3QubG9naW5wcm94eS5nb3YuYmMuY2EvYXV0aC9yZWFsbXMvYmNlaWRib3RoIiwicmVzcG9uc2VfdHlwZSI6ImNvZGUiLCJyZWRpcmVjdF91cmkiOiJodHRwczovL3Rlc3QubG9naW5wcm94eS5nb3YuYmMuY2EvYXV0aC9yZWFsbXMvc3RhbmRhcmQvYnJva2VyL2JjZWlkYm90aC9lbmRwb2ludCIsInN0YXRlIjoiSnZJeWZtb2owQXptQlpXdzBaUzhsQm1oTUpYZDdsQV91QVI4SlF2TE5sRS5LQXhZWGpvYXRHYy5vbi1yb3V0ZS1iYy1kaXJlY3QtNDU5OCIsIm5vbmNlIjoiMXNLV21kWjBhVjZRSXNjYjY1THJtZyJ9fQ.08S_Qi57kTkuLj_eH5VElw2zeuH4AVhfOUois5IUzEI; _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; FAILREASON=0; SMSESSION=LOGGEDOFF - - - - - - - - - - false - - = - true - - - - - - - - https://${SITEMINDER_URL}/clp-cgi/capBceid/logon.cgi?flags=0101:0,7&TYPE=33554433&REALMOID=06-b02c7ed2-895e-4953-bd03-8008c64ec906&GUID=&SMAUTHREASON=0&METHOD=GET&SMAGENTNAME=$SM$Lk6VtkyHw8x3zQIIsMiOiEXYFJF%2fJzjVT7eioCjxBjJck5VMlbxxrR%2bLZSo%2flIBX&TARGET=$SM$HTTPS%3a%2f%2fsfstest7%2egov%2ebc%2eca%2faffwebservices%2fredirectjsp%2ftestkeycloak-basicbusinessbceid%2fredirect%2ejsp%3fSMPORTALURL%3dhttps$%3A$%2F$%2Fsfstest7%2egov%2ebc%2eca$%2Faffwebservices$%2Fpublic$%2Fsaml2sso%26SAMLTRANSACTIONID%3dc9f189ad-7324de1b-2e045e1a-e8bcf162-a78af00c-c5 - GET - true - false - true - false - - - - - - - - - Host - ${SITEMINDER_URL} - - - Connection - keep-alive - - - Cache-Control - max-age=0 - - - Upgrade-Insecure-Requests - 1 - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Accept - text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - navigate - - - Sec-Fetch-Dest - document - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - sec-ch-ua-mobile - ?0 - - - sec-ch-ua-platform - "Windows" - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - Cookie - _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; Dummy1=DummyVal1; BCGOVFlags=0101%3A0%2C7; BCGOVCustom=NULL; BCGOVBrand=NULL; BCGOVBehavior=NULL; Dummy2=DummyVal2; preDummy1=DummyVal1; preDummy2=DummyVal2; preDummy3=DummyVal3; BCGOVDoNotShow=1; preDummy4=DummyVal4; FAILREASON=0; BCGOVTarget=HTTPS%3A%2F%2Fsfstest7.gov.bc.ca%2Faffwebservices%2Fredirectjsp%2Ftestkeycloak-basicbusinessbceid%2Fredirect.jsp%3FSMPORTALURL%3Dhttps%253A%252F%252Fsfstest7.gov.bc.ca%252Faffwebservices%252Fpublic%252Fsaml2sso%26SAMLTRANSACTIONID%3Df7917115-57286b4a-df9cf6ff-b50e2f11-c566ac5a-f6; BCGOVclptryno=0; clp001=0; SMSESSION=LOGGEDOFF; SMFED_OLD_SESSION=""; SMFED_OLD_IDENTITY=""; GUID=1:26feb557-62af2c8c-4ef3a8d7-2e2277be-6a76895c-697 - - - - - - - true - - - - false - instance=instance_capBceid&user=ORBCTST3&password=orbcTST%2B2023 - = - - - - - - - - https://${SITEMINDER_URL}/clp-cgi/preLogon.cgi - POST - true - false - true - false - - - - - - - - - Host - ${SITEMINDER_URL} - - - Connection - keep-alive - - - Content-Length - 64 - - - Cache-Control - max-age=0 - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - sec-ch-ua-mobile - ?0 - - - sec-ch-ua-platform - "Windows" - - - Upgrade-Insecure-Requests - 1 - - - Origin - https://${SITEMINDER_URL} - - - Content-Type - application/x-www-form-urlencoded - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Accept - text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 - - - Sec-Fetch-Site - same-origin - - - Sec-Fetch-Mode - navigate - - - Sec-Fetch-User - ?1 - - - Sec-Fetch-Dest - document - - - Referer - https://${SITEMINDER_URL}/clp-cgi/capBceid/logon.cgi?flags=0101:0,7&TYPE=33554433&REALMOID=06-b02c7ed2-895e-4953-bd03-8008c64ec906&GUID=&SMAUTHREASON=0&METHOD=GET&SMAGENTNAME=$SM$Lk6VtkyHw8x3zQIIsMiOiEXYFJF%2fJzjVT7eioCjxBjJck5VMlbxxrR%2bLZSo%2flIBX&TARGET=$SM$HTTPS%3a%2f%2fsfstest7%2egov%2ebc%2eca%2faffwebservices%2fredirectjsp%2ftestkeycloak-basicbusinessbceid%2fredirect%2ejsp%3fSMPORTALURL%3dhttps$%3A$%2F$%2Fsfstest7%2egov%2ebc%2eca$%2Faffwebservices$%2Fpublic$%2Fsaml2sso%26SAMLTRANSACTIONID%3dc9f189ad-7324de1b-2e045e1a-e8bcf162-a78af00c-c5 - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - Cookie - _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; Dummy1=DummyVal1; BCGOVFlags=0101%3A0%2C7; BCGOVCustom=NULL; BCGOVBrand=NULL; BCGOVBehavior=NULL; Dummy2=DummyVal2; preDummy1=DummyVal1; preDummy2=DummyVal2; preDummy3=DummyVal3; BCGOVDoNotShow=1; preDummy4=DummyVal4; FAILREASON=0; clp001=0; SMSESSION=LOGGEDOFF; SMFED_OLD_SESSION=""; SMFED_OLD_IDENTITY=""; GUID=1:26feb557-62af2c8c-4ef3a8d7-2e2277be-6a76895c-697; BCGOVTarget=HTTPS%3A%2F%2Fsfstest7.gov.bc.ca%2Faffwebservices%2Fredirectjsp%2Ftestkeycloak-basicbusinessbceid%2Fredirect.jsp%3FSMPORTALURL%3Dhttps%253A%252F%252Fsfstest7.gov.bc.ca%252Faffwebservices%252Fpublic%252Fsaml2sso%26SAMLTRANSACTIONID%3Dc9f189ad-7324de1b-2e045e1a-e8bcf162-a78af00c-c5; BCGOVclptryno=1 - - - - - - - true - - - - false - SMENC=ISO-8859-1&SMLOCALE=US-EN&target=%2Fclp-cgi%2Fcap07%2Fprivate%2FpostLogon.cgi&smauthreason=0&smagentname=&user=ORBCTST3&password=orbcTST%2B2023 - = - - - - - - - - https://${SITEMINDER_URL}/clp-cgi/cap07/logon.fcc - POST - true - false - true - false - - - - - - - - - Host - ${SITEMINDER_URL} - - - Connection - keep-alive - - - Content-Length - 149 - - - Cache-Control - max-age=0 - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - sec-ch-ua-mobile - ?0 - - - sec-ch-ua-platform - "Windows" - - - Upgrade-Insecure-Requests - 1 - - - Origin - https://${SITEMINDER_URL} - - - Content-Type - application/x-www-form-urlencoded - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Accept - text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 - - - Sec-Fetch-Site - same-origin - - - Sec-Fetch-Mode - navigate - - - Sec-Fetch-Dest - document - - - Referer - https://${SITEMINDER_URL}/clp-cgi/preLogon.cgi - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - Cookie - _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; Dummy1=DummyVal1; BCGOVFlags=0101%3A0%2C7; BCGOVCustom=NULL; BCGOVBrand=NULL; BCGOVBehavior=NULL; Dummy2=DummyVal2; preDummy1=DummyVal1; preDummy2=DummyVal2; preDummy3=DummyVal3; BCGOVDoNotShow=1; preDummy4=DummyVal4; FAILREASON=0; SMSESSION=LOGGEDOFF; SMFED_OLD_SESSION=""; SMFED_OLD_IDENTITY=""; GUID=1:26feb557-62af2c8c-4ef3a8d7-2e2277be-6a76895c-697; BCGOVTarget=HTTPS%3A%2F%2Fsfstest7.gov.bc.ca%2Faffwebservices%2Fredirectjsp%2Ftestkeycloak-basicbusinessbceid%2Fredirect.jsp%3FSMPORTALURL%3Dhttps%253A%252F%252Fsfstest7.gov.bc.ca%252Faffwebservices%252Fpublic%252Fsaml2sso%26SAMLTRANSACTIONID%3Dc9f189ad-7324de1b-2e045e1a-e8bcf162-a78af00c-c5; BCGOVclptryno=1; clp001=Salted__%8E%F5%14%93%F3.%C8%8C%C2%B3%84%8B%8EC%E0%88%AAK%01%C77%B6%C4g%C3%D2%3ELS%06%7CdJp%18%E9TJ%8A%D3a%A9%AD%3C%5E%DBZ%D7 - - - - - - - - - - false - - = - true - - - - - - - - https://${SITEMINDER_URL}/clp-cgi/cap07/private/postLogon.cgi - GET - true - false - true - false - - - - - - - - - Host - ${SITEMINDER_URL} - - - Connection - keep-alive - - - Cache-Control - max-age=0 - - - Upgrade-Insecure-Requests - 1 - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Accept - text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 - - - Sec-Fetch-Site - same-origin - - - Sec-Fetch-Mode - navigate - - - Sec-Fetch-Dest - document - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - sec-ch-ua-mobile - ?0 - - - sec-ch-ua-platform - "Windows" - - - Referer - https://${SITEMINDER_URL}/clp-cgi/preLogon.cgi - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - Cookie - _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; Dummy1=DummyVal1; BCGOVFlags=0101%3A0%2C7; BCGOVCustom=NULL; BCGOVBrand=NULL; BCGOVBehavior=NULL; Dummy2=DummyVal2; preDummy1=DummyVal1; preDummy2=DummyVal2; preDummy3=DummyVal3; BCGOVDoNotShow=1; preDummy4=DummyVal4; FAILREASON=0; SMSESSION=LOGGEDOFF; SMFED_OLD_SESSION=""; SMFED_OLD_IDENTITY=""; GUID=1:26feb557-62af2c8c-4ef3a8d7-2e2277be-6a76895c-697; BCGOVTarget=HTTPS%3A%2F%2Fsfstest7.gov.bc.ca%2Faffwebservices%2Fredirectjsp%2Ftestkeycloak-basicbusinessbceid%2Fredirect.jsp%3FSMPORTALURL%3Dhttps%253A%252F%252Fsfstest7.gov.bc.ca%252Faffwebservices%252Fpublic%252Fsaml2sso%26SAMLTRANSACTIONID%3Dc9f189ad-7324de1b-2e045e1a-e8bcf162-a78af00c-c5; BCGOVclptryno=1; clp001=Salted__%8E%F5%14%93%F3.%C8%8C%C2%B3%84%8B%8EC%E0%88%AAK%01%C77%B6%C4g%C3%D2%3ELS%06%7CdJp%18%E9TJ%8A%D3a%A9%AD%3C%5E%DBZ%D7; FORMCRED=2ZS4S2F4tb41FWGyAD293ZV3eiMsCRYZ+ktOitYzjWY/fG/2BFtCWHSnbkvgJfBEm8aTuwAg3nMfeG0h8ahL0C1Q+SZp1d30x/imUNpQkjqP7yK+smpXGQMNWzNb15A+UXcYa0yUQLQ5rFoH720FIoiqZ4Nmikk7a67vktQxd8rpIduHeZJ7tAYb/b+pXPha - - - - - - - true - - - - false - RelayState=pkQKGHDSoVdRPpUZ1XHJWrVAUBtEl2EOcIu2bUhv0V0.k5Vw5BDlfVQ.standard-realm&SAMLResponse=PG5zNTpSZXNwb25zZSB4bWxuczpuczU9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpwcm90b2NvbCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDkveG1sZW5jMTEjIiB4bWxuczpuczI9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphc3NlcnRpb24iIHhtbG5zOm5zMz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyIgeG1sbnM6bnM0PSJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzA0L3htbGVuYyMiIERlc3RpbmF0aW9uPSJodHRwczovL3Rlc3QubG9naW5wcm94eS5nb3YuYmMuY2EvYXV0aC9yZWFsbXMvYmNlaWRib3RoL2Jyb2tlci9iY2VpZGJvdGgvZW5kcG9pbnQiIElEPSJfMzU0NWZlNjJmOGY3OThhNTk1ZWNlM2I2YzYxM2RmNmU5ZWFkIiBJblJlc3BvbnNlVG89IklEX2FhYTM1M2Q0LTdlNmMtNDQxNS05N2FkLWI2NmEzM2FhOTBkYyIgSXNzdWVJbnN0YW50PSIyMDIzLTEwLTMwVDE5OjU2OjM3LjE4MFoiIFZlcnNpb249IjIuMCI%2BDQogICAgPG5zMjpJc3N1ZXIgRm9ybWF0PSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6bmFtZWlkLWZvcm1hdDplbnRpdHkiPmh0dHBzOi8vdGVzdC5sb2dpbnByb3h5Lmdvdi5iYy5jYS9hdXRoL3JlYWxtcy9fYmNlaWRiYXNpY2J1c2luZXNzMS88L25zMjpJc3N1ZXI%2BDQogICAgPG5zNTpTdGF0dXM%2BDQogICAgICAgIDxuczU6U3RhdHVzQ29kZSBWYWx1ZT0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOnN0YXR1czpTdWNjZXNzIi8%2BDQogICAgPC9uczU6U3RhdHVzPg0KICAgIDxuczI6QXNzZXJ0aW9uIElEPSJfZWFmZTRjYWQ5MjU0MTEyZjQ5YTcxMDI1MGM3YjVhNDVjYmI2IiBJc3N1ZUluc3RhbnQ9IjIwMjMtMTAtMzBUMTk6NTY6MzcuMTgwWiIgVmVyc2lvbj0iMi4wIiB4bWxuczpuczI9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphc3NlcnRpb24iPg0KICAgICAgICA8bnMyOklzc3VlciBGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpuYW1laWQtZm9ybWF0OmVudGl0eSI%2BaHR0cHM6Ly90ZXN0LmxvZ2lucHJveHkuZ292LmJjLmNhL2F1dGgvcmVhbG1zL19iY2VpZGJhc2ljYnVzaW5lc3MxLzwvbnMyOklzc3Vlcj48ZHM6U2lnbmF0dXJlIHhtbG5zOmRzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIj48ZHM6U2lnbmVkSW5mbz48ZHM6Q2Fub25pY2FsaXphdGlvbk1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvMTAveG1sLWV4Yy1jMTRuIyIvPjxkczpTaWduYXR1cmVNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzA0L3htbGRzaWctbW9yZSNyc2Etc2hhMjU2Ii8%2BPGRzOlJlZmVyZW5jZSBVUkk9IiNfZWFmZTRjYWQ5MjU0MTEyZjQ5YTcxMDI1MGM3YjVhNDVjYmI2Ij48ZHM6VHJhbnNmb3Jtcz48ZHM6VHJhbnNmb3JtIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI2VudmVsb3BlZC1zaWduYXR1cmUiLz48ZHM6VHJhbnNmb3JtIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS8xMC94bWwtZXhjLWMxNG4jIi8%2BPC9kczpUcmFuc2Zvcm1zPjxkczpEaWdlc3RNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzA0L3htbGVuYyNzaGEyNTYiLz48ZHM6RGlnZXN0VmFsdWU%2BS0c3SWRyMko3ODNGVGFkNkVZM0hHUklyRFpnUXU1TmdOQ1JBRU1vcERkYz08L2RzOkRpZ2VzdFZhbHVlPjwvZHM6UmVmZXJlbmNlPjwvZHM6U2lnbmVkSW5mbz48ZHM6U2lnbmF0dXJlVmFsdWU%2BbHJlNnpwalpyUEpKZmVqYStkUHN3cUhlVDN6a3VkNjA4emppZE4vWlBRMjdmSW56aHFWQ2lreDhHcld4V29jSWM4ekhHb1cxZmJqTXlBSkIwNnRHS2pXdzBXMWExTlIyL2VlVGQ1MFY1RnF4NndIb001NFVmYUkvY0N6dDdsMUNUQ2lHZzB6UkVLZjRDK3RxcWJaQ3QyRlFCQ20vd0xaNHRrdXVsZUh4WTZqdGJxWXBlbmpvSzQ2TGlocE1CejIvczBDRmQ3c1BxVjF4bHJpWXVtd1dtSlV1b0o1d0M1L2ZMZ3djTUlmSVMwd29SZmQzclBTN1pBWk5vWXExVVpWQ2xmemZMZ1hNc3JsM2k2S0F3SS80N01pSVpzeGNaaFd1Q3dMTFdFSXdzRWQzWlNLZFhXUTF1U0RrSGlIUGIrcXFmSTJQRGJwK2l1bHFDdlo2S3BCVzdnPT08L2RzOlNpZ25hdHVyZVZhbHVlPjxkczpLZXlJbmZvIHhtbG5zOmRzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIj48ZHM6WDUwOURhdGE%2BPGRzOlg1MDlDZXJ0aWZpY2F0ZT5NSUlFQ3pDQ0F2TUNDUUNkb1dONFh0VUk2VEFOQmdrcWhraUc5dzBCQVFzRkFEQ0J5akVMTUFrR0ExVUVCaE1DUTBFeEdUQVhCZ05WQkFnVEVFSnlhWFJwYzJnZ1EyOXNkVzFpYVdFeEVUQVBCZ05WQkFjVENGWnBZM1J2Y21saE1UY3dOUVlEVlFRS0V5NUhiM1psY201dFpXNTBJRzltSUhSb1pTQlFjbTkyYVc1alpTQnZaaUJDY21sMGFYTm9JRU52YkhWdFltbGhNUTh3RFFZRFZRUUxFd1pUUmxNdFEwRXhJakFnQmdOVkJBTVRHVk5HVXlCRFpYSjBhV1pwWTJGMFpTQkJkWFJvYjNKcGRIa3hIekFkQmdrcWhraUc5dzBCQ1FFV0VGZFVVMWRCVFVCbmIzWXVZbU11WTJFd0hoY05NVE13TkRBMU1qSTFOalUzV2hjTk16TXdOREExTWpJMU5qVTNXakNCd3pFTE1Ba0dBMVVFQmhNQ1EwRXhHVEFYQmdOVkJBZ1RFRUp5YVhScGMyZ2dRMjlzZFcxaWFXRXhFVEFQQmdOVkJBY1RDRlpwWTNSdmNtbGhNVGN3TlFZRFZRUUtFeTVIYjNabGNtNXRaVzUwSUc5bUlIUm9aU0JRY205MmFXNWpaU0J2WmlCQ2NtbDBhWE5vSUVOdmJIVnRZbWxoTVF3d0NnWURWUVFMRXdOVFJsTXhIakFjQmdOVkJBTVRGWE5tY3kxelpuTjBaWE4wTG1kdmRpNWlZeTVqWVRFZk1CMEdDU3FHU0liM0RRRUpBUllRVjFSVFYwRk5RR2R2ZGk1aVl5NWpZVENDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFKdzVFMDQ1amxKK3NiU2dOZmt2eUpBMysyN0tSQm1BbHErTVVSb1IzT1NpV2MyME1XZHQ1cEt4ZFJVcTJmWXhyUWp0cnRQdUdxa2tFR2FlSTBpTlp3UkluYnk2SHU2dWJDd2YxUTdmVGxXNzhscytDak5rWU5VQzMvd3VDM21uMVFuZzhVMGxkUTd0UVU0Y1BPcXdMSXZTaUpkaUpacm1GOFJEcHBvZFljSGhiaWo3N3Q2dGlIVkN4UVlncXhOY3V0M2d3bnhWcjI0MTZ5V0hYVnFxcGNjS0xUaUkvSm9lQ2I1b0kyVVVDcmRldnlXZDRINXFOWmx5NGhMNVBCQ1lZNFR1cFVheWpoYldmeEpLNFVXY0R2N09PYSt1eHE0a1luR2V4RHBxQ2JXNmJ2Y0hiazQ3UDVSQVpJdmd2bkdvQmdTZm9oMzd6eFEvRnA2VkU0aVdBdWNDQXdFQUFUQU5CZ2txaGtpRzl3MEJBUXNGQUFPQ0FRRUFiZGtqUTl1SHB2ZGtTZUlHT25meHU0Vm5mM2pHTzR5bzgrQnJub0dhTEM4aTJDV21Wb2RpOUdPdTNIM2pyR3ZzU296N242QzJBK3ZJdkR4dkE3dHdqd0xBcXVaVlFKbkJDcE1LbXdsUENBQ0F3WitFbGI0cjJxTW14YTJGbTBJZVl6M3gyQldZT0FUdGljODFmRnpoSjhRa1dCdXdiOStkSiswbC9HR1FmOXBPMnFpSXFVRWQyb0lVVkR4cVdSWXpoUGV6ZWpwZlZqQnNUUFhZNXhRaGRCVUtITXIwWnBTVTlrTW9KemNNMW42bEpIN3BGSFpCVUtONzkyaG9FNTVPbEszTFFMVW9oKzNXNEROL1lWS2tEczZrSHI0b0w2dXo5ajJXODRIVVBYNURMbUZGaUorTHBTMDUyVkJ0WWNoangyQnQwRlBzSEpKNEMwRjByNUc0b3c9PTwvZHM6WDUwOUNlcnRpZmljYXRlPjwvZHM6WDUwOURhdGE%2BPC9kczpLZXlJbmZvPjwvZHM6U2lnbmF0dXJlPg0KICAgICAgICA8bnMyOlN1YmplY3Q%2BDQogICAgICAgICAgICA8bnMyOk5hbWVJRCBGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpuYW1laWQtZm9ybWF0OnBlcnNpc3RlbnQiPkE5RUQyQzU3NDJEQzQ1NTk5ODY3MkNDMkExMTgxNzRCPC9uczI6TmFtZUlEPg0KICAgICAgICAgICAgPG5zMjpTdWJqZWN0Q29uZmlybWF0aW9uIE1ldGhvZD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmNtOmJlYXJlciI%2BDQogICAgICAgICAgICAgICAgPG5zMjpTdWJqZWN0Q29uZmlybWF0aW9uRGF0YSBJblJlc3BvbnNlVG89IklEX2FhYTM1M2Q0LTdlNmMtNDQxNS05N2FkLWI2NmEzM2FhOTBkYyIgTm90T25PckFmdGVyPSIyMDIzLTEwLTMwVDE5OjU4OjA3LjE0OFoiIFJlY2lwaWVudD0iaHR0cHM6Ly90ZXN0LmxvZ2lucHJveHkuZ292LmJjLmNhL2F1dGgvcmVhbG1zL2JjZWlkYm90aC9icm9rZXIvYmNlaWRib3RoL2VuZHBvaW50Ii8%2BDQogICAgICAgICAgICA8L25zMjpTdWJqZWN0Q29uZmlybWF0aW9uPg0KICAgICAgICA8L25zMjpTdWJqZWN0Pg0KICAgICAgICA8bnMyOkNvbmRpdGlvbnMgTm90QmVmb3JlPSIyMDIzLTEwLTMwVDE5OjU2OjA3LjE0OFoiIE5vdE9uT3JBZnRlcj0iMjAyMy0xMC0zMFQxOTo1ODowNy4xNDhaIj4NCiAgICAgICAgICAgIDxuczI6QXVkaWVuY2VSZXN0cmljdGlvbj4NCiAgICAgICAgICAgICAgICA8bnMyOkF1ZGllbmNlPmh0dHBzOi8vdGVzdC5sb2dpbnByb3h5Lmdvdi5iYy5jYS9hdXRoL3JlYWxtcy9fYmNlaWRiYXNpY2J1c2luZXNzMS88L25zMjpBdWRpZW5jZT4NCiAgICAgICAgICAgIDwvbnMyOkF1ZGllbmNlUmVzdHJpY3Rpb24%2BDQogICAgICAgIDwvbnMyOkNvbmRpdGlvbnM%2BDQogICAgICAgIDxuczI6QXV0aG5TdGF0ZW1lbnQgQXV0aG5JbnN0YW50PSIyMDIzLTEwLTMwVDE5OjU2OjM1LjEzMloiIFNlc3Npb25JbmRleD0ibGdlQ1pvN01aRnpJaFFiU1dGcXg1SDJiK1U0PXlMMWRQUT09IiBTZXNzaW9uTm90T25PckFmdGVyPSIyMDIzLTEwLTMwVDE5OjU4OjA3LjEzMloiPg0KICAgICAgICAgICAgPG5zMjpBdXRobkNvbnRleHQ%2BDQogICAgICAgICAgICAgICAgPG5zMjpBdXRobkNvbnRleHRDbGFzc1JlZj51cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6YWM6Y2xhc3NlczpQYXNzd29yZDwvbnMyOkF1dGhuQ29udGV4dENsYXNzUmVmPg0KICAgICAgICAgICAgPC9uczI6QXV0aG5Db250ZXh0Pg0KICAgICAgICA8L25zMjpBdXRoblN0YXRlbWVudD4NCiAgICAgICAgPG5zMjpBdHRyaWJ1dGVTdGF0ZW1lbnQ%2BDQogICAgICAgICAgICA8bnMyOkF0dHJpYnV0ZSBOYW1lPSJiY2VpZF91c2VybmFtZSIgTmFtZUZvcm1hdD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmF0dHJuYW1lLWZvcm1hdDp1bnNwZWNpZmllZCI%2BDQogICAgICAgICAgICAgICAgPG5zMjpBdHRyaWJ1dGVWYWx1ZSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTp0eXBlPSJ4czpzdHJpbmciPk9SQkNUU1QzPC9uczI6QXR0cmlidXRlVmFsdWU%2BDQogICAgICAgICAgICA8L25zMjpBdHRyaWJ1dGU%2BDQogICAgICAgICAgICA8bnMyOkF0dHJpYnV0ZSBOYW1lPSJkaXNwbGF5X25hbWUiIE5hbWVGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphdHRybmFtZS1mb3JtYXQ6dW5zcGVjaWZpZWQiPg0KICAgICAgICAgICAgICAgIDxuczI6QXR0cmlidXRlVmFsdWUgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6dHlwZT0ieHM6c3RyaW5nIj5CcnlhbiBMYW5lPC9uczI6QXR0cmlidXRlVmFsdWU%2BDQogICAgICAgICAgICA8L25zMjpBdHRyaWJ1dGU%2BDQogICAgICAgICAgICA8bnMyOkF0dHJpYnV0ZSBOYW1lPSJiY2VpZF91c2VyX2d1aWQiIE5hbWVGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphdHRybmFtZS1mb3JtYXQ6dW5zcGVjaWZpZWQiPg0KICAgICAgICAgICAgICAgIDxuczI6QXR0cmlidXRlVmFsdWUgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6dHlwZT0ieHM6c3RyaW5nIj5BOUVEMkM1NzQyREM0NTU5OTg2NzJDQzJBMTE4MTc0QjwvbnMyOkF0dHJpYnV0ZVZhbHVlPg0KICAgICAgICAgICAgPC9uczI6QXR0cmlidXRlPg0KICAgICAgICAgICAgPG5zMjpBdHRyaWJ1dGUgTmFtZT0iZW1haWwiIE5hbWVGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphdHRybmFtZS1mb3JtYXQ6dW5zcGVjaWZpZWQiPg0KICAgICAgICAgICAgICAgIDxuczI6QXR0cmlidXRlVmFsdWUgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6dHlwZT0ieHM6c3RyaW5nIj5icnlhbi5sYW5lQGdvdi5iYy5jYTwvbnMyOkF0dHJpYnV0ZVZhbHVlPg0KICAgICAgICAgICAgPC9uczI6QXR0cmlidXRlPg0KICAgICAgICA8bnMyOkF0dHJpYnV0ZSBOYW1lPSJTTUdPVl9CVVNJTkVTU0dVSUQiIE5hbWVGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphdHRybmFtZS1mb3JtYXQ6dW5zcGVjaWZpZWQiPjxuczI6QXR0cmlidXRlVmFsdWU%2BRjQwMjNEQjNDMzBGNDg3QjlBRjVCMTRDOTU4OTg5Rjg8L25zMjpBdHRyaWJ1dGVWYWx1ZT48L25zMjpBdHRyaWJ1dGU%2BPG5zMjpBdHRyaWJ1dGUgTmFtZT0iU01HT1ZfQlVTSU5FU1NMRUdBTE5BTUUiIE5hbWVGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphdHRybmFtZS1mb3JtYXQ6dW5zcGVjaWZpZWQiPjxuczI6QXR0cmlidXRlVmFsdWU%2BU29uaWMgRGVsaXZlcnkgU2VydmljZXM8L25zMjpBdHRyaWJ1dGVWYWx1ZT48L25zMjpBdHRyaWJ1dGU%2BPC9uczI6QXR0cmlidXRlU3RhdGVtZW50Pg0KICAgIDwvbnMyOkFzc2VydGlvbj4NCjwvbnM1OlJlc3BvbnNlPg%3D%3D - = - - - - - - - - https://${KEYCLOAK_LOGIN_URL}/auth/realms/bceidboth/broker/bceidboth/endpoint - POST - true - false - true - false - - - - - - - - - Host - ${KEYCLOAK_LOGIN_URL} - - - Connection - keep-alive - - - Content-Length - 9217 - - - Cache-Control - max-age=0 - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - sec-ch-ua-mobile - ?0 - - - sec-ch-ua-platform - "Windows" - - - Upgrade-Insecure-Requests - 1 - - - Origin - https://sfstest7.gov.bc.ca - - - Content-Type - application/x-www-form-urlencoded - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Accept - text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - navigate - - - Sec-Fetch-Dest - document - - - Referer - https://sfstest7.gov.bc.ca/ - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - Cookie - AUTH_SESSION_ID=f26f78a0-28d2-40b4-9e57-b83fa590e32e.ycloak-78b4c74bcf-vtmwp; AUTH_SESSION_ID_LEGACY=f26f78a0-28d2-40b4-9e57-b83fa590e32e.ycloak-78b4c74bcf-vtmwp; KC_RESTART=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI1ZjExNjBiNS03Y2RjLTQ5NGQtYmFkOS0yZGRkNjU3MDU5Y2UifQ.eyJjaWQiOiJzdGFuZGFyZC1yZWFsbSIsInB0eSI6Im9wZW5pZC1jb25uZWN0IiwicnVyaSI6Imh0dHBzOi8vdGVzdC5sb2dpbnByb3h5Lmdvdi5iYy5jYS9hdXRoL3JlYWxtcy9zdGFuZGFyZC9icm9rZXIvYmNlaWRib3RoL2VuZHBvaW50IiwiYWN0IjoiQVVUSEVOVElDQVRFIiwibm90ZXMiOnsic2NvcGUiOiJvcGVuaWQiLCJpc3MiOiJodHRwczovL3Rlc3QubG9naW5wcm94eS5nb3YuYmMuY2EvYXV0aC9yZWFsbXMvYmNlaWRib3RoIiwicmVzcG9uc2VfdHlwZSI6ImNvZGUiLCJyZWRpcmVjdF91cmkiOiJodHRwczovL3Rlc3QubG9naW5wcm94eS5nb3YuYmMuY2EvYXV0aC9yZWFsbXMvc3RhbmRhcmQvYnJva2VyL2JjZWlkYm90aC9lbmRwb2ludCIsInN0YXRlIjoiSnZJeWZtb2owQXptQlpXdzBaUzhsQm1oTUpYZDdsQV91QVI4SlF2TE5sRS5LQXhZWGpvYXRHYy5vbi1yb3V0ZS1iYy1kaXJlY3QtNDU5OCIsIm5vbmNlIjoiMXNLV21kWjBhVjZRSXNjYjY1THJtZyJ9fQ.08S_Qi57kTkuLj_eH5VElw2zeuH4AVhfOUois5IUzEI; _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; FAILREASON=0; SMSESSION=Awk9KIrMNenX09Vl2cEMuy/VxV9CFVP4fsBzCp8Zo3AX2VsrDVWkOMVOdJyoY1Q1J9F8Vs8XFBtHTU29qS7+jlhEMK3f9j8tgudEVWHJq8LTizGhEj1cf8r7CX2QuxWMbdAHvK90hFnpocsL5xv2cAaFVdqhBKlIYkzwkY+r0YuH3Uh6DJVIhAhwjWeKfO6BAg5/jNFxQ31EPvzn4N7RxJK2bGyfAxzi6Cs6O7ieJ10MzcB8nWSIsO4ksfG8pzeGp9a+arl4maKnd9Je2L2FQohmiOjfGcrsezOgLgiWFl1B3+EL8ytArvtKhsFvr7WJsQuhYsQYzfY8shcfhNSltyqxLD422bDmU3NyZdhWY9313YG5I1U2vbO7zvXhxaCJYnpMrJR+inz8XsyqnGY1xu7AepY3pNd2wJH3twQJ42N6R2WlJVVN3oc3DvEHUbk85xrqHdwngd/FiMdEC2f5Kt51VYp8G/3R+sbFiy6Wt7wlZw2+/wI8EfxXs31HQ5q/RDUTXz6JMbzsR7EUOF+WkOrgi1nDugu13/O9hDnxPJnkzNGEfjt0xPxdhoDdl4vWdwRe1awBEn90SyJwc8+cFk1XACtvWoGwtPdf1xnHUwx5Ge1TqEd46xdjjlu+iTw2Xu5AsESUVVw81STsKA7vC8EBabQ+yXQHZlNFcFCKa1+AutNxfWHNQtnFK03kUCai4ZPJc/TQrhvf9DWjSyX+KknWdV6aQyz65KOpwtQWpd4ZlqAAKvf9vCQIBgk+YdsxFzAq6ySnLPcBLbFvP+Xyo5bcABg8IS9aJr6+05KT3ZOv49G1uYvz1ILaDED83D5NHF57ZswKR2911SevaqIO2i8NkZAJUMBpgroSejoJ1MxzpL/a7I26u6+p/08uMt/dT7vuo5OTTjayEtIlXy1IRXA/jU/uX/pKk1JrsZFhhwj7G5KEQpMAx+YvZUaaidqyfj3+fLb6+rsa8BukV8x0zfgUg20dm+Wu9XjDvyQHFP4Qt65CaUbhAKcVTgCChgTfSSdUJZIPPa5Yhzr7SmTuVGmYV/1cC4jGzNdSqr3Fq28fWukiEnRtqfZRXlOdA6xb - - - - - - - - - - false - - = - true - - - - - - - - https://${KEYCLOAK_LOGIN_URL}/auth/realms/standard/broker/bceidboth/endpoint?state=JvIyfmoj0AzmBZWw0ZS8lBmhMJXd7lA_uAR8JQvLNlE.KAxYXjoatGc.on-route-bc-direct-4598&session_state=f26f78a0-28d2-40b4-9e57-b83fa590e32e&code=c5719177-78e8-4d75-857a-0ef191c765d1.f26f78a0-28d2-40b4-9e57-b83fa590e32e.1123d85b-badf-4084-a3a6-b1c920ccb0c0 - GET - true - false - true - false - - - - - - - - - Host - ${KEYCLOAK_LOGIN_URL} - - - Connection - keep-alive - - - Cache-Control - max-age=0 - - - Upgrade-Insecure-Requests - 1 - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Accept - text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - navigate - - - Sec-Fetch-Dest - document - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - sec-ch-ua-mobile - ?0 - - - sec-ch-ua-platform - "Windows" - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - Cookie - AUTH_SESSION_ID=0e56ff7b-e277-400f-84f5-25801c43c829.ycloak-78b4c74bcf-kh476; AUTH_SESSION_ID_LEGACY=0e56ff7b-e277-400f-84f5-25801c43c829.ycloak-78b4c74bcf-kh476; KC_RESTART=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICIzMmI0MzNkNC02NjgwLTQxODMtOTc2Yy1kZDdjMTg0YjExMTQifQ.eyJjaWQiOiJvbi1yb3V0ZS1iYy1kaXJlY3QtNDU5OCIsInB0eSI6Im9wZW5pZC1jb25uZWN0IiwicnVyaSI6Imh0dHBzOi8vb25yb3V0ZWJjLXRlc3QtZnJvbnRlbmQuYXBwcy5zaWx2ZXIuZGV2b3BzLmdvdi5iYy5jYS8iLCJhY3QiOiJBVVRIRU5USUNBVEUiLCJub3RlcyI6eyJzY29wZSI6Im9wZW5pZCIsImlzcyI6Imh0dHBzOi8vdGVzdC5sb2dpbnByb3h5Lmdvdi5iYy5jYS9hdXRoL3JlYWxtcy9zdGFuZGFyZCIsInJlc3BvbnNlX3R5cGUiOiJjb2RlIiwiY29kZV9jaGFsbGVuZ2VfbWV0aG9kIjoiUzI1NiIsInJlZGlyZWN0X3VyaSI6Imh0dHBzOi8vb25yb3V0ZWJjLXRlc3QtZnJvbnRlbmQuYXBwcy5zaWx2ZXIuZGV2b3BzLmdvdi5iYy5jYS8iLCJzdGF0ZSI6IjdiZTBmNDk4ZGRmYTQ1ZTI4ZWU4ZjI0MTY0NzViYTQyIiwiY29kZV9jaGFsbGVuZ2UiOiJCNEpzelBjUzBIT1c3RUNUVFVVUkMxbXA2ejhhdDJiNkswbEQxdUtfMTFBIiwia2NfaWRwX2hpbnQiOiJiY2VpZGJvdGgiLCJyZXNwb25zZV9tb2RlIjoicXVlcnkifX0.2dLZTTjk8ZY0EFAaE88sAWQlfo7T17XcYLztnQwI_Yk; _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; FAILREASON=0; SMSESSION=Awk9KIrMNenX09Vl2cEMuy/VxV9CFVP4fsBzCp8Zo3AX2VsrDVWkOMVOdJyoY1Q1J9F8Vs8XFBtHTU29qS7+jlhEMK3f9j8tgudEVWHJq8LTizGhEj1cf8r7CX2QuxWMbdAHvK90hFnpocsL5xv2cAaFVdqhBKlIYkzwkY+r0YuH3Uh6DJVIhAhwjWeKfO6BAg5/jNFxQ31EPvzn4N7RxJK2bGyfAxzi6Cs6O7ieJ10MzcB8nWSIsO4ksfG8pzeGp9a+arl4maKnd9Je2L2FQohmiOjfGcrsezOgLgiWFl1B3+EL8ytArvtKhsFvr7WJsQuhYsQYzfY8shcfhNSltyqxLD422bDmU3NyZdhWY9313YG5I1U2vbO7zvXhxaCJYnpMrJR+inz8XsyqnGY1xu7AepY3pNd2wJH3twQJ42N6R2WlJVVN3oc3DvEHUbk85xrqHdwngd/FiMdEC2f5Kt51VYp8G/3R+sbFiy6Wt7wlZw2+/wI8EfxXs31HQ5q/RDUTXz6JMbzsR7EUOF+WkOrgi1nDugu13/O9hDnxPJnkzNGEfjt0xPxdhoDdl4vWdwRe1awBEn90SyJwc8+cFk1XACtvWoGwtPdf1xnHUwx5Ge1TqEd46xdjjlu+iTw2Xu5AsESUVVw81STsKA7vC8EBabQ+yXQHZlNFcFCKa1+AutNxfWHNQtnFK03kUCai4ZPJc/TQrhvf9DWjSyX+KknWdV6aQyz65KOpwtQWpd4ZlqAAKvf9vCQIBgk+YdsxFzAq6ySnLPcBLbFvP+Xyo5bcABg8IS9aJr6+05KT3ZOv49G1uYvz1ILaDED83D5NHF57ZswKR2911SevaqIO2i8NkZAJUMBpgroSejoJ1MxzpL/a7I26u6+p/08uMt/dT7vuo5OTTjayEtIlXy1IRXA/jU/uX/pKk1JrsZFhhwj7G5KEQpMAx+YvZUaaidqyfj3+fLb6+rsa8BukV8x0zfgUg20dm+Wu9XjDvyQHFP4Qt65CaUbhAKcVTgCChgTfSSdUJZIPPa5Yhzr7SmTuVGmYV/1cC4jGzNdSqr3Fq28fWukiEnRtqfZRXlOdA6xb - - - - - - - - - - false - - = - true - - - - - - - - https://${KEYCLOAK_LOGIN_URL}/auth/realms/standard/login-actions/post-broker-login?client_id=on-route-bc-direct-4598&tab_id=KAxYXjoatGc - GET - true - false - true - false - - - - - - - - - Host - ${KEYCLOAK_LOGIN_URL} - - - Connection - keep-alive - - - Cache-Control - max-age=0 - - - Upgrade-Insecure-Requests - 1 - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Accept - text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - navigate - - - Sec-Fetch-Dest - document - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - sec-ch-ua-mobile - ?0 - - - sec-ch-ua-platform - "Windows" - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - Cookie - AUTH_SESSION_ID=0e56ff7b-e277-400f-84f5-25801c43c829.ycloak-78b4c74bcf-kh476; AUTH_SESSION_ID_LEGACY=0e56ff7b-e277-400f-84f5-25801c43c829.ycloak-78b4c74bcf-kh476; KC_RESTART=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICIzMmI0MzNkNC02NjgwLTQxODMtOTc2Yy1kZDdjMTg0YjExMTQifQ.eyJjaWQiOiJvbi1yb3V0ZS1iYy1kaXJlY3QtNDU5OCIsInB0eSI6Im9wZW5pZC1jb25uZWN0IiwicnVyaSI6Imh0dHBzOi8vb25yb3V0ZWJjLXRlc3QtZnJvbnRlbmQuYXBwcy5zaWx2ZXIuZGV2b3BzLmdvdi5iYy5jYS8iLCJhY3QiOiJBVVRIRU5USUNBVEUiLCJub3RlcyI6eyJzY29wZSI6Im9wZW5pZCIsImlzcyI6Imh0dHBzOi8vdGVzdC5sb2dpbnByb3h5Lmdvdi5iYy5jYS9hdXRoL3JlYWxtcy9zdGFuZGFyZCIsInJlc3BvbnNlX3R5cGUiOiJjb2RlIiwiY29kZV9jaGFsbGVuZ2VfbWV0aG9kIjoiUzI1NiIsInJlZGlyZWN0X3VyaSI6Imh0dHBzOi8vb25yb3V0ZWJjLXRlc3QtZnJvbnRlbmQuYXBwcy5zaWx2ZXIuZGV2b3BzLmdvdi5iYy5jYS8iLCJzdGF0ZSI6IjdiZTBmNDk4ZGRmYTQ1ZTI4ZWU4ZjI0MTY0NzViYTQyIiwiY29kZV9jaGFsbGVuZ2UiOiJCNEpzelBjUzBIT1c3RUNUVFVVUkMxbXA2ejhhdDJiNkswbEQxdUtfMTFBIiwia2NfaWRwX2hpbnQiOiJiY2VpZGJvdGgiLCJyZXNwb25zZV9tb2RlIjoicXVlcnkifX0.2dLZTTjk8ZY0EFAaE88sAWQlfo7T17XcYLztnQwI_Yk; _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; FAILREASON=0; SMSESSION=Awk9KIrMNenX09Vl2cEMuy/VxV9CFVP4fsBzCp8Zo3AX2VsrDVWkOMVOdJyoY1Q1J9F8Vs8XFBtHTU29qS7+jlhEMK3f9j8tgudEVWHJq8LTizGhEj1cf8r7CX2QuxWMbdAHvK90hFnpocsL5xv2cAaFVdqhBKlIYkzwkY+r0YuH3Uh6DJVIhAhwjWeKfO6BAg5/jNFxQ31EPvzn4N7RxJK2bGyfAxzi6Cs6O7ieJ10MzcB8nWSIsO4ksfG8pzeGp9a+arl4maKnd9Je2L2FQohmiOjfGcrsezOgLgiWFl1B3+EL8ytArvtKhsFvr7WJsQuhYsQYzfY8shcfhNSltyqxLD422bDmU3NyZdhWY9313YG5I1U2vbO7zvXhxaCJYnpMrJR+inz8XsyqnGY1xu7AepY3pNd2wJH3twQJ42N6R2WlJVVN3oc3DvEHUbk85xrqHdwngd/FiMdEC2f5Kt51VYp8G/3R+sbFiy6Wt7wlZw2+/wI8EfxXs31HQ5q/RDUTXz6JMbzsR7EUOF+WkOrgi1nDugu13/O9hDnxPJnkzNGEfjt0xPxdhoDdl4vWdwRe1awBEn90SyJwc8+cFk1XACtvWoGwtPdf1xnHUwx5Ge1TqEd46xdjjlu+iTw2Xu5AsESUVVw81STsKA7vC8EBabQ+yXQHZlNFcFCKa1+AutNxfWHNQtnFK03kUCai4ZPJc/TQrhvf9DWjSyX+KknWdV6aQyz65KOpwtQWpd4ZlqAAKvf9vCQIBgk+YdsxFzAq6ySnLPcBLbFvP+Xyo5bcABg8IS9aJr6+05KT3ZOv49G1uYvz1ILaDED83D5NHF57ZswKR2911SevaqIO2i8NkZAJUMBpgroSejoJ1MxzpL/a7I26u6+p/08uMt/dT7vuo5OTTjayEtIlXy1IRXA/jU/uX/pKk1JrsZFhhwj7G5KEQpMAx+YvZUaaidqyfj3+fLb6+rsa8BukV8x0zfgUg20dm+Wu9XjDvyQHFP4Qt65CaUbhAKcVTgCChgTfSSdUJZIPPa5Yhzr7SmTuVGmYV/1cC4jGzNdSqr3Fq28fWukiEnRtqfZRXlOdA6xb - - - - - - - - - - false - - = - true - - - - - - - - https://${FRONTEND_API_URL}/?state=7be0f498ddfa45e28ee8f2416475ba42&session_state=0e56ff7b-e277-400f-84f5-25801c43c829&code=e1db6532-ce36-4aa5-845c-26c6d9f6e19f.0e56ff7b-e277-400f-84f5-25801c43c829.f462b30d-0893-4a2d-8169-3461d82c36eb - GET - true - false - true - false - - - - - - - - - Host - ${FRONTEND_API_URL} - - - Connection - keep-alive - - - Cache-Control - max-age=0 - - - Upgrade-Insecure-Requests - 1 - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Accept - text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - navigate - - - Sec-Fetch-Dest - document - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - sec-ch-ua-mobile - ?0 - - - sec-ch-ua-platform - "Windows" - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - Cookie - _ga=GA1.1.1172861733.1658852507; PS_DEVICEFEATURES=maf:0 width:1536 height:864 clientWidth:1536 clientHeight:715 pixelratio:1.25 touch:0 geolocation:1 websockets:1 webworkers:1 datepicker:1 dtpicker:1 timepicker:1 dnd:1 sessionstorage:1 localstorage:1 history:1 canvas:1 svg:1 postmessage:1 hc:0; _ga_J2THH2DWLW=GS1.1.1698357073.8.0.1698357073.0.0.0; FAILREASON=0; 9a75866e187615f9e3e688e8297548f9=1f5b60b83338df80ae3a11e1286008b7; SMSESSION=Awk9KIrMNenX09Vl2cEMuy/VxV9CFVP4fsBzCp8Zo3AX2VsrDVWkOMVOdJyoY1Q1J9F8Vs8XFBtHTU29qS7+jlhEMK3f9j8tgudEVWHJq8LTizGhEj1cf8r7CX2QuxWMbdAHvK90hFnpocsL5xv2cAaFVdqhBKlIYkzwkY+r0YuH3Uh6DJVIhAhwjWeKfO6BAg5/jNFxQ31EPvzn4N7RxJK2bGyfAxzi6Cs6O7ieJ10MzcB8nWSIsO4ksfG8pzeGp9a+arl4maKnd9Je2L2FQohmiOjfGcrsezOgLgiWFl1B3+EL8ytArvtKhsFvr7WJsQuhYsQYzfY8shcfhNSltyqxLD422bDmU3NyZdhWY9313YG5I1U2vbO7zvXhxaCJYnpMrJR+inz8XsyqnGY1xu7AepY3pNd2wJH3twQJ42N6R2WlJVVN3oc3DvEHUbk85xrqHdwngd/FiMdEC2f5Kt51VYp8G/3R+sbFiy6Wt7wlZw2+/wI8EfxXs31HQ5q/RDUTXz6JMbzsR7EUOF+WkOrgi1nDugu13/O9hDnxPJnkzNGEfjt0xPxdhoDdl4vWdwRe1awBEn90SyJwc8+cFk1XACtvWoGwtPdf1xnHUwx5Ge1TqEd46xdjjlu+iTw2Xu5AsESUVVw81STsKA7vC8EBabQ+yXQHZlNFcFCKa1+AutNxfWHNQtnFK03kUCai4ZPJc/TQrhvf9DWjSyX+KknWdV6aQyz65KOpwtQWpd4ZlqAAKvf9vCQIBgk+YdsxFzAq6ySnLPcBLbFvP+Xyo5bcABg8IS9aJr6+05KT3ZOv49G1uYvz1ILaDED83D5NHF57ZswKR2911SevaqIO2i8NkZAJUMBpgroSejoJ1MxzpL/a7I26u6+p/08uMt/dT7vuo5OTTjayEtIlXy1IRXA/jU/uX/pKk1JrsZFhhwj7G5KEQpMAx+YvZUaaidqyfj3+fLb6+rsa8BukV8x0zfgUg20dm+Wu9XjDvyQHFP4Qt65CaUbhAKcVTgCChgTfSSdUJZIPPa5Yhzr7SmTuVGmYV/1cC4jGzNdSqr3Fq28fWukiEnRtqfZRXlOdA6xb - - - - - - - - - - false - - = - true - - - - - - - - https://${VEHICLES_API_URL}/users/user-context - OPTIONS - true - false - true - false - - - - - - - - - Host - ${VEHICLES_API_URL} - - - Connection - keep-alive - - - Accept - */* - - - Access-Control-Request-Method - POST - - - Access-Control-Request-Headers - authorization,content-type - - - Origin - https://${FRONTEND_API_URL} - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Sec-Fetch-Mode - cors - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Dest - empty - - - Referer - https://${FRONTEND_API_URL}/ - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - - - - - true - - - - false - {} - = - - - - - - - - https://${VEHICLES_API_URL}/users/user-context - POST - true - false - true - false - - - - - - - - - Host - ${VEHICLES_API_URL} - - - Connection - keep-alive - - - Content-Length - 2 - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - Accept - application/json, text/plain, */* - - - Content-Type - application/json - - - sec-ch-ua-mobile - ?0 - - - Authorization - Bearer ${IDIR_BEARER_TOKEN} - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - sec-ch-ua-platform - "Windows" - - - Origin - https://${FRONTEND_API_URL} - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - cors - - - Sec-Fetch-Dest - empty - - - Referer - https://${FRONTEND_API_URL}/ - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - - - - - - - - false - - = - true - - - - - - - - https://${VEHICLES_API_URL}/users/roles?companyId=102 - OPTIONS - true - false - true - false - - - - - - - - - Host - ${VEHICLES_API_URL} - - - Connection - keep-alive - - - Accept - */* - - - Access-Control-Request-Method - GET - - - Access-Control-Request-Headers - authorization - - - Origin - https://${FRONTEND_API_URL} - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Sec-Fetch-Mode - cors - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Dest - empty - - - Referer - https://${FRONTEND_API_URL}/ - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - - - - - - - - false - - = - true - - - - - - - - https://${VEHICLES_API_URL}/users/roles?companyId=102 - GET - true - false - true - false - - - - - - - - - Host - ${VEHICLES_API_URL} - - - Connection - keep-alive - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - Accept - application/json, text/plain, */* - - - sec-ch-ua-mobile - ?0 - - - Authorization - Bearer ${IDIR_BEARER_TOKEN} - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - sec-ch-ua-platform - "Windows" - - - Origin - https://${FRONTEND_API_URL} - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - cors - - - Sec-Fetch-Dest - empty - - - Referer - https://${FRONTEND_API_URL}/ - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - If-None-Match - W/"1b4-DdYKGtaFZ5+U7pxjw6uu3owPOfo" - - - - - - - - - - false - - = - - - - - - - - https://${VEHICLES_API_URL}/permits/applications?status=IN_PROGRESS&companyId=102&userGUID=A9ED2C5742DC455998672CC2A118174B - OPTIONS - true - false - true - false - - - - - - - - - Host - ${VEHICLES_API_URL} - - - Connection - keep-alive - - - Accept - */* - - - Access-Control-Request-Method - GET - - - Access-Control-Request-Headers - authorization - - - Origin - https://${FRONTEND_API_URL} - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - Sec-Fetch-Mode - cors - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Dest - empty - - - Referer - https://${FRONTEND_API_URL}/ - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - - - - - - - - false - - = - true - - - - - - - - https://${VEHICLES_API_URL}/permits/applications?status=IN_PROGRESS&companyId=102&userGUID=A9ED2C5742DC455998672CC2A118174B - GET - true - false - true - false - - - - - - - - - Host - ${VEHICLES_API_URL} - - - Connection - keep-alive - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - Accept - application/json, text/plain, */* - - - sec-ch-ua-mobile - ?0 - - - Authorization - Bearer ${IDIR_BEARER_TOKEN} - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - sec-ch-ua-platform - "Windows" - - - Origin - https://${FRONTEND_API_URL} - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - cors - - - Sec-Fetch-Dest - empty - - - Referer - https://${FRONTEND_API_URL}/ - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - If-None-Match - W/"17b2-OQs45yY+9rxT8oaE549bg+d9IqA" - - - - - - - - - - - - - - https://${VEHICLES_API_URL}/users/roles?companyId=104 - GET - true - false - true - false - - - - - - - - - Host - ${VEHICLES_API_URL} - - - Connection - keep-alive - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - Accept - application/json - - - sec-ch-ua-mobile - ?0 - - - Authorization - Bearer ${IDIR_BEARER_TOKEN} - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - sec-ch-ua-platform - "Windows" - - - Origin - https://${FRONTEND_API_URL} - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - cors - - - Sec-Fetch-Dest - empty - - - Referer - https://${FRONTEND_API_URL}/ - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - If-None-Match - W/"17b2-OQs45yY+9rxT8oaE549bg+d9IqA" - - - - - - - - Authorization - Bearer ${IDIR_BEARER_TOKEN} - - - Accept - */* - - - - - - - - - - false - - = - true - - - - - - - - https://${VEHICLES_API_URL}/permits/ppc/search?searchColumn=permitNumber&searchString= - GET - true - false - true - false - - - - - - - - - Host - ${VEHICLES_API_URL} - - - Connection - keep-alive - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - Accept - application/json - - - sec-ch-ua-mobile - ?0 - - - Authorization - Bearer ${IDIR_BEARER_TOKEN} - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - sec-ch-ua-platform - "Windows" - - - Origin - https://${FRONTEND_API_URL} - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - cors - - - Sec-Fetch-Dest - empty - - - Referer - https://${FRONTEND_API_URL}/ - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - If-None-Match - W/"17b2-OQs45yY+9rxT8oaE549bg+d9IqA" - - - - - - - - Authorization - Bearer ${IDIR_BEARER_TOKEN} - - - Accept - application/json - - - - - - - true - - - - false - { - "reportTemplate": "PAYMENT_AND_REFUND_DETAILED_REPORT", - "reportData": { - "issuedBy": "Self Issued and PPC", - "runDate": "Jul. 17, 2023, 09:00 PM, PDT", - "permitType": "All Permit Types", - "paymentMethod": "Cash, Cheque, Icepay - Mastercard, Icepay - Mastercard (Debit), Icepay - Visa, Icepay - Visa (Debit), Web - Mastercard (Debit), Web - Visa (Debit), PoS - Mastercard (Debit), PoS - Visa (Debit), PoS - Mastercard", - "timePeriod": "Jul. 17, 2023, 09:00 PM, PDT – Jul. 18, 2023, 09:00 PM, PDT", - "payments": [ - { - "issuedOn": "Jul. 17, 2023, 09:00 PM, PDT", - "providerTransactionId": "73582422238", - "orbcTransactionId": "OR-678904512857", - "paymentMethod": "Cash", - "receiptNo": "45098721098", - "permitNo": "P2-72106199-468", - "permitType": "STOW", - "user": "ANPETRIC", - "amount": "$90.00" - }, - { - "paymentMethod": "Cash", - "subTotalAmount": "$90.00" - }, - { - "paymentMethod": "Cash", - "totalAmount": "$90.00" - } - ], - "refunds": [ - { - "issuedOn": "Jul. 17, 2023, 09:00 PM, PDT", - "providerTransactionId": "73582422238", - "orbcTransactionId": "OR-678904512857", - "paymentMethod": "Cheque", - "receiptNo": "51961102630", - "permitNo": "P2-15348742-610", - "permitType": "TROS", - "user": "KOPARKIN", - "amount": "$10.00" - }, - { - "paymentMethod": "Cheque", - "subTotalAmount": "$190.00" - }, - { - "paymentMethod": "Credit Card", - "totalAmount": "$190.00" - } - ], - "summaryPayments": [ - { - "paymentMethod": "Cheque", - "payment": "$190", - "refund": "$190", - "deposit": "$190" - }, - { - "subTotalPaymentAmount": "$190.00", - "subTotalRefundAmount": "$190.00", - "subTotalDepositAmount": "$190.00" - }, - { - "grandTotalAmount": "$190.00" - } - ], - "summaryPermits": [ - { - "permitType": "TROS", - "permitCount": "1" - }, - { - "totalPermits": "1" - } - ] - }, - "generatedDocumentFileName": "FinancialA12345" -} - = - - - - - - - - https://${DOPS_API_URL}/dgen/report/render - POST - true - false - true - false - - - - - - - - - Host - ${VEHICLES_API_URL} - - - Connection - keep-alive - - - sec-ch-ua - "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99" - - - Accept - application/json - - - sec-ch-ua-mobile - ?0 - - - Authorization - Bearer ${IDIR_BEARER_TOKEN} - - - User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - - - sec-ch-ua-platform - "Windows" - - - Origin - https://${FRONTEND_API_URL} - - - Sec-Fetch-Site - same-site - - - Sec-Fetch-Mode - cors - - - Sec-Fetch-Dest - empty - - - Referer - https://${FRONTEND_API_URL}/ - - - Accept-Encoding - gzip, deflate, br - - - Accept-Language - en-US,en;q=0.9 - - - If-None-Match - W/"17b2-OQs45yY+9rxT8oaE549bg+d9IqA" - - - - - - - - Authorization - Bearer ${IDIR_BEARER_TOKEN} - - - Accept - */* - - - Content-Type - application/json - - - - - false From c084e4ad801eaae06277cf6731c017770d1d6b9f Mon Sep 17 00:00:00 2001 From: glen-aot <160973940+glen-aot@users.noreply.github.com> Date: Tue, 17 Sep 2024 11:39:26 -0700 Subject: [PATCH 34/63] ORV2-2825 - FE: Update: Display suspend status on Staff search for company results (#1599) Co-authored-by: GlenAOT <160973940+GlenAOT@users.noreply.github.com> --- .../components/IDIRCompanySearchResults.scss | 6 ++++++ .../components/IDIRCompanySearchResults.tsx | 19 ++++++++++++++----- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/frontend/src/features/idir/search/components/IDIRCompanySearchResults.scss b/frontend/src/features/idir/search/components/IDIRCompanySearchResults.scss index 3e2c690b2..08bc8fca8 100644 --- a/frontend/src/features/idir/search/components/IDIRCompanySearchResults.scss +++ b/frontend/src/features/idir/search/components/IDIRCompanySearchResults.scss @@ -41,4 +41,10 @@ text-decoration: none; } } + + &__cell { + .status-chip { + margin-left: 0.5rem; + } + } } diff --git a/frontend/src/features/idir/search/components/IDIRCompanySearchResults.tsx b/frontend/src/features/idir/search/components/IDIRCompanySearchResults.tsx index 68a0b4252..0077c5f78 100644 --- a/frontend/src/features/idir/search/components/IDIRCompanySearchResults.tsx +++ b/frontend/src/features/idir/search/components/IDIRCompanySearchResults.tsx @@ -25,6 +25,7 @@ import { Box, CardMedia, Stack, Typography } from "@mui/material"; import { CustomActionLink } from "../../../../common/components/links/CustomActionLink"; import { useNavigate } from "react-router-dom"; import { VerifiedClient } from "../../../../common/authentication/types"; +import { StatusChip } from "../../../settings/components/creditAccount/StatusChip"; /* * @@ -158,13 +159,18 @@ export const IDIRCompanySearchResults = memo( header: "Company Name", enableSorting: true, sortingFn: "alphanumeric", + minSize: 220, Cell: (props: { row: any; cell: any }) => { + const isCompanySuspended = props.row.original.isSuspended; return ( - onClickCompany(props.row.original)} - > - {props.row.original.legalName} - + <> + onClickCompany(props.row.original)} + > + {props.row.original.legalName} + + {isCompanySuspended && } + ); }, }, @@ -207,6 +213,9 @@ export const IDIRCompanySearchResults = memo( children: "Error loading data", } : undefined, + muiTableBodyCellProps: { + className: "idir-company-search-results__cell", + }, }); return ( From fdc89b152d7bb44210eedba49a6b9dbe94781372 Mon Sep 17 00:00:00 2001 From: glen-aot <160973940+glen-aot@users.noreply.github.com> Date: Tue, 17 Sep 2024 12:21:15 -0700 Subject: [PATCH 35/63] ORV2-2827 - FE: Update: Remove Applications in Progress Counter (#1600) Co-authored-by: GlenAOT <160973940+GlenAOT@users.noreply.github.com> --- .../src/common/components/tabs/TabsList.scss | 1 - .../src/common/components/tabs/TabsList.tsx | 44 ++++++++++++------- .../components/dashboard/PermitLists.tsx | 16 +------ .../ApplicationsInProgressList.tsx | 7 +-- 4 files changed, 31 insertions(+), 37 deletions(-) diff --git a/frontend/src/common/components/tabs/TabsList.scss b/frontend/src/common/components/tabs/TabsList.scss index 76796bde9..0f3faf35f 100644 --- a/frontend/src/common/components/tabs/TabsList.scss +++ b/frontend/src/common/components/tabs/TabsList.scss @@ -26,7 +26,6 @@ opacity: 1; padding: 0.875rem 0; } - &__count { font-size: 0.875rem; color: $bc-black; diff --git a/frontend/src/common/components/tabs/TabsList.tsx b/frontend/src/common/components/tabs/TabsList.tsx index 8171e20b2..47a48170c 100644 --- a/frontend/src/common/components/tabs/TabsList.tsx +++ b/frontend/src/common/components/tabs/TabsList.tsx @@ -1,4 +1,4 @@ -import { Chip, Tab, Tabs } from "@mui/material"; +import { Tab, Tabs } from "@mui/material"; import "./TabsList.scss"; import { TabComponentProps } from "./types/TabComponentProps"; @@ -28,21 +28,33 @@ export const TabsList = ({ scrollButtons="auto" aria-label="scrollable profile tabs" > - {componentList.map(({ label, count }, index) => { - return ( - -
{label}
- {count ? : null} - - } - {...TabProps(index)} - /> - ); - })} + {componentList.map( + ( + { + label, + // TODO remove this if we no longer need tab counters + // count + }, + index, + ) => { + return ( + +
{label}
+ { + // TODO remove this if we no longer need tab counters + /* {count ? : null} */ + } + + } + {...TabProps(index)} + /> + ); + }, + )} ); }; diff --git a/frontend/src/features/permits/components/dashboard/PermitLists.tsx b/frontend/src/features/permits/components/dashboard/PermitLists.tsx index 41f171896..a888cb4e5 100644 --- a/frontend/src/features/permits/components/dashboard/PermitLists.tsx +++ b/frontend/src/features/permits/components/dashboard/PermitLists.tsx @@ -1,21 +1,14 @@ -import React, { useState } from "react"; - +import React from "react"; import { TabLayout } from "../../../../common/components/dashboard/TabLayout"; import { StartApplicationAction } from "../../pages/Application/components/dashboard/StartApplicationAction"; import { ActivePermitList } from "../permit-list/ActivePermitList"; import { ExpiredPermitList } from "../permit-list/ExpiredPermitList"; import { ApplicationsInProgressList } from "../permit-list/ApplicationsInProgressList"; import { ApplicationsInReviewList } from "../permit-list/ApplicationsInReviewList"; -import { Nullable } from "../../../../common/types/common"; import { usePermissionMatrix } from "../../../../common/authentication/PermissionMatrix"; import { RenderIf } from "../../../../common/components/reusable/RenderIf"; export const PermitLists = React.memo(() => { - const [applicationsInProgressCount, setApplicationsInProgressCount] = - useState>(); - const handleApplicationsCountChange = (count: number) => { - setApplicationsInProgressCount(count); - }; const tabs = []; const showApplicationsInProgressTab = usePermissionMatrix({ @@ -28,12 +21,7 @@ export const PermitLists = React.memo(() => { if (showApplicationsInProgressTab) { tabs.push({ label: "Applications in Progress", - count: applicationsInProgressCount, - component: ( - - ), + component: , }); } diff --git a/frontend/src/features/permits/components/permit-list/ApplicationsInProgressList.tsx b/frontend/src/features/permits/components/permit-list/ApplicationsInProgressList.tsx index 530e7e90c..9f5c83c12 100644 --- a/frontend/src/features/permits/components/permit-list/ApplicationsInProgressList.tsx +++ b/frontend/src/features/permits/components/permit-list/ApplicationsInProgressList.tsx @@ -42,11 +42,7 @@ const getColumns = ( return ApplicationInProgressColumnDefinition(userRole); }; -export const ApplicationsInProgressList = ({ - onCountChange, -}: { - onCountChange: (count: number) => void; -}) => { +export const ApplicationsInProgressList = () => { const { applicationsInProgressQuery, pagination, @@ -82,7 +78,6 @@ export const ApplicationsInProgressList = ({ applicationsInProgress?.meta?.totalItems, ); setShowAIPTable(totalCount > 0); - onCountChange(totalCount); }, [applicationsInProgress?.meta?.totalItems]); const { idirUserDetails, userDetails } = useContext(OnRouteBCContext); From 84c5625949851a5d1129fd5c6c592fe78318a0d0 Mon Sep 17 00:00:00 2001 From: Praveen Raju <80779423+praju-aot@users.noreply.github.com> Date: Wed, 18 Sep 2024 12:35:13 -0400 Subject: [PATCH 36/63] ORV2-2792 Staff Queue Changes (#1603) --- .../application-search.constraint.ts | 13 +++--- .../constraint/query-param-list.constraint.ts | 44 +++++++++++++++++++ .../common/enum/application-status.enum.ts | 2 +- .../src/common/enum/case-status-type.enum.ts | 36 +++++++++++++++ .../src/common/helper/permit-fee.helper.ts | 6 +-- .../application/application.controller.ts | 11 +++-- .../application/application.service.ts | 29 ++++++------ .../company-application.controller.ts | 10 ++++- .../getApplication.query-params.dto.ts | 30 ++++++------- .../profile/application.profile.ts | 31 ++++++------- .../payment/payment.service.ts | 5 ++- 11 files changed, 153 insertions(+), 64 deletions(-) create mode 100644 vehicles/src/common/constraint/query-param-list.constraint.ts diff --git a/vehicles/src/common/constraint/application-search.constraint.ts b/vehicles/src/common/constraint/application-search.constraint.ts index 8f367018e..1618c8e08 100644 --- a/vehicles/src/common/constraint/application-search.constraint.ts +++ b/vehicles/src/common/constraint/application-search.constraint.ts @@ -5,24 +5,25 @@ import { } from 'class-validator'; import { Nullable } from '../types/common'; import { ApplicationSearch } from '../enum/application-search.enum'; +import { ApplicationQueueStatus } from '../enum/case-status-type.enum'; @ValidatorConstraint({ name: 'ApplicationSearch', async: false }) export class ApplicationSearchConstraint implements ValidatorConstraintInterface { validate( - value: ApplicationSearch | boolean | undefined, + value: ApplicationSearch | boolean | undefined | ApplicationQueueStatus[], args: ValidationArguments, ) { const fields = args.object as { pendingPermits?: Nullable; - applicationsInQueue?: Nullable; + applicationQueueStatus?: Nullable; searchColumn?: Nullable; searchString?: Nullable; }; if ( fields.pendingPermits != undefined && - fields.applicationsInQueue !== undefined + fields.applicationQueueStatus?.length ) { return false; } else if (fields.searchColumn && !fields.searchString) { @@ -35,16 +36,16 @@ export class ApplicationSearchConstraint const message: string[] = []; const fields = args.object as { pendingPermits?: Nullable; - applicationsInQueue?: Nullable; + applicationQueueStatus?: Nullable; searchColumn?: Nullable; searchString?: Nullable; }; if ( fields.pendingPermits != undefined && - fields.applicationsInQueue !== undefined + fields.applicationQueueStatus?.length ) { message.push( - 'Both pendingPermits and applicationsInQueue cannot be set at the same time.', + 'Both pendingPermits and applicationQueueStatus cannot be set at the same time.', ); } if (fields.searchColumn && !fields.searchString) { diff --git a/vehicles/src/common/constraint/query-param-list.constraint.ts b/vehicles/src/common/constraint/query-param-list.constraint.ts new file mode 100644 index 000000000..68d5f9f5c --- /dev/null +++ b/vehicles/src/common/constraint/query-param-list.constraint.ts @@ -0,0 +1,44 @@ +import { + ValidatorConstraint, + ValidatorConstraintInterface, + ValidationArguments, +} from 'class-validator'; +import { Nullable } from '../types/common'; + +@ValidatorConstraint({ name: 'QueryParamList', async: false }) +export class QueryParamListConstraint implements ValidatorConstraintInterface { + validate(field: Nullable, args: ValidationArguments): boolean { + return !this.validateQueryParamList(field, args)?.length; + } + + validateQueryParamList( + field: Nullable, + args: ValidationArguments, + ): string[] { + const fieldList = field?.split(',') || []; + const allowedFieldValues = Object.values( + args.constraints?.at(0) as Record, + ); + + return fieldList.flatMap((fieldValue) => { + const errors: string[] = []; + if (!allowedFieldValues.includes(fieldValue)) { + errors.push( + `${fieldValue} is an invalid value. Possible values are: ${Object.values(allowedFieldValues).join(', ')}.`, + ); + } + return errors; + }); + } + + defaultMessage(args: ValidationArguments): string { + const applicationQueueStatus = ( + args.object as { applicationQueueStatus?: Nullable } + ).applicationQueueStatus; + const invalidFields = this.validateQueryParamList( + applicationQueueStatus, + args, + ); + return invalidFields.join(' '); + } +} diff --git a/vehicles/src/common/enum/application-status.enum.ts b/vehicles/src/common/enum/application-status.enum.ts index 7b5f5ea27..547905b96 100644 --- a/vehicles/src/common/enum/application-status.enum.ts +++ b/vehicles/src/common/enum/application-status.enum.ts @@ -36,7 +36,7 @@ export const ACTIVE_APPLICATION_STATUS: readonly ApplicationStatus[] = [ ]; /** - * Application statuses including Application In Progress (AIP) and Pending Permits/Applications + * Application statuses including Application In Progress (AIP), Pending Permits/Applications & IN_QUEUE */ export const ALL_APPLICATION_STATUS: readonly ApplicationStatus[] = [ ApplicationStatus.IN_PROGRESS, diff --git a/vehicles/src/common/enum/case-status-type.enum.ts b/vehicles/src/common/enum/case-status-type.enum.ts index 52e228044..f68f926e4 100644 --- a/vehicles/src/common/enum/case-status-type.enum.ts +++ b/vehicles/src/common/enum/case-status-type.enum.ts @@ -18,3 +18,39 @@ export type ApplicationQueueStatus = export const ACTIVE_APPLICATION_QUEUE_STATUS: readonly ApplicationQueueStatus[] = [ApplicationQueueStatus.PENDING_REVIEW, ApplicationQueueStatus.IN_REVIEW]; + +const statusMapping: Record = { + [ApplicationQueueStatus.PENDING_REVIEW]: CaseStatusType.OPEN, + [ApplicationQueueStatus.IN_REVIEW]: CaseStatusType.IN_PROGRESS, + [ApplicationQueueStatus.CLOSED]: CaseStatusType.CLOSED, +}; + +/** + * Converts an ApplicationQueueStatus to its corresponding CaseStatusType. + * + * @param status The ApplicationQueueStatus to convert. + * @returns The corresponding CaseStatusType. + */ +export const convertApplicationQueueStatus = ( + statuses: ApplicationQueueStatus[], +): CaseStatusType[] => { + return statuses?.map((status) => statusMapping[status]); +}; + +const reverseStatusMapping: Record = { + [CaseStatusType.OPEN]: ApplicationQueueStatus.PENDING_REVIEW, + [CaseStatusType.CLOSED]: ApplicationQueueStatus.CLOSED, + [CaseStatusType.IN_PROGRESS]: ApplicationQueueStatus.IN_REVIEW, +}; + +/** + * Converts an array of CaseStatusType values to their corresponding ApplicationQueueStatus values. + * + * @param statuses An array of CaseStatusType values to convert. + * @returns An array of ApplicationQueueStatus values + */ +export const convertCaseStatus = ( + statuses: CaseStatusType[], +): ApplicationQueueStatus[] => { + return statuses.map((status) => reverseStatusMapping[status]); +}; diff --git a/vehicles/src/common/helper/permit-fee.helper.ts b/vehicles/src/common/helper/permit-fee.helper.ts index a774b0473..835687f0c 100644 --- a/vehicles/src/common/helper/permit-fee.helper.ts +++ b/vehicles/src/common/helper/permit-fee.helper.ts @@ -170,10 +170,8 @@ export const currentPermitFee = ( return oldAmount === 0 ? 0 : -pricePerTerm * permitTerms; } // For non void new application (exclude amendment application), if no fee applies, set the price per term to 0 for new application - if ((isNoFee && oldAmount === undefined) || oldAmount === 0) - return 0; - if (oldAmount === undefined) - oldAmount = 0; + if ((isNoFee && oldAmount === undefined) || oldAmount === 0) return 0; + if (oldAmount === undefined) oldAmount = 0; // Calculate fee for non void permit. return oldAmount > 0 ? pricePerTerm * permitTerms - oldAmount diff --git a/vehicles/src/modules/permit-application-payment/application/application.controller.ts b/vehicles/src/modules/permit-application-payment/application/application.controller.ts index 7258c89e0..490a75f78 100644 --- a/vehicles/src/modules/permit-application-payment/application/application.controller.ts +++ b/vehicles/src/modules/permit-application-payment/application/application.controller.ts @@ -28,6 +28,10 @@ import { IDIR_USER_ROLE_LIST } from '../../../common/enum/user-role.enum'; import { PaginationDto } from '../../../common/dto/paginate/pagination'; import { ReadApplicationMetadataDto } from './dto/response/read-application-metadata.dto'; import { GetApplicationQueryParamsDto } from './dto/request/queryParam/getApplication.query-params.dto'; +import { + ApplicationQueueStatus, + convertApplicationQueueStatus, +} from '../../../common/enum/case-status-type.enum'; @ApiBearerAuth() @ApiTags('Application : API accessible exclusively to staff users and SA.') @@ -66,11 +70,10 @@ export class ApplicationController { orderBy, searchColumn, searchString, - applicationsInQueue, + applicationQueueStatus, }: GetApplicationQueryParamsDto, ): Promise> { const currentUser = request.user as IUserJWT; - return await this.applicationService.findAllApplications({ page, take, @@ -78,7 +81,9 @@ export class ApplicationController { currentUser, searchColumn, searchString, - applicationsInQueue, + applicationQueueStatus: convertApplicationQueueStatus( + (applicationQueueStatus?.split(',') as ApplicationQueueStatus[]) || [], + ), }); } diff --git a/vehicles/src/modules/permit-application-payment/application/application.service.ts b/vehicles/src/modules/permit-application-payment/application/application.service.ts index 4b5386a0e..933c9a226 100644 --- a/vehicles/src/modules/permit-application-payment/application/application.service.ts +++ b/vehicles/src/modules/permit-application-payment/application/application.service.ts @@ -296,7 +296,7 @@ export class ApplicationService { } /** - * Retrieves applications based on multiple optional filters including user GUID, company ID, pending permits status, applications in queue, and a search string. + * Retrieves applications based on multiple optional filters including user GUID, company ID, pending permits status, applications queue status, and a search string. * The function supports sorting by various columns and includes pagination for efficient retrieval. * @param findAllApplicationsOptions - Contains multiple optional parameters: pagination, sorting, filtering by company ID, user GUID, and other search filters. * - page: The current page number for pagination. @@ -306,7 +306,7 @@ export class ApplicationService { * - companyId: The ID of the company to filter applications by. * - userGUID: The GUID of the user whose applications to filter. * - currentUser: The current logged-in user's JWT payload. - * - applicationsInQueue: Boolean filter for applications that are in the queue. + * - applicationQueueStatus: Status filter for applications that are in the queue. * - searchColumn: The specific column to search within (e.g., plate, application number). * - searchString: The input keyword to use for searching. * @returns A paginated result containing filtered and sorted ReadApplicationMetadataDto objects. @@ -320,7 +320,7 @@ export class ApplicationService { companyId?: number; userGUID?: string; currentUser?: IUserJWT; - applicationsInQueue?: Nullable; + applicationQueueStatus?: Nullable; searchColumn?: Nullable; searchString?: Nullable; }): Promise> { @@ -332,7 +332,7 @@ export class ApplicationService { findAllApplicationsOptions.userGUID, findAllApplicationsOptions.searchColumn, findAllApplicationsOptions.searchString, - findAllApplicationsOptions.applicationsInQueue, + findAllApplicationsOptions.applicationQueueStatus, ); // total number of items const totalItems = await applicationsQB.getCount(); @@ -389,7 +389,8 @@ export class ApplicationService { currentUserRole: findAllApplicationsOptions?.currentUser?.orbcUserRole, currentDateTime: new Date(), - applicationsInQueue: findAllApplicationsOptions.applicationsInQueue, + applicationQueueStatus: + findAllApplicationsOptions.applicationQueueStatus, }), }, ); @@ -404,12 +405,12 @@ export class ApplicationService { userGUID?: string, searchColumn?: Nullable, searchString?: Nullable, - applicationsInQueue?: Nullable, + applicationQueueStatus?: Nullable, ): SelectQueryBuilder { - // Ensure that pendingPermits and applicationsInQueue are not set at the same time - if (pendingPermits !== undefined && applicationsInQueue !== undefined) { + // Ensure that pendingPermits and applicationQueueStatus are not set at the same time + if (pendingPermits !== undefined && applicationQueueStatus?.length) { throw new InternalServerErrorException( - 'Both pendingPermits and applicationsInQueue cannot be set at the same time.', + 'Both pendingPermits and applicationQueueStatus cannot be set at the same time.', ); } @@ -425,7 +426,7 @@ export class ApplicationService { ); // Include cases and the assigned case user only if applications are in queue - if (applicationsInQueue) { + if (applicationQueueStatus?.length) { permitsQuery = permitsQuery.innerJoinAndSelect('permit.cases', 'cases'); permitsQuery = permitsQuery.leftJoinAndSelect( 'cases.assignedUser', @@ -444,7 +445,7 @@ export class ApplicationService { } // Handle various status filters depending on the provided flags - if (applicationsInQueue) { + if (applicationQueueStatus?.length) { // If retrieving applications in queue, we filter those with "IN_QUEUE" status and open/in-progress cases permitsQuery = permitsQuery.andWhere( 'permit.permitStatus = :permitStatus', @@ -455,7 +456,7 @@ export class ApplicationService { permitsQuery = permitsQuery.andWhere( 'cases.caseStatusType IN (:...caseStatuses)', { - caseStatuses: [CaseStatusType.OPEN, CaseStatusType.IN_PROGRESS], + caseStatuses: applicationQueueStatus, }, ); } else if (pendingPermits) { @@ -467,7 +468,7 @@ export class ApplicationService { }); }), ); - } else if (pendingPermits === false || applicationsInQueue === false) { + } else if (pendingPermits === false) { // Filter active applications based on ACTIVE_APPLICATION_STATUS permitsQuery = permitsQuery.andWhere( new Brackets((qb) => { @@ -478,7 +479,7 @@ export class ApplicationService { ); } else if ( pendingPermits === undefined || - applicationsInQueue === undefined + !applicationQueueStatus?.length ) { // Filter all applications based on ALL_APPLICATION_STATUS permitsQuery = permitsQuery.andWhere( diff --git a/vehicles/src/modules/permit-application-payment/application/company-application.controller.ts b/vehicles/src/modules/permit-application-payment/application/company-application.controller.ts index cfdb8c294..0e674868b 100644 --- a/vehicles/src/modules/permit-application-payment/application/company-application.controller.ts +++ b/vehicles/src/modules/permit-application-payment/application/company-application.controller.ts @@ -48,6 +48,10 @@ import { ReadApplicationMetadataDto } from './dto/response/read-application-meta import { GetApplicationQueryParamsDto } from './dto/request/queryParam/getApplication.query-params.dto'; import { ApiPaginatedResponse } from 'src/common/decorator/api-paginate-response'; import { PermitReceiptDocumentService } from '../permit-receipt-document/permit-receipt-document.service'; +import { + ApplicationQueueStatus, + convertApplicationQueueStatus, +} from '../../../common/enum/case-status-type.enum'; @ApiBearerAuth() @ApiTags('Company Application') @@ -112,7 +116,11 @@ export class CompanyApplicationController { pendingPermits: getApplicationQueryParamsDto.pendingPermits, userGUID: userGuid, currentUser: currentUser, - applicationsInQueue: getApplicationQueryParamsDto.applicationsInQueue, + applicationQueueStatus: convertApplicationQueueStatus( + (getApplicationQueryParamsDto?.applicationQueueStatus?.split( + ',', + ) as ApplicationQueueStatus[]) || [], + ), searchColumn: getApplicationQueryParamsDto.searchColumn, searchString: getApplicationQueryParamsDto.searchString, }); diff --git a/vehicles/src/modules/permit-application-payment/application/dto/request/queryParam/getApplication.query-params.dto.ts b/vehicles/src/modules/permit-application-payment/application/dto/request/queryParam/getApplication.query-params.dto.ts index 33ef61b3e..5a3e90165 100644 --- a/vehicles/src/modules/permit-application-payment/application/dto/request/queryParam/getApplication.query-params.dto.ts +++ b/vehicles/src/modules/permit-application-payment/application/dto/request/queryParam/getApplication.query-params.dto.ts @@ -18,7 +18,8 @@ import { ALL_APPLICATION_STATUS, } from '../../../../../../common/enum/application-status.enum'; import { ApplicationSearchConstraint } from '../../../../../../common/constraint/application-search.constraint'; -import { ACTIVE_APPLICATION_QUEUE_STATUS } from '../../../../../../common/enum/case-status-type.enum'; +import { ApplicationQueueStatus } from '../../../../../../common/enum/case-status-type.enum'; +import { QueryParamListConstraint } from '../../../../../../common/constraint/query-param-list.constraint'; export class GetApplicationQueryParamsDto extends PageOptionsDto { @ApiProperty({ @@ -93,23 +94,20 @@ export class GetApplicationQueryParamsDto extends PageOptionsDto { pendingPermits?: Nullable; @ApiProperty({ + example: `${Object.values(ApplicationQueueStatus).join(',')}`, description: - `Setting this property true restricts the search results to those applications which are in queue (${Object.values(ACTIVE_APPLICATION_QUEUE_STATUS).join(', ')}). ` + - `Conversely, Setting it to false confines the search results to only those applications that are awaiting payment (${Object.values(ACTIVE_APPLICATION_STATUS).join(', ')}). ` + - `If left unspecified, the system will fetch all applications that are in any of the following statuses: ${Object.values(ALL_APPLICATION_STATUS).join(', ')}, including those awaiting issuance. ` + - 'Caution: You cannot set both pendingPermits and applicationsInQueue properties at the same time.', - example: true, + 'A string representing the application queue status order for query results. ' + + 'If unspecified, the results will not follow any specific order. ' + + 'The format involves a status code, with possible values being case-sensitive and must align with those defined in the schema. ' + + 'Start ordering using a status code, and optionally add more by joining them with commas. ' + + `Possible values are: ${Object.values(ApplicationQueueStatus).join(', ')}. ` + + 'Syntax: ', required: false, - type: 'boolean', + type: 'string', }) @IsOptional() - @Transform(({ obj, key }: { obj: Record; key: string }) => { - return obj[key] === 'true' ? true : obj[key] === 'false' ? false : obj[key]; - }) - @Validate(ApplicationSearchConstraint, { - message: - 'Both pendingPermits and applicationsInQueue cannot be set at the same time.', - }) - @IsBoolean() - applicationsInQueue?: Nullable; + @Validate(QueryParamListConstraint, [ApplicationQueueStatus]) + @IsString() + @Length(1, 150) + applicationQueueStatus?: Nullable; } diff --git a/vehicles/src/modules/permit-application-payment/application/profile/application.profile.ts b/vehicles/src/modules/permit-application-payment/application/profile/application.profile.ts index d85a45442..1f63de139 100644 --- a/vehicles/src/modules/permit-application-payment/application/profile/application.profile.ts +++ b/vehicles/src/modules/permit-application-payment/application/profile/application.profile.ts @@ -23,8 +23,8 @@ import { Permit } from '../../permit/entities/permit.entity'; import { differenceBetween } from '../../../../common/helper/date-time.helper'; import { Nullable } from '../../../../common/types/common'; import { - ApplicationQueueStatus, CaseStatusType, + convertCaseStatus, } from '../../../../common/enum/case-status-type.enum'; import { ReadCaseActivityDto } from '../../../case-management/dto/response/read-case-activity.dto'; @@ -289,18 +289,13 @@ export class ApplicationProfile extends AutomapperProfile { ( s, { - applicationsInQueue, - }: { applicationsInQueue?: Nullable }, + applicationQueueStatus, + }: { applicationQueueStatus?: Nullable }, ) => { - if (applicationsInQueue && s.cases?.length) { - switch (s.cases?.at(0)?.caseStatusType) { - case CaseStatusType.OPEN: - return ApplicationQueueStatus.PENDING_REVIEW; - case CaseStatusType.IN_PROGRESS: - return ApplicationQueueStatus.IN_REVIEW; - case CaseStatusType.CLOSED: - return ApplicationQueueStatus.CLOSED; - } + if (applicationQueueStatus?.length && s.cases?.length) { + return convertCaseStatus([s.cases?.at(0)?.caseStatusType])?.at( + 0, + ); } }, ), @@ -313,15 +308,15 @@ export class ApplicationProfile extends AutomapperProfile { { currentUserRole, currentDateTime, - applicationsInQueue, + applicationQueueStatus, }: { currentUserRole: UserRole; currentDateTime: Date; - applicationsInQueue?: Nullable; + applicationQueueStatus?: Nullable; }, ) => { if ( - applicationsInQueue && + applicationQueueStatus?.length && doesUserHaveRole(currentUserRole, IDIR_USER_ROLE_LIST) ) { const diff = differenceBetween( @@ -346,14 +341,14 @@ export class ApplicationProfile extends AutomapperProfile { s, { currentUserRole, - applicationsInQueue, + applicationQueueStatus, }: { currentUserRole: UserRole; - applicationsInQueue?: Nullable; + applicationQueueStatus?: Nullable; }, ) => { if ( - applicationsInQueue && + applicationQueueStatus?.length && doesUserHaveRole(currentUserRole, IDIR_USER_ROLE_LIST) && s.cases?.length ) { diff --git a/vehicles/src/modules/permit-application-payment/payment/payment.service.ts b/vehicles/src/modules/permit-application-payment/payment/payment.service.ts index d0af3097b..3c82633d9 100644 --- a/vehicles/src/modules/permit-application-payment/payment/payment.service.ts +++ b/vehicles/src/modules/permit-application-payment/payment/payment.service.ts @@ -788,7 +788,10 @@ export class PaymentService { application.company.companyId, queryRunner, ); - const oldAmount = permitPaymentHistory.length > 0?calculatePermitAmount(permitPaymentHistory):undefined; + const oldAmount = + permitPaymentHistory.length > 0 + ? calculatePermitAmount(permitPaymentHistory) + : undefined; const fee = permitFee(application, isNoFee, oldAmount); return fee; } From 56c437506be5e6dfc81440f0071a2f9b1f29b66b Mon Sep 17 00:00:00 2001 From: Praveen Raju <80779423+praju-aot@users.noreply.github.com> Date: Thu, 19 Sep 2024 12:22:27 -0400 Subject: [PATCH 37/63] fix: ORV2-2792 Document applicationQueueStatus query parameter (#1604) --- .../request/queryParam/getApplication.query-params.dto.ts | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/vehicles/src/modules/permit-application-payment/application/dto/request/queryParam/getApplication.query-params.dto.ts b/vehicles/src/modules/permit-application-payment/application/dto/request/queryParam/getApplication.query-params.dto.ts index 5a3e90165..279c77a53 100644 --- a/vehicles/src/modules/permit-application-payment/application/dto/request/queryParam/getApplication.query-params.dto.ts +++ b/vehicles/src/modules/permit-application-payment/application/dto/request/queryParam/getApplication.query-params.dto.ts @@ -96,10 +96,9 @@ export class GetApplicationQueryParamsDto extends PageOptionsDto { @ApiProperty({ example: `${Object.values(ApplicationQueueStatus).join(',')}`, description: - 'A string representing the application queue status order for query results. ' + - 'If unspecified, the results will not follow any specific order. ' + - 'The format involves a status code, with possible values being case-sensitive and must align with those defined in the schema. ' + - 'Start ordering using a status code, and optionally add more by joining them with commas. ' + + 'The query parameter allows for filtering results based on applicationQueueStatus. ' + + 'Multiple application queue statuses can be specified and should be comma-separated. ' + + 'The values are case-sensitive and must match those defined in the schema. ' + `Possible values are: ${Object.values(ApplicationQueueStatus).join(', ')}. ` + 'Syntax: ', required: false, From 3599fd646480144ea13ce29e6a87bcf8cd16b0e4 Mon Sep 17 00:00:00 2001 From: Praveen Raju <80779423+praju-aot@users.noreply.github.com> Date: Mon, 23 Sep 2024 12:22:06 -0400 Subject: [PATCH 38/63] fix: ORV2-2972 Start and Expiry date validation (#1606) --- .../application/application.service.ts | 56 +++++++++++++++++-- 1 file changed, 51 insertions(+), 5 deletions(-) diff --git a/vehicles/src/modules/permit-application-payment/application/application.service.ts b/vehicles/src/modules/permit-application-payment/application/application.service.ts index 933c9a226..0db543da1 100644 --- a/vehicles/src/modules/permit-application-payment/application/application.service.ts +++ b/vehicles/src/modules/permit-application-payment/application/application.service.ts @@ -71,8 +71,12 @@ import { NotificationTemplate } from '../../../common/enum/notification-template import { PermitData } from '../../../common/interface/permit.template.interface'; import { ApplicationApprovedNotification } from '../../../common/interface/application-approved.notification.interface'; import { ApplicationRejectedNotification } from '../../../common/interface/application-rejected.notification.interface'; -import { convertUtcToPt } from '../../../common/helper/date-time.helper'; +import { + convertUtcToPt, + differenceBetween, +} from '../../../common/helper/date-time.helper'; import { ReadCaseActivityDto } from '../../case-management/dto/response/read-case-activity.dto'; +import * as dayjs from 'dayjs'; @Injectable() export class ApplicationService { @@ -558,13 +562,32 @@ export class ApplicationService { ): Promise { const existingApplication = await this.findOne(applicationId, companyId); - // Enforce that application is editable only if it is currently IN_PROGRESS - if (existingApplication.permitStatus !== ApplicationStatus.IN_PROGRESS) { + // Enforce that the application is editable only if it is currently IN_PROGRESS or if the user has an appropriate IDIR role and the application is IN_QUEUE + if ( + existingApplication.permitStatus !== ApplicationStatus.IN_PROGRESS && + !( + doesUserHaveRole(currentUser.orbcUserRole, IDIR_USER_ROLE_LIST) && + existingApplication.permitStatus === ApplicationStatus.IN_QUEUE + ) + ) { throw new BadRequestException( - 'Only an Application currently in progress can be modified.', + 'Only an Application currently in progress can be modified or must have correct authorization.', ); } + if ( + isPermitTypeEligibleForQueue(existingApplication.permitType) && + existingApplication.permitStatus === ApplicationStatus.IN_QUEUE + ) { + const permitData = JSON.parse( + existingApplication?.permitData?.permitData, + ) as PermitData; + const currentDate = dayjs(new Date().toISOString())?.format('YYYY-MM-DD'); + if (differenceBetween(permitData?.startDate, currentDate, 'days') < 0) { + throwUnprocessableEntityException('Start Date is in the past.'); + } + } + const newApplication = this.classMapper.map( updateApplicationDto, UpdateApplicationDto, @@ -1009,6 +1032,27 @@ export class ApplicationService { queryRunner, }); } else { + if (CaseActivityType.APPROVED === caseActivityType) { + const permitData = JSON.parse( + application?.permitData?.permitData, + ) as PermitData; + const currentDate = dayjs(new Date().toISOString())?.format( + 'YYYY-MM-DD', + ); + + if ( + application.permitStatus === ApplicationStatus.IN_QUEUE && + (differenceBetween(permitData?.startDate, currentDate, 'days') < + 0 || + differenceBetween(permitData?.expiryDate, currentDate, 'days') < + 0) + ) { + throwUnprocessableEntityException( + 'Start Date and/or Permit Expiry Date is in the past.', + ); + } + } + result = await this.caseManagementService.workflowEnd({ currentUser, applicationId, @@ -1094,7 +1138,9 @@ export class ApplicationService { await queryRunner.commitTransaction(); } } catch (error) { - await queryRunner.rollbackTransaction(); + if (queryRunner.isTransactionActive) { + await queryRunner.rollbackTransaction(); + } this.logger.error(error); //Swallow Notification error } From e0f581aba1cbb1dcc38cb618e25e0ccc2b4525f0 Mon Sep 17 00:00:00 2001 From: cberg-aot <93226309+cberg-aot@users.noreply.github.com> Date: Mon, 23 Sep 2024 10:07:45 -0700 Subject: [PATCH 39/63] Feat/release please (#1602) --- .github/workflows/demo.yml | 44 +++++++----------- .github/workflows/dev.yml | 40 +++++++++++++++++ .github/workflows/merge.yml | 84 ++++++++--------------------------- .github/workflows/pr-open.yml | 22 ++------- .github/workflows/prod.yml | 34 ++++++++++++++ .github/workflows/release.yml | 40 +++++++++++++++++ .github/workflows/test.yml | 35 +++++++++++++++ .github/workflows/uat.yml | 41 +++++++---------- .gitignore | 1 + 9 files changed, 204 insertions(+), 137 deletions(-) create mode 100644 .github/workflows/dev.yml create mode 100644 .github/workflows/prod.yml create mode 100644 .github/workflows/release.yml create mode 100644 .github/workflows/test.yml diff --git a/.github/workflows/demo.yml b/.github/workflows/demo.yml index 73711c54e..60278a1e6 100644 --- a/.github/workflows/demo.yml +++ b/.github/workflows/demo.yml @@ -3,42 +3,32 @@ name: Deploy Demo on: workflow_dispatch: inputs: - environment: - description: "Deployment environment - test --> vault secrets" - required: true - type: choice - options: ["test","tools"] - default: "test" + tag: + description: "Image tag to deploy" + required: false + type: string + default: "uat" + workflow_call: + inputs: + tag: + description: "Image tag to deploy" + required: false + type: string + default: "uat" - -concurrency: - group: ${{ github.workflow }} - cancel-in-progress: true - jobs: - uninstall-demo: - name: Uninstall (demo) - environment: ${{inputs.environment}} - runs-on: ubuntu-22.04 - steps: - - name: uninstall - run: | - oc login --token=${{ secrets.oc_token }} --server=${{ secrets.oc_server }} - oc project ${{ secrets.OC_NAMESPACE }} # Safeguard! - helm uninstall onroutebc-demo || true deploy-demo: - name: Deploys (demo) + name: Deploys (DEMO) uses: ./.github/workflows/deploy.yml - needs: uninstall-demo secrets: inherit with: autoscaling: false - environment: ${{inputs.environment}} - tag: "test" + environment: demo + tag: ${{inputs.tag}} release: "demo" params: | --set-string global.license='c28f0c' \ --set-string global.zone='test' \ --set-string global.vault.role='nonprod' \ - --set-string global.vault.zone='staging' \ - --set-string global.pr_num='${{ needs.vars.outputs.pr }}' \ + --set-string global.vault.zone='demo' \ + --set-string global.pr_num='${{ inputs.tag }}' \ diff --git a/.github/workflows/dev.yml b/.github/workflows/dev.yml new file mode 100644 index 000000000..4f50802b3 --- /dev/null +++ b/.github/workflows/dev.yml @@ -0,0 +1,40 @@ +--- +name: Deploy Dev + +on: + workflow_dispatch: + inputs: + tag: + description: "Image tag to deploy" + required: false + type: string + default: "latest" + workflow_call: + inputs: + tag: + description: "Image tag to deploy" + required: false + type: string + default: "latest" +jobs: + deploy-dev: + name: Deploys (DEV) + uses: ./.github/workflows/deploy.yml + secrets: inherit + with: + autoscaling: false + environment: dev + release: ${{inputs.tag}} + tag: ${{ inputs.tag }} + triggers: '' #omit=always; + params: | + --set-string global.license='c28f0c' \ + --set-string global.zone='dev' \ + --set-string global.vault.role='nonprod' \ + --set-string global.vault.zone='dev' \ + --set-string global.pr_num='${{ inputs.tag }}' \ + --set-json dops.containers[0].resources='{"limits": {"cpu": "1000m", "memory": "2000Mi"}, "requests": {"cpu": "25m", "memory": "50Mi"}}' \ + --set-json frontend.containers[0].resources='{"limits": {"cpu": "75m", "memory": "150Mi"}, "requests": {"cpu": "25m", "memory": "50Mi"}}' \ + --set-json scheduler.containers[0].resources='{"limits": {"cpu": "75m", "memory": "150Mi"}, "requests": {"cpu": "25m", "memory": "50Mi"}}' \ + --set-json policy.containers[0].resources='{"limits": {"cpu": "75m", "memory": "150Mi"}, "requests": {"cpu": "25m", "memory": "50Mi"}}' \ + --set-json vehicles.containers[0].resources='{"limits": {"cpu": "300m", "memory": "500Mi"}, "requests": {"cpu": "200m", "memory": "400Mi"}}' \ diff --git a/.github/workflows/merge.yml b/.github/workflows/merge.yml index 71badf203..611023eb3 100644 --- a/.github/workflows/merge.yml +++ b/.github/workflows/merge.yml @@ -11,10 +11,11 @@ on: - '!.github/workflows/merge.yml' workflow_dispatch: inputs: - pr_no: - description: "PR-numbered container set to deploy" - type: number - required: true + pr: + description: "PR num of image to deploy" + required: false + type: string + concurrency: group: ${{ github.workflow }} @@ -29,27 +30,21 @@ jobs: timeout-minutes: 1 steps: # Get PR number for squash merges to main + - name: Get PR Number From Event + if: ${{ github.event_name == 'push' }} + id: pr_no + uses: bcgov-nr/action-get-pr@v0.0.1 - name: PR Number id: pr - uses: bcgov-nr/action-get-pr@v0.0.1 + run: echo pr=${{ steps.pr_no.outputs.pr || inputs.pr}} >> $GITHUB_OUTPUT deploys-test: - name: Deploys (test) + name: Deploys (Test) needs: [vars] - uses: ./.github/workflows/deploy.yml + uses: ./.github/workflows/test.yml secrets: inherit with: - autoscaling: true - environment: test - release: test tag: ${{ needs.vars.outputs.pr }} - params: | - --set-string global.license='c28f0c' \ - --set-string global.zone='test' \ - --set-string global.vault.role='nonprod' \ - --set-string global.vault.zone='test' \ - --set-string global.pr_num='${{ needs.vars.outputs.pr }}' \ - promote-images-test: name: Promote Images - Test @@ -69,57 +64,14 @@ jobs: target: ${{ needs.vars.outputs.pr }} tags: test #Promote images AFTER successful deploy - deploys-prod: - name: Deploys (prod) + release-please: + name: Release-Please needs: [promote-images-test, vars] - uses: ./.github/workflows/deploy.yml - secrets: inherit - with: - autoscaling: true - environment: prod - tag: ${{ needs.vars.outputs.pr }} - release: prod - params: | - --set-string global.license='c28f0c' \ - --set-string global.zone='prod' \ - --set-string global.vault.role='prod' \ - --set-string global.vault.zone='prod' \ - --set-string global.pr_num='${{ needs.vars.outputs.pr }}' \ - - promote-images-prod: - name: Promote Images - Prod - needs: [deploys-prod, vars] runs-on: ubuntu-22.04 - permissions: - packages: write - strategy: - matrix: - package: [dops, vehicles, frontend, scheduler, policy] timeout-minutes: 2 steps: - - uses: shrink/actions-docker-registry-tag@v4 + - uses: google-github-actions/release-please-action@v3 with: - registry: ghcr.io - repository: ${{ github.repository }}/${{ matrix.package }} - target: ${{ needs.vars.outputs.pr }} - tags: prod #Promote images AFTER successful deploy - - create-release: - name: Create release - runs-on: ubuntu-22.04 - needs: [deploys-prod, vars] - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - steps: - - name: Generate release tag - id: generate_release_tag - shell: bash - run: | - echo next_release_tag=$(expr $(echo $(curl https://api.github.com/repos/bcgov/onroutebc/releases/latest | grep tag_name | cut -d '-' -f3 - | cut -d '"' -f1 -) + 1)) >> $GITHUB_OUTPUT - - - name: Create Release - run: | - gh release create "${{ github.event.repository.name }}-release-${{ steps.generate_release_tag.outputs.next_release_tag }}" \ - --repo=${{ github.repository }} \ - --title="${{ github.event.repository.name }}-release-${{ steps.generate_release_tag.outputs.next_release_tag }}" \ - --generate-notes + release-type: simple + package-name: release-please-action + changelog-types: '[{"type":"ORV2","section":"Features","hidden":false},{"type":"feat","section":"Features","hidden":false},{"type":"fix","section":"Bug Fixes","hidden":false},{"type":"build","section":"Miscellaneous","hidden":false},{"type":"chore","section":"Miscellaneous","hidden":false},{"type":"ci","section":"Miscellaneous","hidden":false},{"type":"docs","section":"Miscellaneous","hidden":false},{"type":"perf","section":"Miscellaneous","hidden":false},{"type":"refactor","section":"Miscellaneous","hidden":false},{"type":"revert","section":"Miscellaneous","hidden":false},{"type":"style","section":"Miscellaneous","hidden":false},{"type":"test","section":"Miscellaneous","hidden":false}]' diff --git a/.github/workflows/pr-open.yml b/.github/workflows/pr-open.yml index b7961312d..ea34523c5 100644 --- a/.github/workflows/pr-open.yml +++ b/.github/workflows/pr-open.yml @@ -74,26 +74,10 @@ jobs: triggers: '${{ matrix.package }}/' #omit to build everything # https://github.com/bcgov-nr/action-deployer-openshift - deploys: - name: Deploys + deploys-dev: + name: Deploys (Dev) needs: [builds, vars] - uses: ./.github/workflows/deploy.yml + uses: ./.github/workflows/dev.yml secrets: inherit with: - autoscaling: false - repository: ${{ github.event.repository.name }} - environment: dev - release: ${{ needs.vars.outputs.pr }} tag: ${{ needs.vars.outputs.pr }} - triggers: '' #omit=always; - params: | - --set-string global.license='c28f0c' \ - --set-string global.zone='dev' \ - --set-string global.vault.role='nonprod' \ - --set-string global.vault.zone='dev' \ - --set-string global.pr_num='${{ needs.vars.outputs.pr }}' \ - --set-json dops.containers[0].resources='{"limits": {"cpu": "1000m", "memory": "2000Mi"}, "requests": {"cpu": "25m", "memory": "50Mi"}}' \ - --set-json frontend.containers[0].resources='{"limits": {"cpu": "75m", "memory": "150Mi"}, "requests": {"cpu": "25m", "memory": "50Mi"}}' \ - --set-json scheduler.containers[0].resources='{"limits": {"cpu": "75m", "memory": "150Mi"}, "requests": {"cpu": "25m", "memory": "50Mi"}}' \ - --set-json policy.containers[0].resources='{"limits": {"cpu": "75m", "memory": "150Mi"}, "requests": {"cpu": "25m", "memory": "50Mi"}}' \ - --set-json vehicles.containers[0].resources='{"limits": {"cpu": "300m", "memory": "500Mi"}, "requests": {"cpu": "200m", "memory": "400Mi"}}' \ diff --git a/.github/workflows/prod.yml b/.github/workflows/prod.yml new file mode 100644 index 000000000..f9da84bf7 --- /dev/null +++ b/.github/workflows/prod.yml @@ -0,0 +1,34 @@ +name: Deploy Prod + +on: + workflow_dispatch: + inputs: + tag: + description: "Image tag to deploy" + required: false + type: string + default: "prod" + workflow_call: + inputs: + tag: + description: "Image tag to deploy" + required: false + type: string + default: "prod" + +jobs: + deploys-prod: + name: Deploys (PROD) + uses: ./.github/workflows/deploy.yml + secrets: inherit + with: + autoscaling: true + environment: prod + tag: ${{ inputs.tag }} + release: prod + params: | + --set-string global.license='c28f0c' \ + --set-string global.zone='prod' \ + --set-string global.vault.role='prod' \ + --set-string global.vault.zone='prod' \ + --set-string global.pr_num='${{ inputs.tag }}' \ diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 000000000..01b4dd1b2 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,40 @@ +--- +name: Release + +on: + release: + types: [published] + workflow_dispatch: + +concurrency: + group: ${{ github.workflow }} + cancel-in-progress: true + +jobs: + vars: + name: Set Variables + outputs: + release-name: ${{ steps.release-name.outputs.release-name }} + runs-on: ubuntu-22.04 + timeout-minutes: 1 + steps: + - name: Release Name + id: release-name + run: | + echo release-name=$(curl https://api.github.com/repos/bcgov/onroutebc/releases/latest | jq -r .tag_name) >> $GITHUB_OUTPUT + + deploys-uat: + name: Deploys (Uat) + needs: [vars] + uses: ./.github/workflows/uat.yml + secrets: inherit + with: + tag: ${{ needs.vars.outputs.release-name }} + + deploys-prod: + name: Deploys (Prod) + needs: [deploys-uat, vars] + uses: ./.github/workflows/prod.yml + secrets: inherit + with: + tag: ${{ needs.vars.outputs.release-name }} diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 000000000..c9e5732fb --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,35 @@ +--- +name: Deploy Test + +on: + workflow_dispatch: + inputs: + tag: + description: "Image tag to deploy" + required: false + type: string + default: "test" + workflow_call: + inputs: + tag: + description: "Image tag to deploy" + required: false + type: string + default: "test" + +jobs: + deploy-test: + name: Deploys (TEST) + uses: ./.github/workflows/deploy.yml + secrets: inherit + with: + autoscaling: true + environment: test + release: test + tag: ${{ inputs.tag }} + params: | + --set-string global.license='c28f0c' \ + --set-string global.zone='test' \ + --set-string global.vault.role='nonprod' \ + --set-string global.vault.zone='test' \ + --set-string global.pr_num='${{ inputs.tag }}' \ diff --git a/.github/workflows/uat.yml b/.github/workflows/uat.yml index 7f4124713..84c7e8973 100644 --- a/.github/workflows/uat.yml +++ b/.github/workflows/uat.yml @@ -1,44 +1,35 @@ +--- name: Deploy UAT on: workflow_dispatch: inputs: - environment: - description: "Deployment environment - test --> vault secrets" - required: true - type: choice - options: ["test","tools"] + tag: + description: "Image tag to deploy" + required: false + type: string + default: "test" + workflow_call: + inputs: + tag: + description: "Image tag to deploy" + required: false + type: string default: "test" - -concurrency: - group: ${{ github.workflow }} - cancel-in-progress: true - jobs: - uninstall-uat: - name: Uninstall (uat) - environment: ${{inputs.environment}} - runs-on: ubuntu-22.04 - steps: - - name: uninstall - run: | - oc login --token=${{ secrets.oc_token }} --server=${{ secrets.oc_server }} - oc project ${{ secrets.OC_NAMESPACE }} # Safeguard! - helm uninstall onroutebc-uat || true deploy-uat: name: Deploys (UAT) uses: ./.github/workflows/deploy.yml - needs: uninstall-uat secrets: inherit with: autoscaling: true - environment: ${{inputs.environment}} - tag: "test" - release: "uat" + environment: uat + tag: ${{inputs.tag}} + release: uat params: | --set-string global.license='c28f0c' \ --set-string global.zone='test' \ --set-string global.vault.role='nonprod' \ --set-string global.vault.zone='uat' \ - --set-string global.pr_num='${{ needs.vars.outputs.pr }}' \ + --set-string global.pr_num='${{ inputs.tag }}' \ diff --git a/.gitignore b/.gitignore index 3d005313e..60755bffc 100644 --- a/.gitignore +++ b/.gitignore @@ -119,3 +119,4 @@ Chart.lock #Loadtest Results loadtests/results +loadtests/*/results From 1cbac3590e3550144e7adaadd4566139b7b323da Mon Sep 17 00:00:00 2001 From: cberg-aot <93226309+cberg-aot@users.noreply.github.com> Date: Mon, 23 Sep 2024 16:47:32 -0700 Subject: [PATCH 40/63] fix: moved release-please to its own file (#1608) --- .github/workflows/merge.yml | 12 ------ .github/workflows/release-please.yml | 29 ++++++++++++++ .github/workflows/release.yml | 57 +++++++++++++++++++++++++++- 3 files changed, 84 insertions(+), 14 deletions(-) create mode 100644 .github/workflows/release-please.yml diff --git a/.github/workflows/merge.yml b/.github/workflows/merge.yml index 611023eb3..01c9f8fd1 100644 --- a/.github/workflows/merge.yml +++ b/.github/workflows/merge.yml @@ -63,15 +63,3 @@ jobs: repository: ${{ github.repository }}/${{ matrix.package }} target: ${{ needs.vars.outputs.pr }} tags: test #Promote images AFTER successful deploy - - release-please: - name: Release-Please - needs: [promote-images-test, vars] - runs-on: ubuntu-22.04 - timeout-minutes: 2 - steps: - - uses: google-github-actions/release-please-action@v3 - with: - release-type: simple - package-name: release-please-action - changelog-types: '[{"type":"ORV2","section":"Features","hidden":false},{"type":"feat","section":"Features","hidden":false},{"type":"fix","section":"Bug Fixes","hidden":false},{"type":"build","section":"Miscellaneous","hidden":false},{"type":"chore","section":"Miscellaneous","hidden":false},{"type":"ci","section":"Miscellaneous","hidden":false},{"type":"docs","section":"Miscellaneous","hidden":false},{"type":"perf","section":"Miscellaneous","hidden":false},{"type":"refactor","section":"Miscellaneous","hidden":false},{"type":"revert","section":"Miscellaneous","hidden":false},{"type":"style","section":"Miscellaneous","hidden":false},{"type":"test","section":"Miscellaneous","hidden":false}]' diff --git a/.github/workflows/release-please.yml b/.github/workflows/release-please.yml new file mode 100644 index 000000000..ae1a0b28a --- /dev/null +++ b/.github/workflows/release-please.yml @@ -0,0 +1,29 @@ +--- +on: + push: + branches: [main] + paths-ignore: + - '*.md' + - '.github/**' + - 'common/graphics/**' + - '!.github/workflows/deploy.yml' + - '!.github/workflows/merge.yml' + +permissions: + contents: write + pull-requests: write + +name: release-please + +jobs: + vars: + release-please: + name: Release-Please + runs-on: ubuntu-22.04 + timeout-minutes: 2 + steps: + - uses: google-github-actions/release-please-action@v3 + with: + release-type: simple + package-name: release-please-action + changelog-types: '[{"type":"ORV2","section":"Features","hidden":false},{"type":"feat","section":"Features","hidden":false},{"type":"fix","section":"Bug Fixes","hidden":false},{"type":"build","section":"Miscellaneous","hidden":false},{"type":"chore","section":"Miscellaneous","hidden":false},{"type":"ci","section":"Miscellaneous","hidden":false},{"type":"docs","section":"Miscellaneous","hidden":false},{"type":"perf","section":"Miscellaneous","hidden":false},{"type":"refactor","section":"Miscellaneous","hidden":false},{"type":"revert","section":"Miscellaneous","hidden":false},{"type":"style","section":"Miscellaneous","hidden":false},{"type":"test","section":"Miscellaneous","hidden":false}]' diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 01b4dd1b2..d87fce2cf 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -22,19 +22,72 @@ jobs: id: release-name run: | echo release-name=$(curl https://api.github.com/repos/bcgov/onroutebc/releases/latest | jq -r .tag_name) >> $GITHUB_OUTPUT + promote-images-release: + name: Promote Images - Release + needs: [vars] + runs-on: ubuntu-22.04 + permissions: + packages: write + strategy: + matrix: + package: [dops, vehicles, frontend, scheduler, policy] + timeout-minutes: 2 + steps: + - uses: shrink/actions-docker-registry-tag@v4 + with: + registry: ghcr.io + repository: ${{ github.repository }}/${{ matrix.package }} + target: test + tags: ${{ needs.vars.outputs.release-name }} deploys-uat: name: Deploys (Uat) - needs: [vars] + needs: [vars,promote-images-release] uses: ./.github/workflows/uat.yml secrets: inherit with: tag: ${{ needs.vars.outputs.release-name }} + promote-images-uat: + name: Promote Images - Uat + needs: [vars,deploys-uat] + runs-on: ubuntu-22.04 + permissions: + packages: write + strategy: + matrix: + package: [dops, vehicles, frontend, scheduler, policy] + timeout-minutes: 2 + steps: + - uses: shrink/actions-docker-registry-tag@v4 + with: + registry: ghcr.io + repository: ${{ github.repository }}/${{ matrix.package }} + target: ${{ needs.vars.outputs.release-name }} + tags: uat + deploys-prod: name: Deploys (Prod) - needs: [deploys-uat, vars] + needs: [vars,promote-images-uat] uses: ./.github/workflows/prod.yml secrets: inherit with: tag: ${{ needs.vars.outputs.release-name }} + + promote-images-prod: + name: Promote Images - Prod + needs: [vars,deploys-prod] + runs-on: ubuntu-22.04 + permissions: + packages: write + strategy: + matrix: + package: [dops, vehicles, frontend, scheduler, policy] + timeout-minutes: 2 + steps: + - uses: shrink/actions-docker-registry-tag@v4 + with: + registry: ghcr.io + repository: ${{ github.repository }}/${{ matrix.package }} + target: uat + tags: prod From a846d538e9666bb95b6e47324e3887fe1a668897 Mon Sep 17 00:00:00 2001 From: cberg-aot <93226309+cberg-aot@users.noreply.github.com> Date: Mon, 23 Sep 2024 16:54:15 -0700 Subject: [PATCH 41/63] fix: removed vars from release-please.yml (#1609) --- .github/workflows/release-please.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/release-please.yml b/.github/workflows/release-please.yml index ae1a0b28a..693e8dcb4 100644 --- a/.github/workflows/release-please.yml +++ b/.github/workflows/release-please.yml @@ -16,7 +16,6 @@ permissions: name: release-please jobs: - vars: release-please: name: Release-Please runs-on: ubuntu-22.04 From 854d6e3d258c04d0faa738dfe03b1f3a0873bb67 Mon Sep 17 00:00:00 2001 From: cberg-aot <93226309+cberg-aot@users.noreply.github.com> Date: Mon, 23 Sep 2024 17:06:30 -0700 Subject: [PATCH 42/63] Fix/release please 3 (#1610) --- .github/workflows/release-please.yml | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/.github/workflows/release-please.yml b/.github/workflows/release-please.yml index 693e8dcb4..ee63f3966 100644 --- a/.github/workflows/release-please.yml +++ b/.github/workflows/release-please.yml @@ -1,19 +1,14 @@ --- +name: release-please + on: push: branches: [main] - paths-ignore: - - '*.md' - - '.github/**' - - 'common/graphics/**' - - '!.github/workflows/deploy.yml' - - '!.github/workflows/merge.yml' permissions: contents: write pull-requests: write -name: release-please jobs: release-please: From 5986a0e424c0de64266ce0442a7620db61203bf0 Mon Sep 17 00:00:00 2001 From: cberg-aot <93226309+cberg-aot@users.noreply.github.com> Date: Tue, 24 Sep 2024 11:25:05 -0700 Subject: [PATCH 43/63] feat: removed release-please (#1613) --- .github/workflows/release-please.yml | 23 ----------------------- 1 file changed, 23 deletions(-) delete mode 100644 .github/workflows/release-please.yml diff --git a/.github/workflows/release-please.yml b/.github/workflows/release-please.yml deleted file mode 100644 index ee63f3966..000000000 --- a/.github/workflows/release-please.yml +++ /dev/null @@ -1,23 +0,0 @@ ---- -name: release-please - -on: - push: - branches: [main] - -permissions: - contents: write - pull-requests: write - - -jobs: - release-please: - name: Release-Please - runs-on: ubuntu-22.04 - timeout-minutes: 2 - steps: - - uses: google-github-actions/release-please-action@v3 - with: - release-type: simple - package-name: release-please-action - changelog-types: '[{"type":"ORV2","section":"Features","hidden":false},{"type":"feat","section":"Features","hidden":false},{"type":"fix","section":"Bug Fixes","hidden":false},{"type":"build","section":"Miscellaneous","hidden":false},{"type":"chore","section":"Miscellaneous","hidden":false},{"type":"ci","section":"Miscellaneous","hidden":false},{"type":"docs","section":"Miscellaneous","hidden":false},{"type":"perf","section":"Miscellaneous","hidden":false},{"type":"refactor","section":"Miscellaneous","hidden":false},{"type":"revert","section":"Miscellaneous","hidden":false},{"type":"style","section":"Miscellaneous","hidden":false},{"type":"test","section":"Miscellaneous","hidden":false}]' From 3fc25ed181db6910bca21536dcd1cd5d9c18ae38 Mon Sep 17 00:00:00 2001 From: Praveen Raju <80779423+praju-aot@users.noreply.github.com> Date: Tue, 24 Sep 2024 14:44:26 -0400 Subject: [PATCH 44/63] ORV2-2693 Add STOS permit templates to OnRouteBC (#1612) --- .../versions/revert/v_43_ddl_revert.sql | 31 ++++++++++ database/mssql/scripts/versions/v_43_ddl.sql | 60 +++++++++++++++++++ database/mssql/test/versions/v_43_1_test.sql | 5 ++ database/mssql/test/versions/v_43_2_test.sql | 6 ++ database/mssql/test/versions/v_43_test.sh | 24 ++++++++ dops/src/enum/template-name.enum.ts | 3 + .../src/common/enum/template-name.enum.ts | 12 ++++ vehicles/src/common/helper/template.helper.ts | 45 ++++++++++++++ .../interface/permit.template.interface.ts | 7 ++- .../permit-receipt-document.service.ts | 20 ++----- 10 files changed, 197 insertions(+), 16 deletions(-) create mode 100644 database/mssql/scripts/versions/revert/v_43_ddl_revert.sql create mode 100644 database/mssql/scripts/versions/v_43_ddl.sql create mode 100644 database/mssql/test/versions/v_43_1_test.sql create mode 100644 database/mssql/test/versions/v_43_2_test.sql create mode 100644 database/mssql/test/versions/v_43_test.sh create mode 100644 vehicles/src/common/helper/template.helper.ts diff --git a/database/mssql/scripts/versions/revert/v_43_ddl_revert.sql b/database/mssql/scripts/versions/revert/v_43_ddl_revert.sql new file mode 100644 index 000000000..7b9e1821d --- /dev/null +++ b/database/mssql/scripts/versions/revert/v_43_ddl_revert.sql @@ -0,0 +1,31 @@ +SET ANSI_NULLS ON +GO +SET QUOTED_IDENTIFIER ON +GO +SET NOCOUNT ON +GO + +SET XACT_ABORT ON + +BEGIN TRY + BEGIN TRANSACTION + + DELETE [dops].[ORBC_DOCUMENT_TEMPLATE] WHERE DOCUMENT_ID IN (SELECT ID FROM [dops].[ORBC_DOCUMENT] WHERE FILE_NAME='stos-template-v1.docx') + DELETE [dops].[ORBC_DOCUMENT_TEMPLATE] WHERE DOCUMENT_ID IN (SELECT ID FROM [dops].[ORBC_DOCUMENT] WHERE FILE_NAME='stos-void-template-v1.docx') + DELETE [dops].[ORBC_DOCUMENT_TEMPLATE] WHERE DOCUMENT_ID IN (SELECT ID FROM [dops].[ORBC_DOCUMENT] WHERE FILE_NAME='stos-revoked-template-v1.docx') + DELETE [dops].[ORBC_DOCUMENT] WHERE FILE_NAME='stos-template-v1.docx' + DELETE [dops].[ORBC_DOCUMENT] WHERE FILE_NAME='stos-void-template-v1.docx' + DELETE [dops].[ORBC_DOCUMENT] WHERE FILE_NAME='stos-revoked-template-v1.docx' + COMMIT +END TRY + +BEGIN CATCH + IF @@TRANCOUNT > 0 + ROLLBACK; + THROW +END CATCH + +DECLARE @VersionDescription VARCHAR(255) +SET @VersionDescription = 'Revert STOS templates' + +INSERT [dbo].[ORBC_SYS_VERSION] ([VERSION_ID], [DESCRIPTION], [RELEASE_DATE]) VALUES (42, @VersionDescription, getutcdate()) diff --git a/database/mssql/scripts/versions/v_43_ddl.sql b/database/mssql/scripts/versions/v_43_ddl.sql new file mode 100644 index 000000000..c2a32b2a8 --- /dev/null +++ b/database/mssql/scripts/versions/v_43_ddl.sql @@ -0,0 +1,60 @@ +SET ANSI_NULLS ON +GO +SET QUOTED_IDENTIFIER ON +GO +SET NOCOUNT ON +GO + +SET XACT_ABORT ON +GO +SET TRANSACTION ISOLATION LEVEL SERIALIZABLE +GO +BEGIN TRANSACTION +GO + +IF @@ERROR <> 0 SET NOEXEC ON +GO +INSERT [dops].[ORBC_DOCUMENT] ( [S3_OBJECT_ID], [S3_VERSION_ID], [S3_LOCATION], [OBJECT_MIME_TYPE], [FILE_NAME], [DMS_VERSION_ID], [CONCURRENCY_CONTROL_NUMBER], [DB_CREATE_USERID], [DB_CREATE_TIMESTAMP], [DB_LAST_UPDATE_USERID], [DB_LAST_UPDATE_TIMESTAMP]) VALUES ( N'273C4D93-544E-471B-ACB6-D79E51BE78DA', NULL, N'https://moti-int.objectstore.gov.bc.ca/tran_api_orbc_docs_dev/tran_api_orbc_docs_dev%40moti-int.objectstore.gov.bc.ca/273c4d93-544e-471b-acb6-d79e51be78da', N'application/vnd.openxmlformats-officedocument.wordprocessingml.document',N'stos-template-v1.docx',1, 1, N'dops', GETUTCDATE(), N'dops', GETUTCDATE()) + +IF @@ERROR <> 0 SET NOEXEC ON +GO +INSERT [dops].[ORBC_DOCUMENT] ( [S3_OBJECT_ID], [S3_VERSION_ID], [S3_LOCATION], [OBJECT_MIME_TYPE], [FILE_NAME], [DMS_VERSION_ID], [CONCURRENCY_CONTROL_NUMBER], [DB_CREATE_USERID], [DB_CREATE_TIMESTAMP], [DB_LAST_UPDATE_USERID], [DB_LAST_UPDATE_TIMESTAMP]) VALUES ( N'E28B476E-361E-45A8-A9A5-384C7F4CB8D8', NULL, N'https://moti-int.objectstore.gov.bc.ca/tran_api_orbc_docs_dev/tran_api_orbc_docs_dev%40moti-int.objectstore.gov.bc.ca/e28b476e-361e-45a8-a9a5-384c7f4cb8d8', N'application/vnd.openxmlformats-officedocument.wordprocessingml.document',N'stos-void-template-v1.docx',1, 1, N'dops', GETUTCDATE(), N'dops', GETUTCDATE()) + +IF @@ERROR <> 0 SET NOEXEC ON +GO +INSERT [dops].[ORBC_DOCUMENT] ( [S3_OBJECT_ID], [S3_VERSION_ID], [S3_LOCATION], [OBJECT_MIME_TYPE], [FILE_NAME], [DMS_VERSION_ID], [CONCURRENCY_CONTROL_NUMBER], [DB_CREATE_USERID], [DB_CREATE_TIMESTAMP], [DB_LAST_UPDATE_USERID], [DB_LAST_UPDATE_TIMESTAMP]) VALUES ( N'F5BAD4DC-A1AE-4ABF-98DC-17874871F882', NULL, N'https://moti-int.objectstore.gov.bc.ca/tran_api_orbc_docs_dev/tran_api_orbc_docs_dev%40moti-int.objectstore.gov.bc.ca/f5bad4dc-a1ae-4abf-98dc-17874871f882', N'application/vnd.openxmlformats-officedocument.wordprocessingml.document',N'stos-revoked-template-v1.docx',1, 1, N'dops', GETUTCDATE(), N'dops', GETUTCDATE()) + +IF @@ERROR <> 0 SET NOEXEC ON +GO +INSERT [dops].[ORBC_DOCUMENT_TEMPLATE] ( [TEMPLATE_NAME], [TEMPLATE_VERSION], [DOCUMENT_ID], [CONCURRENCY_CONTROL_NUMBER], [DB_CREATE_USERID], [DB_CREATE_TIMESTAMP], [DB_LAST_UPDATE_USERID], [DB_LAST_UPDATE_TIMESTAMP]) VALUES ( N'PERMIT_STOS', 1, (SELECT ID FROM [dops].[ORBC_DOCUMENT] WHERE FILE_NAME='stos-template-v1.docx'), 1, N'dops', GETUTCDATE(), N'dops', GETUTCDATE()) +IF @@ERROR <> 0 SET NOEXEC ON +GO +INSERT [dops].[ORBC_DOCUMENT_TEMPLATE] ( [TEMPLATE_NAME], [TEMPLATE_VERSION], [DOCUMENT_ID], [CONCURRENCY_CONTROL_NUMBER], [DB_CREATE_USERID], [DB_CREATE_TIMESTAMP], [DB_LAST_UPDATE_USERID], [DB_LAST_UPDATE_TIMESTAMP]) VALUES ( N'PERMIT_STOS_VOID', 1, (SELECT ID FROM [dops].[ORBC_DOCUMENT] WHERE FILE_NAME='stos-void-template-v1.docx'), 1, N'dops', GETUTCDATE(), N'dops', GETUTCDATE()) +IF @@ERROR <> 0 SET NOEXEC ON +GO +INSERT [dops].[ORBC_DOCUMENT_TEMPLATE] ( [TEMPLATE_NAME], [TEMPLATE_VERSION], [DOCUMENT_ID], [CONCURRENCY_CONTROL_NUMBER], [DB_CREATE_USERID], [DB_CREATE_TIMESTAMP], [DB_LAST_UPDATE_USERID], [DB_LAST_UPDATE_TIMESTAMP]) VALUES ( N'PERMIT_STOS_REVOKED', 1, (SELECT ID FROM [dops].[ORBC_DOCUMENT] WHERE FILE_NAME='stos-revoked-template-v1.docx'), 1, N'dops', GETUTCDATE(), N'dops', GETUTCDATE()) + +IF @@ERROR <> 0 SET NOEXEC ON +GO + +DECLARE @VersionDescription VARCHAR(255) +SET @VersionDescription = 'STOS permit templates.' + +INSERT [dbo].[ORBC_SYS_VERSION] ([VERSION_ID], [DESCRIPTION], [UPDATE_SCRIPT], [REVERT_SCRIPT], [RELEASE_DATE]) VALUES (43, @VersionDescription, '$(UPDATE_SCRIPT)', '$(REVERT_SCRIPT)', getutcdate()) +IF @@ERROR <> 0 SET NOEXEC ON +GO + +COMMIT TRANSACTION +GO +IF @@ERROR <> 0 SET NOEXEC ON +GO +DECLARE @Success AS BIT +SET @Success = 1 +SET NOEXEC OFF +IF (@Success = 1) PRINT 'The database update succeeded' +ELSE BEGIN + IF @@TRANCOUNT > 0 ROLLBACK TRANSACTION + PRINT 'The database update failed' +END +GO + diff --git a/database/mssql/test/versions/v_43_1_test.sql b/database/mssql/test/versions/v_43_1_test.sql new file mode 100644 index 000000000..92807f1ed --- /dev/null +++ b/database/mssql/test/versions/v_43_1_test.sql @@ -0,0 +1,5 @@ +-- Test that the permit template have been configured correctly +SET NOCOUNT ON + +SELECT COUNT(*) FROM $(DB_NAME).[dops].[ORBC_DOCUMENT_TEMPLATE] +WHERE TEMPLATE_NAME IN ('PERMIT','PERMIT_STOS_VOID','PERMIT_STOS_REVOKED') \ No newline at end of file diff --git a/database/mssql/test/versions/v_43_2_test.sql b/database/mssql/test/versions/v_43_2_test.sql new file mode 100644 index 000000000..a31775ab7 --- /dev/null +++ b/database/mssql/test/versions/v_43_2_test.sql @@ -0,0 +1,6 @@ +-- Test that the permit template have been configured correctly +SET NOCOUNT ON + +SELECT COUNT(*) FROM $(DB_NAME).[dops].[ORBC_DOCUMENT] +WHERE ID IN (SELECT DOCUMENT_ID FROM $(DB_NAME).[dops].[ORBC_DOCUMENT_TEMPLATE] +WHERE TEMPLATE_NAME IN ('PERMIT','PERMIT_STOS_VOID','PERMIT_STOS_REVOKED')) \ No newline at end of file diff --git a/database/mssql/test/versions/v_43_test.sh b/database/mssql/test/versions/v_43_test.sh new file mode 100644 index 000000000..867f594cb --- /dev/null +++ b/database/mssql/test/versions/v_43_test.sh @@ -0,0 +1,24 @@ +#!/bin/bash + +# Retrieve arguments +source ${SCRIPT_DIR}/utility/getopt.sh +USAGE="-u USER -p PASS -s SERVER -d DATABASE" +parse_options "${USAGE}" ${@} + +# All database tests for database version 43 are run from this shell script. +# TESTS_DIR variable set by the calling test-runner script. + +TEST_43_1_RESULT=$(/opt/mssql-tools/bin/sqlcmd -U ${USER} -P "${PASS}" -S ${SERVER} -v DB_NAME=${DATABASE} -h -1 -i ${TESTS_DIR}/v_43_1_test.sql | xargs) +if [[ $TEST_43_1_RESULT -eq 3 ]]; then + echo "Test 43.1 passed: STOS templates setup successfully in ORBC_DOCUMENT_TEMPLATE" +else + echo "******** Test 43.1 failed: Failed to setup STOS permit templates" +fi + + +TEST_43_2_RESULT=$(/opt/mssql-tools/bin/sqlcmd -U ${USER} -P "${PASS}" -S ${SERVER} -v DB_NAME=${DATABASE} -h -1 -i ${TESTS_DIR}/v_43_2_test.sql | xargs) +if [[ $TEST_43_2_RESULT -eq 3 ]]; then + echo "Test 43.2 passed: STOS templates setup successfully in ORBC_DOCUMENT" +else + echo "******** Test 43.2 failed: Failed to setup STOS permit templates" +fi \ No newline at end of file diff --git a/dops/src/enum/template-name.enum.ts b/dops/src/enum/template-name.enum.ts index dbab6861b..d04f110f2 100644 --- a/dops/src/enum/template-name.enum.ts +++ b/dops/src/enum/template-name.enum.ts @@ -3,4 +3,7 @@ export enum TemplateName { PAYMENT_RECEIPT = 'PAYMENT_RECEIPT', PERMIT_VOID = 'PERMIT_VOID', PERMIT_REVOKED = 'PERMIT_REVOKED', + PERMIT_STOS = 'PERMIT_STOS', + PERMIT_STOS_VOID = 'PERMIT_STOS_VOID', + PERMIT_STOS_REVOKED = 'PERMIT_STOS_REVOKED', } diff --git a/vehicles/src/common/enum/template-name.enum.ts b/vehicles/src/common/enum/template-name.enum.ts index dbab6861b..d29aa5e0c 100644 --- a/vehicles/src/common/enum/template-name.enum.ts +++ b/vehicles/src/common/enum/template-name.enum.ts @@ -1,6 +1,18 @@ +import { ApplicationStatus } from './application-status.enum'; +import { PermitType } from './permit-type.enum'; + export enum TemplateName { PERMIT = 'PERMIT', PAYMENT_RECEIPT = 'PAYMENT_RECEIPT', PERMIT_VOID = 'PERMIT_VOID', PERMIT_REVOKED = 'PERMIT_REVOKED', + PERMIT_STOS = 'PERMIT_STOS', + PERMIT_STOS_VOID = 'PERMIT_STOS_VOID', + PERMIT_STOS_REVOKED = 'PERMIT_STOS_REVOKED', } + +export type PermitTemplateMapping = { + [K in ApplicationStatus]?: { + [T in PermitType | 'default']?: TemplateName; + }; +}; diff --git a/vehicles/src/common/helper/template.helper.ts b/vehicles/src/common/helper/template.helper.ts new file mode 100644 index 000000000..60fa26d83 --- /dev/null +++ b/vehicles/src/common/helper/template.helper.ts @@ -0,0 +1,45 @@ +import { InternalServerErrorException } from '@nestjs/common'; +import { ApplicationStatus } from '../enum/application-status.enum'; +import { PermitType } from '../enum/permit-type.enum'; +import { + PermitTemplateMapping, + TemplateName, +} from '../enum/template-name.enum'; + +/** + * Returns the appropriate template name based on the provided application status and permit type. + * Throws an error if the combination of status and type does not yield a valid template. + * + * @param {ApplicationStatus} status - The status of the application for which the template is required. + * @param {PermitType} type - The type of permit for which the template is required. + * @returns {TemplateName} - The template name corresponding to the status and type provided. + * @throws {InternalServerErrorException} - If no valid template is found for the given status. + */ +export const getPermitTemplateName = ( + status: ApplicationStatus, + type: PermitType, +): TemplateName => { + const templateMapping: PermitTemplateMapping = { + [ApplicationStatus.ISSUED]: { + [PermitType.SINGLE_TRIP_OVERSIZE]: TemplateName.PERMIT_STOS, + default: TemplateName.PERMIT, + }, + [ApplicationStatus.VOIDED]: { + [PermitType.SINGLE_TRIP_OVERSIZE]: TemplateName.PERMIT_STOS_VOID, + default: TemplateName.PERMIT_VOID, + }, + [ApplicationStatus.REVOKED]: { + [PermitType.SINGLE_TRIP_OVERSIZE]: TemplateName.PERMIT_STOS_REVOKED, + default: TemplateName.PERMIT_REVOKED, + }, + }; + + const template = + templateMapping[status]?.[type] || templateMapping[status]?.default; + if (!template) { + throw new InternalServerErrorException( + 'Invalid status for document generation', + ); + } + return template; +}; diff --git a/vehicles/src/common/interface/permit.template.interface.ts b/vehicles/src/common/interface/permit.template.interface.ts index ccc551f80..8ac315da7 100644 --- a/vehicles/src/common/interface/permit.template.interface.ts +++ b/vehicles/src/common/interface/permit.template.interface.ts @@ -33,7 +33,7 @@ export interface PermitData { clientNumber: string; vehicleConfiguration?: VehicleConfiguration; applicationNotes?: string; - permittedCommodity?: string; + permittedCommodity?: PermittedCommodity; permittedRoute?: PermittedRoute; } @@ -51,6 +51,11 @@ interface PermittedRoute { manualRoute: ManualRoute; } +interface PermittedCommodity { + commodityType: string; + loadDescription: string; +} + interface ManualRoute { origin: string; destination: string; diff --git a/vehicles/src/modules/permit-application-payment/permit-receipt-document/permit-receipt-document.service.ts b/vehicles/src/modules/permit-application-payment/permit-receipt-document/permit-receipt-document.service.ts index 68396c76b..7e4d2d550 100644 --- a/vehicles/src/modules/permit-application-payment/permit-receipt-document/permit-receipt-document.service.ts +++ b/vehicles/src/modules/permit-application-payment/permit-receipt-document/permit-receipt-document.service.ts @@ -39,6 +39,7 @@ import { generateFaxEmail, validateEmailandFaxList, } from '../../../common/helper/notification.helper'; +import { getPermitTemplateName } from '../../../common/helper/template.helper'; @Injectable() export class PermitReceiptDocumentService { @@ -275,21 +276,10 @@ export class PermitReceiptDocumentService { ); const dopsRequestData = { - templateName: (() => { - switch (fetchedPermit.permitStatus) { - case ApplicationStatus.ISSUED: - return TemplateName.PERMIT; - case ApplicationStatus.VOIDED: - return TemplateName.PERMIT_VOID; - case ApplicationStatus.REVOKED: - return TemplateName.PERMIT_REVOKED; - default: - // Handle the default case here, for example: - throw new InternalServerErrorException( - 'Invalid status for document generation', - ); - } - })(), + templateName: getPermitTemplateName( + fetchedPermit?.permitStatus, + fetchedPermit?.permitType, + ), generatedDocumentFileName: permitDataForTemplate.permitNumber, templateData: permitDataForTemplate, documentsToMerge: permitDataForTemplate.permitData.commodities.map( From 5d58f53fb448f76fdf6b691dac2146bbdc399dc0 Mon Sep 17 00:00:00 2001 From: cberg-aot <93226309+cberg-aot@users.noreply.github.com> Date: Tue, 24 Sep 2024 14:12:04 -0700 Subject: [PATCH 45/63] feat: removed release-please (#1614) From 62d6e897771e27899d2febfa48417b741d3f66c7 Mon Sep 17 00:00:00 2001 From: cberg-aot <93226309+cberg-aot@users.noreply.github.com> Date: Tue, 24 Sep 2024 16:25:12 -0700 Subject: [PATCH 46/63] feat: Release events now should continue pipeline via pr (#1615) --- .github/workflows/release.yml | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index d87fce2cf..2c7368475 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -5,6 +5,11 @@ on: release: types: [published] workflow_dispatch: + inputs: + pr: + description: "PR num of image to deploy" + required: false + type: string concurrency: group: ${{ github.workflow }} @@ -14,14 +19,23 @@ jobs: vars: name: Set Variables outputs: - release-name: ${{ steps.release-name.outputs.release-name }} + pr: ${{ steps.pr.outputs.pr }} runs-on: ubuntu-22.04 timeout-minutes: 1 steps: + # Get PR number for squash merges to main + - name: Get PR Number From Event + if: ${{ github.event_name == 'release' }} + id: pr_no + uses: bcgov-nr/action-get-pr@v0.0.1 + - name: PR Number + id: pr + run: echo pr=${{ steps.pr_no.outputs.pr || inputs.pr}} >> $GITHUB_OUTPUT - name: Release Name id: release-name run: | echo release-name=$(curl https://api.github.com/repos/bcgov/onroutebc/releases/latest | jq -r .tag_name) >> $GITHUB_OUTPUT + promote-images-release: name: Promote Images - Release needs: [vars] @@ -37,7 +51,7 @@ jobs: with: registry: ghcr.io repository: ${{ github.repository }}/${{ matrix.package }} - target: test + target: ${{ needs.vars.outputs.pr }} tags: ${{ needs.vars.outputs.release-name }} deploys-uat: @@ -46,7 +60,7 @@ jobs: uses: ./.github/workflows/uat.yml secrets: inherit with: - tag: ${{ needs.vars.outputs.release-name }} + tag: ${{ needs.vars.outputs.pr }} promote-images-uat: name: Promote Images - Uat @@ -63,7 +77,7 @@ jobs: with: registry: ghcr.io repository: ${{ github.repository }}/${{ matrix.package }} - target: ${{ needs.vars.outputs.release-name }} + target: ${{ needs.vars.outputs.pr }} tags: uat deploys-prod: @@ -72,7 +86,7 @@ jobs: uses: ./.github/workflows/prod.yml secrets: inherit with: - tag: ${{ needs.vars.outputs.release-name }} + tag: ${{ needs.vars.outputs.pr }} promote-images-prod: name: Promote Images - Prod @@ -89,5 +103,5 @@ jobs: with: registry: ghcr.io repository: ${{ github.repository }}/${{ matrix.package }} - target: uat + target: ${{ needs.vars.outputs.pr }} tags: prod From 1bb6ece68bf86a2c9f506350c5542b92e78386a5 Mon Sep 17 00:00:00 2001 From: cberg-aot <93226309+cberg-aot@users.noreply.github.com> Date: Tue, 24 Sep 2024 16:49:36 -0700 Subject: [PATCH 47/63] Fix/release event add pr (#1616) --- .github/workflows/merge.yml | 3 --- .github/workflows/release.yml | 2 +- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/.github/workflows/merge.yml b/.github/workflows/merge.yml index 01c9f8fd1..97ce93ebb 100644 --- a/.github/workflows/merge.yml +++ b/.github/workflows/merge.yml @@ -5,10 +5,7 @@ on: branches: [main] paths-ignore: - '*.md' - - '.github/**' - 'common/graphics/**' - - '!.github/workflows/deploy.yml' - - '!.github/workflows/merge.yml' workflow_dispatch: inputs: pr: diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 2c7368475..90c3f905f 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -27,7 +27,7 @@ jobs: - name: Get PR Number From Event if: ${{ github.event_name == 'release' }} id: pr_no - uses: bcgov-nr/action-get-pr@v0.0.1 + uses: bcgov-nr/action-get-pr@main - name: PR Number id: pr run: echo pr=${{ steps.pr_no.outputs.pr || inputs.pr}} >> $GITHUB_OUTPUT From af4046a72e554cbb70be64f005229dc97176954c Mon Sep 17 00:00:00 2001 From: Praveen Raju <80779423+praju-aot@users.noreply.github.com> Date: Wed, 25 Sep 2024 11:23:42 -0400 Subject: [PATCH 48/63] ORV2-2693 Add License GVW to permitData (#1618) --- vehicles/src/common/interface/permit.template.interface.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/vehicles/src/common/interface/permit.template.interface.ts b/vehicles/src/common/interface/permit.template.interface.ts index 8ac315da7..baf7db1f7 100644 --- a/vehicles/src/common/interface/permit.template.interface.ts +++ b/vehicles/src/common/interface/permit.template.interface.ts @@ -92,6 +92,7 @@ interface VehicleDetails { provinceCode: string; vehicleType: string; vehicleSubType: string; + licensedGVW?: number; saveVehicle?: boolean; } From 7a637035dc644f132e29f42ac9ae6d2cb253f1ea Mon Sep 17 00:00:00 2001 From: cberg-aot <93226309+cberg-aot@users.noreply.github.com> Date: Wed, 25 Sep 2024 09:28:26 -0700 Subject: [PATCH 49/63] fix: removing release events due to pr data not in event (#1617) --- .github/workflows/release.yml | 25 ++++++------------------- 1 file changed, 6 insertions(+), 19 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 90c3f905f..1665ec400 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -5,11 +5,6 @@ on: release: types: [published] workflow_dispatch: - inputs: - pr: - description: "PR num of image to deploy" - required: false - type: string concurrency: group: ${{ github.workflow }} @@ -19,18 +14,10 @@ jobs: vars: name: Set Variables outputs: - pr: ${{ steps.pr.outputs.pr }} + release-name: ${{ steps.release-name.outputs.release-name }} runs-on: ubuntu-22.04 timeout-minutes: 1 steps: - # Get PR number for squash merges to main - - name: Get PR Number From Event - if: ${{ github.event_name == 'release' }} - id: pr_no - uses: bcgov-nr/action-get-pr@main - - name: PR Number - id: pr - run: echo pr=${{ steps.pr_no.outputs.pr || inputs.pr}} >> $GITHUB_OUTPUT - name: Release Name id: release-name run: | @@ -51,7 +38,7 @@ jobs: with: registry: ghcr.io repository: ${{ github.repository }}/${{ matrix.package }} - target: ${{ needs.vars.outputs.pr }} + target: test tags: ${{ needs.vars.outputs.release-name }} deploys-uat: @@ -60,7 +47,7 @@ jobs: uses: ./.github/workflows/uat.yml secrets: inherit with: - tag: ${{ needs.vars.outputs.pr }} + tag: ${{ needs.vars.outputs.release-name }} promote-images-uat: name: Promote Images - Uat @@ -77,7 +64,7 @@ jobs: with: registry: ghcr.io repository: ${{ github.repository }}/${{ matrix.package }} - target: ${{ needs.vars.outputs.pr }} + target: ${{ needs.vars.outputs.release-name }} tags: uat deploys-prod: @@ -86,7 +73,7 @@ jobs: uses: ./.github/workflows/prod.yml secrets: inherit with: - tag: ${{ needs.vars.outputs.pr }} + tag: ${{ needs.vars.outputs.release-name }} promote-images-prod: name: Promote Images - Prod @@ -103,5 +90,5 @@ jobs: with: registry: ghcr.io repository: ${{ github.repository }}/${{ matrix.package }} - target: ${{ needs.vars.outputs.pr }} + target: ${{ needs.vars.outputs.release-name }} tags: prod From 945a352d37391cc46e481a3fff5880b948acb96a Mon Sep 17 00:00:00 2001 From: Praveen Raju <80779423+praju-aot@users.noreply.github.com> Date: Wed, 25 Sep 2024 12:39:20 -0400 Subject: [PATCH 50/63] feature: ORV2-2841 MFP Permit Template and BE changes (#1619) --- .../versions/revert/v_44_ddl_revert.sql | 31 ++++++++++ database/mssql/scripts/versions/v_44_ddl.sql | 60 +++++++++++++++++++ database/mssql/test/versions/v_44_1_test.sql | 5 ++ database/mssql/test/versions/v_44_2_test.sql | 6 ++ database/mssql/test/versions/v_44_test.sh | 24 ++++++++ dops/src/enum/template-name.enum.ts | 3 + .../src/common/enum/template-name.enum.ts | 3 + vehicles/src/common/helper/template.helper.ts | 3 + .../interface/permit.template.interface.ts | 4 +- 9 files changed, 138 insertions(+), 1 deletion(-) create mode 100644 database/mssql/scripts/versions/revert/v_44_ddl_revert.sql create mode 100644 database/mssql/scripts/versions/v_44_ddl.sql create mode 100644 database/mssql/test/versions/v_44_1_test.sql create mode 100644 database/mssql/test/versions/v_44_2_test.sql create mode 100644 database/mssql/test/versions/v_44_test.sh diff --git a/database/mssql/scripts/versions/revert/v_44_ddl_revert.sql b/database/mssql/scripts/versions/revert/v_44_ddl_revert.sql new file mode 100644 index 000000000..6e9114396 --- /dev/null +++ b/database/mssql/scripts/versions/revert/v_44_ddl_revert.sql @@ -0,0 +1,31 @@ +SET ANSI_NULLS ON +GO +SET QUOTED_IDENTIFIER ON +GO +SET NOCOUNT ON +GO + +SET XACT_ABORT ON + +BEGIN TRY + BEGIN TRANSACTION + + DELETE [dops].[ORBC_DOCUMENT_TEMPLATE] WHERE DOCUMENT_ID IN (SELECT ID FROM [dops].[ORBC_DOCUMENT] WHERE FILE_NAME='mfp-template-v1.docx') + DELETE [dops].[ORBC_DOCUMENT_TEMPLATE] WHERE DOCUMENT_ID IN (SELECT ID FROM [dops].[ORBC_DOCUMENT] WHERE FILE_NAME='mfp-void-template-v1.docx') + DELETE [dops].[ORBC_DOCUMENT_TEMPLATE] WHERE DOCUMENT_ID IN (SELECT ID FROM [dops].[ORBC_DOCUMENT] WHERE FILE_NAME='mfp-revoked-template-v1.docx') + DELETE [dops].[ORBC_DOCUMENT] WHERE FILE_NAME='mfp-template-v1.docx' + DELETE [dops].[ORBC_DOCUMENT] WHERE FILE_NAME='mfp-void-template-v1.docx' + DELETE [dops].[ORBC_DOCUMENT] WHERE FILE_NAME='mfp-revoked-template-v1.docx' + COMMIT +END TRY + +BEGIN CATCH + IF @@TRANCOUNT > 0 + ROLLBACK; + THROW +END CATCH + +DECLARE @VersionDescription VARCHAR(255) +SET @VersionDescription = 'Revert MFP templates' + +INSERT [dbo].[ORBC_SYS_VERSION] ([VERSION_ID], [DESCRIPTION], [RELEASE_DATE]) VALUES (42, @VersionDescription, getutcdate()) diff --git a/database/mssql/scripts/versions/v_44_ddl.sql b/database/mssql/scripts/versions/v_44_ddl.sql new file mode 100644 index 000000000..039a877a3 --- /dev/null +++ b/database/mssql/scripts/versions/v_44_ddl.sql @@ -0,0 +1,60 @@ +SET ANSI_NULLS ON +GO +SET QUOTED_IDENTIFIER ON +GO +SET NOCOUNT ON +GO + +SET XACT_ABORT ON +GO +SET TRANSACTION ISOLATION LEVEL SERIALIZABLE +GO +BEGIN TRANSACTION +GO + +IF @@ERROR <> 0 SET NOEXEC ON +GO +INSERT [dops].[ORBC_DOCUMENT] ( [S3_OBJECT_ID], [S3_VERSION_ID], [S3_LOCATION], [OBJECT_MIME_TYPE], [FILE_NAME], [DMS_VERSION_ID], [CONCURRENCY_CONTROL_NUMBER], [DB_CREATE_USERID], [DB_CREATE_TIMESTAMP], [DB_LAST_UPDATE_USERID], [DB_LAST_UPDATE_TIMESTAMP]) VALUES ( N'FF765BCC-7778-471C-9468-B788E358A07A', NULL, N'https://moti-int.objectstore.gov.bc.ca/tran_api_orbc_docs_dev/tran_api_orbc_docs_dev%40moti-int.objectstore.gov.bc.ca/ff765bcc-7778-471c-9468-b788e358a07a', N'application/vnd.openxmlformats-officedocument.wordprocessingml.document',N'mfp-template-v1.docx',1, 1, N'dops', GETUTCDATE(), N'dops', GETUTCDATE()) + +IF @@ERROR <> 0 SET NOEXEC ON +GO +INSERT [dops].[ORBC_DOCUMENT] ( [S3_OBJECT_ID], [S3_VERSION_ID], [S3_LOCATION], [OBJECT_MIME_TYPE], [FILE_NAME], [DMS_VERSION_ID], [CONCURRENCY_CONTROL_NUMBER], [DB_CREATE_USERID], [DB_CREATE_TIMESTAMP], [DB_LAST_UPDATE_USERID], [DB_LAST_UPDATE_TIMESTAMP]) VALUES ( N'FF765BCC-7778-471C-9468-B788E358A07A', NULL, N'https://moti-int.objectstore.gov.bc.ca/tran_api_orbc_docs_dev/tran_api_orbc_docs_dev%40moti-int.objectstore.gov.bc.ca/ff765bcc-7778-471c-9468-b788e358a07a', N'application/vnd.openxmlformats-officedocument.wordprocessingml.document',N'mfp-void-template-v1.docx',1, 1, N'dops', GETUTCDATE(), N'dops', GETUTCDATE()) + +IF @@ERROR <> 0 SET NOEXEC ON +GO +INSERT [dops].[ORBC_DOCUMENT] ( [S3_OBJECT_ID], [S3_VERSION_ID], [S3_LOCATION], [OBJECT_MIME_TYPE], [FILE_NAME], [DMS_VERSION_ID], [CONCURRENCY_CONTROL_NUMBER], [DB_CREATE_USERID], [DB_CREATE_TIMESTAMP], [DB_LAST_UPDATE_USERID], [DB_LAST_UPDATE_TIMESTAMP]) VALUES ( N'BCF467A3-23D0-4E1F-8CA1-EC47656F483E', NULL, N'https://moti-int.objectstore.gov.bc.ca/tran_api_orbc_docs_dev/tran_api_orbc_docs_dev%40moti-int.objectstore.gov.bc.ca/bcf467a3-23d0-4e1f-8ca1-ec47656f483e', N'application/vnd.openxmlformats-officedocument.wordprocessingml.document',N'mfp-revoked-template-v1.docx',1, 1, N'dops', GETUTCDATE(), N'dops', GETUTCDATE()) + +IF @@ERROR <> 0 SET NOEXEC ON +GO +INSERT [dops].[ORBC_DOCUMENT_TEMPLATE] ( [TEMPLATE_NAME], [TEMPLATE_VERSION], [DOCUMENT_ID], [CONCURRENCY_CONTROL_NUMBER], [DB_CREATE_USERID], [DB_CREATE_TIMESTAMP], [DB_LAST_UPDATE_USERID], [DB_LAST_UPDATE_TIMESTAMP]) VALUES ( N'PERMIT_MFP', 1, (SELECT ID FROM [dops].[ORBC_DOCUMENT] WHERE FILE_NAME='mfp-template-v1.docx'), 1, N'dops', GETUTCDATE(), N'dops', GETUTCDATE()) +IF @@ERROR <> 0 SET NOEXEC ON +GO +INSERT [dops].[ORBC_DOCUMENT_TEMPLATE] ( [TEMPLATE_NAME], [TEMPLATE_VERSION], [DOCUMENT_ID], [CONCURRENCY_CONTROL_NUMBER], [DB_CREATE_USERID], [DB_CREATE_TIMESTAMP], [DB_LAST_UPDATE_USERID], [DB_LAST_UPDATE_TIMESTAMP]) VALUES ( N'PERMIT_MFP_VOID', 1, (SELECT ID FROM [dops].[ORBC_DOCUMENT] WHERE FILE_NAME='mfp-void-template-v1.docx'), 1, N'dops', GETUTCDATE(), N'dops', GETUTCDATE()) +IF @@ERROR <> 0 SET NOEXEC ON +GO +INSERT [dops].[ORBC_DOCUMENT_TEMPLATE] ( [TEMPLATE_NAME], [TEMPLATE_VERSION], [DOCUMENT_ID], [CONCURRENCY_CONTROL_NUMBER], [DB_CREATE_USERID], [DB_CREATE_TIMESTAMP], [DB_LAST_UPDATE_USERID], [DB_LAST_UPDATE_TIMESTAMP]) VALUES ( N'PERMIT_MFP_REVOKED', 1, (SELECT ID FROM [dops].[ORBC_DOCUMENT] WHERE FILE_NAME='mfp-revoked-template-v1.docx'), 1, N'dops', GETUTCDATE(), N'dops', GETUTCDATE()) + +IF @@ERROR <> 0 SET NOEXEC ON +GO + +DECLARE @VersionDescription VARCHAR(255) +SET @VersionDescription = 'MFP permit templates.' + +INSERT [dbo].[ORBC_SYS_VERSION] ([VERSION_ID], [DESCRIPTION], [UPDATE_SCRIPT], [REVERT_SCRIPT], [RELEASE_DATE]) VALUES (43, @VersionDescription, '$(UPDATE_SCRIPT)', '$(REVERT_SCRIPT)', getutcdate()) +IF @@ERROR <> 0 SET NOEXEC ON +GO + +COMMIT TRANSACTION +GO +IF @@ERROR <> 0 SET NOEXEC ON +GO +DECLARE @Success AS BIT +SET @Success = 1 +SET NOEXEC OFF +IF (@Success = 1) PRINT 'The database update succeeded' +ELSE BEGIN + IF @@TRANCOUNT > 0 ROLLBACK TRANSACTION + PRINT 'The database update failed' +END +GO + diff --git a/database/mssql/test/versions/v_44_1_test.sql b/database/mssql/test/versions/v_44_1_test.sql new file mode 100644 index 000000000..1f3ab7ede --- /dev/null +++ b/database/mssql/test/versions/v_44_1_test.sql @@ -0,0 +1,5 @@ +-- Test that the permit template have been configured correctly +SET NOCOUNT ON + +SELECT COUNT(*) FROM $(DB_NAME).[dops].[ORBC_DOCUMENT_TEMPLATE] +WHERE TEMPLATE_NAME IN ('PERMIT','PERMIT_MFP_VOID','PERMIT_MFP_REVOKED') \ No newline at end of file diff --git a/database/mssql/test/versions/v_44_2_test.sql b/database/mssql/test/versions/v_44_2_test.sql new file mode 100644 index 000000000..5d7b4f763 --- /dev/null +++ b/database/mssql/test/versions/v_44_2_test.sql @@ -0,0 +1,6 @@ +-- Test that the permit template have been configured correctly +SET NOCOUNT ON + +SELECT COUNT(*) FROM $(DB_NAME).[dops].[ORBC_DOCUMENT] +WHERE ID IN (SELECT DOCUMENT_ID FROM $(DB_NAME).[dops].[ORBC_DOCUMENT_TEMPLATE] +WHERE TEMPLATE_NAME IN ('PERMIT','PERMIT_MFP_VOID','PERMIT_MFP_REVOKED')) \ No newline at end of file diff --git a/database/mssql/test/versions/v_44_test.sh b/database/mssql/test/versions/v_44_test.sh new file mode 100644 index 000000000..3a42c1246 --- /dev/null +++ b/database/mssql/test/versions/v_44_test.sh @@ -0,0 +1,24 @@ +#!/bin/bash + +# Retrieve arguments +source ${SCRIPT_DIR}/utility/getopt.sh +USAGE="-u USER -p PASS -s SERVER -d DATABASE" +parse_options "${USAGE}" ${@} + +# All database tests for database version 44 are run from this shell script. +# TESTS_DIR variable set by the calling test-runner script. + +TEST_44_1_RESULT=$(/opt/mssql-tools/bin/sqlcmd -U ${USER} -P "${PASS}" -S ${SERVER} -v DB_NAME=${DATABASE} -h -1 -i ${TESTS_DIR}/v_44_1_test.sql | xargs) +if [[ $TEST_44_1_RESULT -eq 3 ]]; then + echo "Test 44.1 passed: MFP templates setup successfully in ORBC_DOCUMENT_TEMPLATE" +else + echo "******** Test 44.1 failed: Failed to setup MFP permit templates" +fi + + +TEST_44_2_RESULT=$(/opt/mssql-tools/bin/sqlcmd -U ${USER} -P "${PASS}" -S ${SERVER} -v DB_NAME=${DATABASE} -h -1 -i ${TESTS_DIR}/v_44_2_test.sql | xargs) +if [[ $TEST_44_2_RESULT -eq 3 ]]; then + echo "Test 44.2 passed: MFP templates setup successfully in ORBC_DOCUMENT" +else + echo "******** Test 44.2 failed: Failed to setup MFP permit templates" +fi \ No newline at end of file diff --git a/dops/src/enum/template-name.enum.ts b/dops/src/enum/template-name.enum.ts index d04f110f2..5c3fb2179 100644 --- a/dops/src/enum/template-name.enum.ts +++ b/dops/src/enum/template-name.enum.ts @@ -6,4 +6,7 @@ export enum TemplateName { PERMIT_STOS = 'PERMIT_STOS', PERMIT_STOS_VOID = 'PERMIT_STOS_VOID', PERMIT_STOS_REVOKED = 'PERMIT_STOS_REVOKED', + PERMIT_MFP = 'PERMIT_MFP', + PERMIT_MFP_VOID = 'PERMIT_MFP_VOID', + PERMIT_MFP_REVOKED = 'PERMIT_MFP_REVOKED', } diff --git a/vehicles/src/common/enum/template-name.enum.ts b/vehicles/src/common/enum/template-name.enum.ts index d29aa5e0c..195274c85 100644 --- a/vehicles/src/common/enum/template-name.enum.ts +++ b/vehicles/src/common/enum/template-name.enum.ts @@ -9,6 +9,9 @@ export enum TemplateName { PERMIT_STOS = 'PERMIT_STOS', PERMIT_STOS_VOID = 'PERMIT_STOS_VOID', PERMIT_STOS_REVOKED = 'PERMIT_STOS_REVOKED', + PERMIT_MFP = 'PERMIT_MFP', + PERMIT_MFP_VOID = 'PERMIT_MFP_VOID', + PERMIT_MFP_REVOKED = 'PERMIT_MFP_REVOKED', } export type PermitTemplateMapping = { diff --git a/vehicles/src/common/helper/template.helper.ts b/vehicles/src/common/helper/template.helper.ts index 60fa26d83..22c29cf73 100644 --- a/vehicles/src/common/helper/template.helper.ts +++ b/vehicles/src/common/helper/template.helper.ts @@ -22,14 +22,17 @@ export const getPermitTemplateName = ( const templateMapping: PermitTemplateMapping = { [ApplicationStatus.ISSUED]: { [PermitType.SINGLE_TRIP_OVERSIZE]: TemplateName.PERMIT_STOS, + [PermitType.MOTIVE_FUEL_USER]: TemplateName.PERMIT_MFP, default: TemplateName.PERMIT, }, [ApplicationStatus.VOIDED]: { [PermitType.SINGLE_TRIP_OVERSIZE]: TemplateName.PERMIT_STOS_VOID, + [PermitType.MOTIVE_FUEL_USER]: TemplateName.PERMIT_MFP_VOID, default: TemplateName.PERMIT_VOID, }, [ApplicationStatus.REVOKED]: { [PermitType.SINGLE_TRIP_OVERSIZE]: TemplateName.PERMIT_STOS_REVOKED, + [PermitType.MOTIVE_FUEL_USER]: TemplateName.PERMIT_MFP_REVOKED, default: TemplateName.PERMIT_REVOKED, }, }; diff --git a/vehicles/src/common/interface/permit.template.interface.ts b/vehicles/src/common/interface/permit.template.interface.ts index baf7db1f7..80093aed4 100644 --- a/vehicles/src/common/interface/permit.template.interface.ts +++ b/vehicles/src/common/interface/permit.template.interface.ts @@ -59,7 +59,9 @@ interface PermittedCommodity { interface ManualRoute { origin: string; destination: string; - highwaySequence: string[]; + exitPoint?: string; + totalDistance?: number; + highwaySequence?: string[]; } interface MailingAddress { From b453ac48d11023b4ba4e02dd815f595d9b8b7d82 Mon Sep 17 00:00:00 2001 From: Praveen Raju <80779423+praju-aot@users.noreply.github.com> Date: Wed, 25 Sep 2024 17:33:36 -0400 Subject: [PATCH 51/63] fix: ORV2-2841 Correct the DB version for 44 (#1620) --- database/mssql/scripts/versions/revert/v_44_ddl_revert.sql | 2 +- database/mssql/scripts/versions/v_44_ddl.sql | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/database/mssql/scripts/versions/revert/v_44_ddl_revert.sql b/database/mssql/scripts/versions/revert/v_44_ddl_revert.sql index 6e9114396..36ed4666e 100644 --- a/database/mssql/scripts/versions/revert/v_44_ddl_revert.sql +++ b/database/mssql/scripts/versions/revert/v_44_ddl_revert.sql @@ -28,4 +28,4 @@ END CATCH DECLARE @VersionDescription VARCHAR(255) SET @VersionDescription = 'Revert MFP templates' -INSERT [dbo].[ORBC_SYS_VERSION] ([VERSION_ID], [DESCRIPTION], [RELEASE_DATE]) VALUES (42, @VersionDescription, getutcdate()) +INSERT [dbo].[ORBC_SYS_VERSION] ([VERSION_ID], [DESCRIPTION], [RELEASE_DATE]) VALUES (43, @VersionDescription, getutcdate()) diff --git a/database/mssql/scripts/versions/v_44_ddl.sql b/database/mssql/scripts/versions/v_44_ddl.sql index 039a877a3..2d176aaa1 100644 --- a/database/mssql/scripts/versions/v_44_ddl.sql +++ b/database/mssql/scripts/versions/v_44_ddl.sql @@ -40,7 +40,7 @@ GO DECLARE @VersionDescription VARCHAR(255) SET @VersionDescription = 'MFP permit templates.' -INSERT [dbo].[ORBC_SYS_VERSION] ([VERSION_ID], [DESCRIPTION], [UPDATE_SCRIPT], [REVERT_SCRIPT], [RELEASE_DATE]) VALUES (43, @VersionDescription, '$(UPDATE_SCRIPT)', '$(REVERT_SCRIPT)', getutcdate()) +INSERT [dbo].[ORBC_SYS_VERSION] ([VERSION_ID], [DESCRIPTION], [UPDATE_SCRIPT], [REVERT_SCRIPT], [RELEASE_DATE]) VALUES (44, @VersionDescription, '$(UPDATE_SCRIPT)', '$(REVERT_SCRIPT)', getutcdate()) IF @@ERROR <> 0 SET NOEXEC ON GO From 61ede2270b168b6aac66107502176ee2003b48ec Mon Sep 17 00:00:00 2001 From: cberg-aot <93226309+cberg-aot@users.noreply.github.com> Date: Wed, 25 Sep 2024 16:01:18 -0700 Subject: [PATCH 52/63] fix: deploying via last merged pr instead of tag promotion (#1621) --- .github/workflows/release.yml | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 1665ec400..a2e83b8bc 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -14,10 +14,19 @@ jobs: vars: name: Set Variables outputs: + pr: ${{ steps.pr.outputs.pr }} release-name: ${{ steps.release-name.outputs.release-name }} runs-on: ubuntu-22.04 timeout-minutes: 1 steps: + # Get PR number for squash merges to main + - name: Get PR Number From Event + if: ${{ github.event_name == 'push' }} + id: pr_no + uses: bcgov-nr/action-get-pr@main + - name: PR Number + id: pr + run: echo pr=${{ steps.pr_no.outputs.pr || inputs.pr}} >> $GITHUB_OUTPUT - name: Release Name id: release-name run: | @@ -38,7 +47,7 @@ jobs: with: registry: ghcr.io repository: ${{ github.repository }}/${{ matrix.package }} - target: test + target: ${{ needs.vars.outputs.pr }} tags: ${{ needs.vars.outputs.release-name }} deploys-uat: @@ -47,7 +56,7 @@ jobs: uses: ./.github/workflows/uat.yml secrets: inherit with: - tag: ${{ needs.vars.outputs.release-name }} + tag: ${{ needs.vars.outputs.pr }} promote-images-uat: name: Promote Images - Uat @@ -64,7 +73,7 @@ jobs: with: registry: ghcr.io repository: ${{ github.repository }}/${{ matrix.package }} - target: ${{ needs.vars.outputs.release-name }} + target: ${{ needs.vars.outputs.pr }} tags: uat deploys-prod: @@ -73,7 +82,7 @@ jobs: uses: ./.github/workflows/prod.yml secrets: inherit with: - tag: ${{ needs.vars.outputs.release-name }} + tag: ${{ needs.vars.outputs.pr }} promote-images-prod: name: Promote Images - Prod @@ -90,5 +99,5 @@ jobs: with: registry: ghcr.io repository: ${{ github.repository }}/${{ matrix.package }} - target: ${{ needs.vars.outputs.release-name }} + target: ${{ needs.vars.outputs.pr }} tags: prod From 888f0d4a2be905776a3d40799968bd5bdd057087 Mon Sep 17 00:00:00 2001 From: cberg-aot <93226309+cberg-aot@users.noreply.github.com> Date: Wed, 25 Sep 2024 16:21:04 -0700 Subject: [PATCH 53/63] fix: catching release event (#1622) --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index a2e83b8bc..fbf2a8dae 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -21,7 +21,7 @@ jobs: steps: # Get PR number for squash merges to main - name: Get PR Number From Event - if: ${{ github.event_name == 'push' }} + if: ${{ github.event_name == 'release' }} id: pr_no uses: bcgov-nr/action-get-pr@main - name: PR Number From 5e14488dad19487637e7107281d0daa57d352b09 Mon Sep 17 00:00:00 2001 From: Praveen Raju <80779423+praju-aot@users.noreply.github.com> Date: Thu, 26 Sep 2024 15:58:58 -0400 Subject: [PATCH 54/63] fix:ORV2-2792 Rectify the expiry date validation for Staff Queue (#1623) --- .../application/application.service.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/vehicles/src/modules/permit-application-payment/application/application.service.ts b/vehicles/src/modules/permit-application-payment/application/application.service.ts index 0db543da1..4e9720a78 100644 --- a/vehicles/src/modules/permit-application-payment/application/application.service.ts +++ b/vehicles/src/modules/permit-application-payment/application/application.service.ts @@ -583,7 +583,7 @@ export class ApplicationService { existingApplication?.permitData?.permitData, ) as PermitData; const currentDate = dayjs(new Date().toISOString())?.format('YYYY-MM-DD'); - if (differenceBetween(permitData?.startDate, currentDate, 'days') < 0) { + if (differenceBetween(permitData?.startDate, currentDate, 'days') > 0) { throwUnprocessableEntityException('Start Date is in the past.'); } } @@ -1042,9 +1042,9 @@ export class ApplicationService { if ( application.permitStatus === ApplicationStatus.IN_QUEUE && - (differenceBetween(permitData?.startDate, currentDate, 'days') < + (differenceBetween(permitData?.startDate, currentDate, 'days') > 0 || - differenceBetween(permitData?.expiryDate, currentDate, 'days') < + differenceBetween(permitData?.expiryDate, currentDate, 'days') > 0) ) { throwUnprocessableEntityException( From 21fa1211be949a10b89a53f86635a641c68f8001 Mon Sep 17 00:00:00 2001 From: gchauhan-aot <113390759+gchauhan-aot@users.noreply.github.com> Date: Fri, 27 Sep 2024 11:11:12 -0600 Subject: [PATCH 55/63] Permission Changes For LoA And Special Auth (#1624) --- .../modules/special-auth/loa.controller.ts | 48 ++++++++++++++++--- .../special-auth/special-auth.controller.ts | 25 ++++++++-- 2 files changed, 62 insertions(+), 11 deletions(-) diff --git a/vehicles/src/modules/special-auth/loa.controller.ts b/vehicles/src/modules/special-auth/loa.controller.ts index 2f0c8e17e..1a63b1eda 100644 --- a/vehicles/src/modules/special-auth/loa.controller.ts +++ b/vehicles/src/modules/special-auth/loa.controller.ts @@ -40,10 +40,14 @@ import { LoaIdPathParamDto } from './dto/request/pathParam/loa-Id.path-params.dt import { GetDocumentQueryParamsDto } from '../common/dto/request/queryParam/getDocument.query-params.dto'; import { IsFeatureFlagEnabled } from '../../common/decorator/is-feature-flag-enabled.decorator'; import { Permissions } from 'src/common/decorator/permissions.decorator'; -import { Claim } from 'src/common/enum/claims.enum'; import { ReadLoaDto } from './dto/response/read-loa.dto'; import { GetLoaQueryParamsDto } from './dto/request/queryParam/get-loa.query-params.dto'; import { UpdateLoaFileDto } from './dto/request/update-loa-file.dto'; +import { + CLIENT_USER_ROLE_LIST, + IDIR_USER_ROLE_LIST, + IDIRUserRole, +} from 'src/common/enum/user-role.enum'; @ApiBearerAuth() @ApiTags('Letter of Authorization (LoA)') @@ -78,7 +82,12 @@ export class LoaController { type: ReadLoaDto, }) @ApiConsumes('multipart/form-data') - @Permissions({ claim: Claim.WRITE_LOA }) + @Permissions({ + allowedIdirRoles: [ + IDIRUserRole.HQ_ADMINISTRATOR, + IDIRUserRole.SYSTEM_ADMINISTRATOR, + ], + }) @Post() @UseInterceptors(FileInterceptor('file'), JsonReqBodyInterceptor) async create( @@ -109,6 +118,10 @@ export class LoaController { summary: 'Get all LoA for a company.', description: 'Returns all LOAs for a company in the database.', }) + @Permissions({ + allowedIdirRoles: IDIR_USER_ROLE_LIST, + allowedBCeIDRoles: CLIENT_USER_ROLE_LIST, + }) @Get() async get( @Param() { companyId }: CompanyIdPathParamDto, @@ -125,7 +138,10 @@ export class LoaController { summary: 'Get LoA by Id.', description: 'Returns the LoA object from the database.', }) - @Permissions({ claim: Claim.READ_LOA }) + @Permissions({ + allowedIdirRoles: IDIR_USER_ROLE_LIST, + allowedBCeIDRoles: CLIENT_USER_ROLE_LIST, + }) @Get('/:loaId') async getById( @Req() request: Request, @@ -141,7 +157,12 @@ export class LoaController { description: 'Updates and returns the LoA object from the database.', }) @ApiConsumes('multipart/form-data') - @Permissions({ claim: Claim.WRITE_LOA }) + @Permissions({ + allowedIdirRoles: [ + IDIRUserRole.HQ_ADMINISTRATOR, + IDIRUserRole.SYSTEM_ADMINISTRATOR, + ], + }) @Put('/:loaId') @UseInterceptors(FileInterceptor('file'), JsonReqBodyInterceptor) async update( @@ -174,7 +195,12 @@ export class LoaController { summary: 'Delete LoA by Id.', description: 'Deletes the LoA object from the database.', }) - @Permissions({ claim: Claim.WRITE_LOA }) + @Permissions({ + allowedIdirRoles: [ + IDIRUserRole.HQ_ADMINISTRATOR, + IDIRUserRole.SYSTEM_ADMINISTRATOR, + ], + }) @Delete('/:loaId') async delete( @Req() request: Request, @@ -189,7 +215,10 @@ export class LoaController { summary: 'Get LoA Document', description: 'Retrieve the LoA document from the database.', }) - @Permissions({ claim: Claim.READ_LOA }) + @Permissions({ + allowedIdirRoles: IDIR_USER_ROLE_LIST, + allowedBCeIDRoles: CLIENT_USER_ROLE_LIST, + }) @Get('/:loaId/documents') async getLoaDocument( @Req() request: Request, @@ -215,7 +244,12 @@ export class LoaController { summary: 'Delete LoA Document', description: 'Deletes the LoA document from the database.', }) - @Permissions({ claim: Claim.WRITE_LOA }) + @Permissions({ + allowedIdirRoles: [ + IDIRUserRole.HQ_ADMINISTRATOR, + IDIRUserRole.SYSTEM_ADMINISTRATOR, + ], + }) @Delete('/:loaId/documents') async deleteLoaDocument( @Req() request: Request, diff --git a/vehicles/src/modules/special-auth/special-auth.controller.ts b/vehicles/src/modules/special-auth/special-auth.controller.ts index 0df4088ac..9bd7e4b23 100644 --- a/vehicles/src/modules/special-auth/special-auth.controller.ts +++ b/vehicles/src/modules/special-auth/special-auth.controller.ts @@ -18,8 +18,12 @@ import { Request } from 'express'; import { CreateLcvDto } from './dto/request/create-lcv.dto'; import { CreateNoFeeDto } from './dto/request/create-no-fee.dto'; import { Permissions } from '../../common/decorator/permissions.decorator'; -import { Claim } from '../../common/enum/claims.enum'; import { IsFeatureFlagEnabled } from 'src/common/decorator/is-feature-flag-enabled.decorator'; +import { + CLIENT_USER_ROLE_LIST, + IDIR_USER_ROLE_LIST, + IDIRUserRole, +} from 'src/common/enum/user-role.enum'; @ApiBearerAuth() @ApiTags('Special Authorization') @@ -48,7 +52,10 @@ export class SpecialAuthController { description: 'Returns all special authorizations for a company in the database.', }) - @Permissions({ claim: Claim.READ_SPECIAL_AUTH }) + @Permissions({ + allowedIdirRoles: IDIR_USER_ROLE_LIST, + allowedBCeIDRoles: CLIENT_USER_ROLE_LIST, + }) @Get() async get( @Param() { companyId }: CompanyIdPathParamDto, @@ -65,7 +72,12 @@ export class SpecialAuthController { description: 'LCV allowance updated successfully.', type: ReadSpecialAuthDto, }) - @Permissions({ claim: Claim.WRITE_LCV_FLAG }) + @Permissions({ + allowedIdirRoles: [ + IDIRUserRole.HQ_ADMINISTRATOR, + IDIRUserRole.SYSTEM_ADMINISTRATOR, + ], + }) @Put('/lcv') async updateLcv( @Req() request: Request, @@ -89,7 +101,12 @@ export class SpecialAuthController { description: 'No fee type updated successfully.', type: ReadSpecialAuthDto, }) - @Permissions({ claim: Claim.WRITE_NOFEE }) + @Permissions({ + allowedIdirRoles: [ + IDIRUserRole.HQ_ADMINISTRATOR, + IDIRUserRole.SYSTEM_ADMINISTRATOR, + ], + }) @Put('/no-fee') async updateNoFee( @Req() request: Request, From 38456ec4f800680dd16db72079a2c1eb83b9562b Mon Sep 17 00:00:00 2001 From: gchauhan-aot <113390759+gchauhan-aot@users.noreply.github.com> Date: Fri, 27 Sep 2024 13:09:12 -0600 Subject: [PATCH 56/63] LoA number change (#1626) --- vehicles/src/modules/special-auth/loa.service.ts | 1 + vehicles/src/modules/special-auth/profile/loa.profile.ts | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/vehicles/src/modules/special-auth/loa.service.ts b/vehicles/src/modules/special-auth/loa.service.ts index 9ad05b754..8363942d5 100644 --- a/vehicles/src/modules/special-auth/loa.service.ts +++ b/vehicles/src/modules/special-auth/loa.service.ts @@ -311,6 +311,7 @@ export class LoaService { companyId: companyId, documentId: documentId, isActive: true, + loaNumber: existingLoaDetail.loaNumber, previousLoaId: existingLoaDetail.loaId, originalLoaId: existingLoaDetail.originalLoaId, userName: currentUser.userName, diff --git a/vehicles/src/modules/special-auth/profile/loa.profile.ts b/vehicles/src/modules/special-auth/profile/loa.profile.ts index 6f38ecef7..a48e44ac0 100644 --- a/vehicles/src/modules/special-auth/profile/loa.profile.ts +++ b/vehicles/src/modules/special-auth/profile/loa.profile.ts @@ -211,6 +211,12 @@ export class LoaProfile extends AutomapperProfile { return companyId; }), ), + forMember( + (d) => d.loaNumber, + mapWithArguments((_, { loaNumber }) => { + return loaNumber; + }), + ), forMember( (d) => d.documentId, mapWithArguments((_, { documentId }) => { From 8411ca12e81635817f55f7d4670f1c92ff0f84a9 Mon Sep 17 00:00:00 2001 From: bcgov-brwang Date: Fri, 27 Sep 2024 14:46:45 -0700 Subject: [PATCH 57/63] ORV2-2780: integrate selenium webdriver for login to get access token ORV2-2780: integrate selenium webdriver for login to get access token --- .../orbc_load_test_plan_frontend_bceid.jmx | 227 +++++++++++------- 1 file changed, 142 insertions(+), 85 deletions(-) diff --git a/loadtests/frontend/orbc_load_test_plan_frontend_bceid.jmx b/loadtests/frontend/orbc_load_test_plan_frontend_bceid.jmx index 99a5b7be5..68483a4cf 100644 --- a/loadtests/frontend/orbc_load_test_plan_frontend_bceid.jmx +++ b/loadtests/frontend/orbc_load_test_plan_frontend_bceid.jmx @@ -17,6 +17,29 @@
+ + 8889 + + + true + 0 + false + + false + true + true + true + false + 0 + + + + false + false + + + + @@ -36,17 +59,27 @@ USER - + ORBCTST1 = PASSWORD - + orbcTST2023+ = - - NEW_APPLICATION_URL - https://onroutebc-test-frontend.apps.silver.devops.gov.bc.ca/create-application/TROS + + GET_POWERUNITS_URL + https://onroutebc-test-vehicles.apps.silver.devops.gov.bc.ca/companies/104/vehicles/powerUnits + = + + + GET_TRAILERS_URL + https://onroutebc-test-vehicles.apps.silver.devops.gov.bc.ca/companies/104/vehicles/trailers + = + + + BEARER_TOKEN + = @@ -55,7 +88,7 @@ false true - C:\Users\BRWANG\Software\chromedriver-win64\chromedriver-win64\chromedriver.exe + C:\Users\BRWANG\Software\chromedriver-win64\chromedriver-win64-129\chromedriver.exe false false true @@ -92,18 +125,27 @@ true
- + import org.openqa.selenium.By import org.openqa.selenium.support.ui.ExpectedConditions import org.openqa.selenium.support.ui.WebDriverWait import org.openqa.selenium.WebElement +import org.openqa.selenium.devtools.DevTools; +import org.openqa.selenium.devtools.v129.network.Network; +import java.util.Optional; +import org.openqa.selenium.logging.LogType +import org.openqa.selenium.logging.LogEntries +import org.openqa.selenium.chrome.ChromeOptions +import org.openqa.selenium.logging.LoggingPreferences +import java.util.logging.Level +import java.util.function.Consumer WDS.sampleResult.sampleStart() + def frontendUrl = WDS.vars.get("FRONTEND_URL") -WDS.browser.get(frontendUrl); +WDS.browser.get(frontendUrl) Thread.sleep(5000) - def loginButton = WDS.browser.findElement(By.id('login-bceid')) if (loginButton != null) { loginButton.click() @@ -128,87 +170,28 @@ if (submitButton != null) { } else { WDS.log.info('Submit button with name="btnSubmit" not found') } -Thread.sleep(10000) - -// start a new application -def newApplicationUrl = WDS.vars.get("NEW_APPLICATION_URL") -WDS.browser.get(newApplicationUrl); Thread.sleep(5000) -def selectedVehicle = WDS.browser.findElement(By.id('application-select-vehicle')) -selectedVehicle.sendKeys("MCL36") -Thread.sleep(5000) -def vin = WDS.browser.findElement(By.cssSelector('[name="permitData.vehicleDetails.vin"]')) -vin.sendKeys("MCL36A") -Thread.sleep(5000) -def plate = WDS.browser.findElement(By.cssSelector('[name="permitData.vehicleDetails.plate"]')) -plate.sendKeys("L4NDO") -Thread.sleep(5000) -def make = WDS.browser.findElement(By.cssSelector('[name="permitData.vehicleDetails.make"]')) -make.sendKeys("BMW") -Thread.sleep(5000) -def year = WDS.browser.findElement(By.cssSelector('[name="permitData.vehicleDetails.year"]')) -year.sendKeys("2020") -Thread.sleep(5000) -def country = WDS.browser.findElement(By.id('mui-component-select-permitData.vehicleDetails.countryCode')) -WDS.browser.executeScript("window.scrollTo(0, arguments[0].getBoundingClientRect().top + window.pageYOffset - 100);", country) -country.click() -Thread.sleep(5000) -def ca = WDS.browser.findElement(By.cssSelector('[data-value="CA"]')) -ca.click() -Thread.sleep(5000) -def province = WDS.browser.findElement(By.id('mui-component-select-permitData.vehicleDetails.provinceCode')) -province.click() -Thread.sleep(5000) -def bc = WDS.browser.findElement(By.cssSelector('[data-value="BC"]')) -bc.click() -Thread.sleep(5000) -def vehicleType = WDS.browser.findElement(By.id('mui-component-select-permitData.vehicleDetails.vehicleType')) -vehicleType.click() -def powerUnit = WDS.browser.findElement(By.cssSelector('[data-value="powerUnit"]')) -powerUnit.click() -Thread.sleep(5000) - - -Thread.sleep(5000) -def vehicleSubType = WDS.browser.findElement(By.id('mui-component-select-permitData.vehicleDetails.vehicleSubType')) -vehicleSubType.click() -def trucks = WDS.browser.findElement(By.cssSelector('[data-value="REGTRCK"]')) -trucks.click() -Thread.sleep(5000) - -def continueButton = WDS.browser.findElement(By.cssSelector('[data-testid="continue-application-button"]')) -Thread.sleep(5000) - -if (continueButton != null) { - continueButton.click() - WDS.log.info('Clicked the button with data-testid="continue-application-button"') -} else { - WDS.log.info('Button with data-testid="continue-application-button" not found') -} - -Thread.sleep(10000) -def checkboxes = WDS.browser.findElements(By.cssSelector('input[type="checkbox"]')) -checkboxes.each { checkbox -> - WDS.browser.executeScript("window.scrollTo(0, arguments[0].getBoundingClientRect().top + window.pageYOffset - 100);", checkbox) - if (!checkbox.isSelected()) { - checkbox.click() +def devTools = ((org.openqa.selenium.chrome.ChromeDriver) WDS.browser).getDevTools() +devTools.createSession() +devTools.send(Network.enable(Optional.empty(), Optional.empty(), Optional.empty())) +devTools.addListener(Network.requestWillBeSent(), { request -> + if (request.getRequest().getUrl().contains("https")) { + def headers = request.getRequest().getHeaders() + def authHeader = headers.get("Authorization") + if (authHeader != null && authHeader.startsWith("Bearer ")) { + def token = authHeader.replace("Bearer ", "") + WDS.log.info("Extracted Token: " + token) + WDS.vars.put("BEARER_TOKEN", token) + } } -} - -Thread.sleep(5000) -def addToCart = WDS.browser.findElement(By.cssSelector('[data-testid="add-to-cart-btn"]')) -addToCart.click() - -Thread.sleep(10000) -def shoppingCart = WDS.browser.findElement(By.className('shopping-cart-button')) -shoppingCart.click() - + else { + WDS.log.info("bruce test no token: ") + } +} as Consumer) Thread.sleep(5000) -def payNow = WDS.browser.findElement(By.cssSelector('[data-testid="pay-now-btn"]')) -WDS.browser.executeScript("window.scrollTo(0, arguments[0].getBoundingClientRect().top + window.pageYOffset - 100);", payNow) -payNow.click() +WDS.browser.get(frontendUrl) Thread.sleep(5000) WDS.sampleResult.sampleEnd() @@ -217,6 +200,80 @@ WDS.sampleResult.sampleEnd() groovy + + + + + + + + + ${GET_POWERUNITS_URL} + GET + true + false + true + false + + + + + + + + + Authorization + Bearer ${BEARER_TOKEN} + + + Accept + application/json + + + Content-Type + application/json + + + + + + + + + + + + + + ${GET_TRAILERS_URL} + GET + true + false + true + false + + + + + + + + + Authorization + Bearer ${BEARER_TOKEN} + + + Accept + application/json + + + Content-Type + application/json + + + + + false From 7851a62e8c9ec3b855ec88978b2839934f42d868 Mon Sep 17 00:00:00 2001 From: Derek Roberts Date: Thu, 3 Oct 2024 12:35:44 -0700 Subject: [PATCH 58/63] chore(ci): handle gh runner oc removal (#1625) --- .github/workflows/deploy.yml | 5 +++++ .github/workflows/pr-close.yml | 2 +- .github/workflows/scheduled.yml | 4 ++++ 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 6f27faab9..8258f496b 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -148,6 +148,11 @@ jobs: # If here skip deployment echo "No triggers have fired, deployment skipped" + - uses: redhat-actions/openshift-tools-installer@v1 + if: ${{ steps.triggers.outputs.triggered == 'true' }} + with: + oc: "4" + - name: Deploy if Triggers Fired if: ${{ steps.triggers.outputs.triggered == 'true' }} working-directory: ${{ inputs.directory }} diff --git a/.github/workflows/pr-close.yml b/.github/workflows/pr-close.yml index 45802f6f9..5b66b040a 100644 --- a/.github/workflows/pr-close.yml +++ b/.github/workflows/pr-close.yml @@ -12,7 +12,7 @@ concurrency: jobs: cleanup: name: Cleanup OpenShift and/or Promote Images - uses: bcgov/quickstart-openshift-helpers/.github/workflows/.pr-close.yml@v0.6.1 + uses: bcgov/quickstart-openshift-helpers/.github/workflows/.pr-close.yml@v0.7.1 secrets: oc_namespace: ${{ vars.OC_NAMESPACE }} oc_token: ${{ secrets.OC_TOKEN }} diff --git a/.github/workflows/scheduled.yml b/.github/workflows/scheduled.yml index 98201e02b..5ee888e79 100644 --- a/.github/workflows/scheduled.yml +++ b/.github/workflows/scheduled.yml @@ -80,6 +80,10 @@ jobs: runs-on: ubuntu-latest timeout-minutes: 10 steps: + - uses: redhat-actions/openshift-tools-installer@v1 + with: + oc: "4" + - name: Clean up Helm Releases run: | # Clean up Helm Releases From 743d2676c5d286bd86433cea819c93e322f27d11 Mon Sep 17 00:00:00 2001 From: John Fletcher <113134542+john-fletcher-aot@users.noreply.github.com> Date: Fri, 4 Oct 2024 14:16:05 -0700 Subject: [PATCH 59/63] docs: Move database history table docs to git (#1628) --- .../generate-history-tables-and-triggers.sql | 370 ++++++++++++++++++ .../scripts/history-tables-instructions.md | 35 ++ 2 files changed, 405 insertions(+) create mode 100644 database/mssql/scripts/generate-history-tables-and-triggers.sql create mode 100644 database/mssql/scripts/history-tables-instructions.md diff --git a/database/mssql/scripts/generate-history-tables-and-triggers.sql b/database/mssql/scripts/generate-history-tables-and-triggers.sql new file mode 100644 index 000000000..c91974da6 --- /dev/null +++ b/database/mssql/scripts/generate-history-tables-and-triggers.sql @@ -0,0 +1,370 @@ +SET XACT_ABORT, NOCOUNT ON + +-- -------------------------------------------------------------------------------------------- +-- Drop function fnFirsties +-- -------------------------------------------------------------------------------------------- +IF OBJECT_ID ( 'fnFirsties', 'FN' ) IS NOT NULL + drop FUNCTION dbo.fnFirsties; +go + +-- -------------------------------------------------------------------------------------------- +-- Create function fnFirsties +-- -------------------------------------------------------------------------------------------- +CREATE FUNCTION dbo.fnFirsties ( @str NVARCHAR(4000) ) +RETURNS NVARCHAR(max) +AS +BEGIN + DECLARE @retval NVARCHAR(2000); + + SET @str = RTRIM(LTRIM(@str)); + SET @retval = LEFT(@str, 1); + + WHILE CHARINDEX(' ',@str,1)>0 BEGIN + SET @str = LTRIM(RIGHT(@str, LEN(@str) - CHARINDEX(' ', @str, 1))); + SET @retval = LEFT(@str, 1); + END + + RETURN @retval; +END +GO + +-- -------------------------------------------------------------------------------------------- +-- Drop function fnGetColumnsString +-- -------------------------------------------------------------------------------------------- +IF OBJECT_ID ( 'fnGetColumnsString', 'FN' ) IS NOT NULL + drop FUNCTION dbo.fnGetColumnsString; +go + +-- -------------------------------------------------------------------------------------------- +-- Create function fnGetColumnsString +-- -------------------------------------------------------------------------------------------- +CREATE FUNCTION dbo.fnGetColumnsString ( @str NVARCHAR(4000) ) +RETURNS NVARCHAR(max) +AS +BEGIN + DECLARE @retval NVARCHAR(max) = ''; + + declare @statement_sql cursor + set @statement_sql = cursor for + select COLUMN_NAME + , data_type + , CHARACTER_MAXIMUM_LENGTH + , IS_NULLABLE + from INFORMATION_SCHEMA.COLUMNS + where TABLE_NAME = @str + and DATA_TYPE != 'varbinary' + and coalesce(character_maximum_length, 1) != -1 + order by table_name + , ORDINAL_POSITION; + + declare @sql_txt1 nvarchar(max) = ''; + declare @sql_txt2 nvarchar(max) = ''; + declare @sql_txt3 nvarchar(max) = ''; + declare @sql_txt4 nvarchar(max) = ''; + + OPEN @statement_sql + + FETCH NEXT + FROM @statement_sql INTO @sql_txt1, @sql_txt2, @sql_txt3, @sql_txt4 + + WHILE @@FETCH_STATUS = 0 + BEGIN + set @retval += ', [' + @sql_txt1 + '] ' + @sql_txt2 + case when @sql_txt2 in ('char', 'nchar', 'varchar','nvarchar') then '(' + @sql_txt3 + ')' else '' end +case when @sql_txt4 = 'NO' then ' NOT' else '' end+' NULL'; + FETCH NEXT + FROM @statement_sql INTO @sql_txt1, @sql_txt2, @sql_txt3, @sql_txt4 + END + + CLOSE @statement_sql + DEALLOCATE @statement_sql + + RETURN @retval; +END +GO + +--:OUT "G:\OneDrive\Documents\LMS Biz\Quartech\MOTI\PSP\Data Model\Build\Working\ORBC_generate_history_table.sql" + +begin +declare @statement_sql cursor +set @statement_sql = cursor for + select N'IF OBJECT_ID (''' + isnull(convert(varchar(max), p.value), stuff(dbo.fnFirsties(replace(t.name, '_', ' ')), 1, 1, '') + cast(row_number() over (order by t.name asc) as varchar(max))) + '_A_S_IUD_TR'', ''TR'') IS NOT NULL + drop trigger ' + isnull(convert(varchar(max), p.value), stuff(dbo.fnFirsties(replace(t.name, '_', ' ')), 1, 1, '') + cast(row_number() over (order by t.name asc) as varchar(max))) + '_A_S_IUD_TR +go + +IF OBJECT_ID (''' + t.name + '_HIST'', ''U'') IS NOT NULL + drop table ' + t.name + '_HIST +go + +IF OBJECT_ID (''' + t.name + '_H_ID_SEQ'', ''SO'') IS NOT NULL + drop sequence ' + t.name + '_H_ID_SEQ +go + +' +from sys.tables t join + sys.schemas s on s.schema_id = t.schema_id left join + (select table_alias COLLATE catalog_default value + , table_name COLLATE catalog_default table_name + from ORBCX_TableDefinitions) p on t.name COLLATE catalog_default = p.table_name COLLATE catalog_default, + INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc -- INNER JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE AS ccu ON tc.CONSTRAINT_NAME = ccu.CONSTRAINT_NAME +WHERE t.TYPE_desc = 'USER_TABLE' + and t.NAME like 'ORBC_%' + and tc.table_name = t.name + and tc.CONSTRAINT_TYPE = 'PRIMARY KEY' + and t.NAME not like '%HIST' + and t.NAME not like 'ORBCX%' + and t.NAME not like '%EFMigration%' + and t.NAME not like 'ETL%' + and t.NAME not like 'PMBC%' + and t.NAME not like '%SYS_VERS%' + -- code value (type and subtype) tables + and t.NAME not like '%TYPE' + and t.NAME not like '%SUBTYPE' + -- tables that do no have APP audit attributes + and t.name != 'ORBC_COUNTRY' + and t.name != 'ORBC_DISTRICT' + and t.name != 'ORBC_PROVINCE_STATE' + and t.name != 'ORBC_REGION' + and t.name != 'ORBC_TENANT' + and s.name != 'tps' +order by t.name; + +declare @sql_txt varchar(max) = ''; + +OPEN @statement_sql + +FETCH NEXT +FROM @statement_sql INTO @sql_txt + +WHILE @@FETCH_STATUS = 0 + BEGIN + print @sql_txt + FETCH NEXT + FROM @statement_sql INTO @sql_txt + END + +CLOSE @statement_sql +DEALLOCATE @statement_sql + +set @statement_sql = cursor for +select N'CREATE SEQUENCE [' + s.name + '].[' + t.name + '_H_ID_SEQ] AS [bigint] START WITH 1 INCREMENT BY 1 MINVALUE 1 MAXVALUE 2147483647 CACHE 50; + +CREATE TABLE [' + s.name + '].[' + t.name + '_HIST]( + '+substring(t.name, 5, len(t.name)) + '_HIST_ID [bigint] DEFAULT (NEXT VALUE FOR [' + s.name + '].[' + t.name + '_H_ID_SEQ]) NOT NULL + ,EFFECTIVE_DATE_HIST [datetime] NOT NULL default getutcdate() + ,END_DATE_HIST [datetime] + '+dbo.fnGetColumnsString(t.name)+' + ) +ALTER TABLE [' + s.name + '].[' + t.name + '_HIST] ADD CONSTRAINT ' + isnull(convert(varchar(max), substring(cast(p.value as varchar), 1, 11)), 'ORBC_' + stuff(dbo.fnFirsties(replace(t.name, '_', ' ')), 1, 1, '') + cast(row_number() over (order by t.name asc) as varchar(max))) + '_H_PK PRIMARY KEY CLUSTERED (' + substring(t.name, 5, len(t.name)) + '_HIST_ID); +ALTER TABLE [' + s.name + '].[' + t.name + '_HIST] ADD CONSTRAINT ' + isnull(convert(varchar(max), substring(cast(p.value as varchar), 1, 11)), 'ORBC_' + stuff(dbo.fnFirsties(replace(t.name, '_', ' ')), 1, 1, '') + cast(row_number() over (order by t.name asc) as varchar(max))) + '_H_UK UNIQUE (' + substring(t.name, 5, len(t.name)) + '_HIST_ID,END_DATE_HIST) +go + +' +from sys.tables t join + sys.schemas s on s.schema_id = t.schema_id left join + (select table_alias COLLATE catalog_default value + , table_name COLLATE catalog_default table_name + from ORBCX_TableDefinitions) p on t.name COLLATE catalog_default = p.table_name COLLATE catalog_default, + INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc --INNER JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE AS ccu ON tc.CONSTRAINT_NAME = ccu.CONSTRAINT_NAME +WHERE t.TYPE_desc = 'USER_TABLE' + and t.NAME like 'ORBC_%' + and tc.table_name = t.name + and tc.CONSTRAINT_TYPE = 'PRIMARY KEY' + and t.NAME not like '%HIST' + and t.NAME not like 'ORBCX%' + and t.NAME not like '%EFMigration%' + and t.NAME not like 'ETL%' + and t.NAME not like 'PMBC%' + and t.NAME not like '%SYS_VERS%' + -- code value (type and subtype) tables + and t.NAME not like '%TYPE' + and t.NAME not like '%SUBTYPE' + -- tables that do no have APP audit attributes + and t.name != 'ORBC_COUNTRY' + and t.name != 'ORBC_DISTRICT' + and t.name != 'ORBC_PROVINCE_STATE' + and t.name != 'ORBC_REGION' + and t.name != 'ORBC_TENANT' + and s.name != 'tps' +order by 1; + +OPEN @statement_sql +FETCH NEXT +FROM @statement_sql INTO @sql_txt +WHILE @@FETCH_STATUS = 0 +BEGIN + print @sql_txt + FETCH NEXT + FROM @statement_sql INTO @sql_txt +END + +CLOSE @statement_sql +DEALLOCATE @statement_sql + +end +-- ............................................................................................ + +--drop function dbo.fnFirsties; +--drop function fnGetColumnsString; + +------------------------------------------------ +SET XACT_ABORT, NOCOUNT ON + + +-- -------------------------------------------------------------------------------------------- +-- Drop function fnFirsties +-- -------------------------------------------------------------------------------------------- +IF OBJECT_ID ( 'fnFirsties', 'FN' ) IS NOT NULL + drop FUNCTION dbo.fnFirsties; +go +-- ............................................................................................ + + +-- -------------------------------------------------------------------------------------------- +-- Create function fnFirsties +-- -------------------------------------------------------------------------------------------- +CREATE FUNCTION dbo.fnFirsties ( @str NVARCHAR(4000) ) +RETURNS NVARCHAR(max) +AS +BEGIN + DECLARE @retval NVARCHAR(2000); + + SET @str=RTRIM(LTRIM(@str)); + SET @retval=LEFT(@str,1); + + WHILE CHARINDEX(' ',@str,1)>0 BEGIN + SET @str=LTRIM(RIGHT(@str,LEN(@str)-CHARINDEX(' ',@str,1))); + SET @retval+=LEFT(@str,1); + END + + RETURN @retval; +END +GO +-- ............................................................................................ + + +-- -------------------------------------------------------------------------------------------- +-- Drop function fnGetColumnsString2 +-- -------------------------------------------------------------------------------------------- +IF OBJECT_ID ( 'fnGetColumnsString2', 'FN' ) IS NOT NULL + drop FUNCTION dbo.fnGetColumnsString2; +go +-- ............................................................................................ + + +-- -------------------------------------------------------------------------------------------- +-- Create function fnGetColumnsString2 +-- -------------------------------------------------------------------------------------------- +CREATE FUNCTION dbo.fnGetColumnsString2 ( @str NVARCHAR(4000) ) +RETURNS NVARCHAR(max) +AS +BEGIN + DECLARE @retval NVARCHAR(max) = ''; + + declare @statement_sql cursor + set @statement_sql = cursor for + select COLUMN_NAME from INFORMATION_SCHEMA.columns + where TABLE_NAME = @str + and DATA_TYPE != 'varbinary' and coalesce(character_maximum_length,1) != -1 + order by table_name, ORDINAL_POSITION; + + declare @sql_txt1 nvarchar(max) = ''; + OPEN @statement_sql + FETCH NEXT + FROM @statement_sql INTO @sql_txt1 + WHILE @@FETCH_STATUS = 0 + begin + set @retval = @retval + '['+ @sql_txt1+'], '; + FETCH NEXT + FROM @statement_sql INTO @sql_txt1 + END + + CLOSE @statement_sql + DEALLOCATE @statement_sql + + RETURN @retval; +END +GO +-- ............................................................................................ + +--:OUT "G:\OneDrive\Documents\LMS Biz\Quartech\MOTI\PSP\Data Model\Build\Working\ORBC_iud_trigger.sql" + +begin + +declare @statement_sql cursor +declare @sql_txt varchar(max) = ''; +--declare @previous_sql_txt varchar(max) = ''; + +set @statement_sql = cursor for +select distinct N'CREATE TRIGGER '+isnull(convert(varchar(max),p.value), stuff(dbo.fnFirsties(replace(t.name,'_',' ')),1,1,'')+cast(row_number()over(order by t.name asc) as varchar(max)))+'_A_S_IUD_TR ON [' + s.name + '].[' + t.name + '] FOR INSERT, UPDATE, DELETE AS +SET NOCOUNT ON +BEGIN TRY +DECLARE @curr_date datetime; +SET @curr_date = getutcdate(); + IF NOT EXISTS(SELECT * FROM inserted) AND NOT EXISTS(SELECT * FROM deleted) + RETURN; + + -- historical + IF EXISTS(SELECT * FROM deleted) + update [' + s.name + '].[' + t.name + '_HIST] set END_DATE_HIST = @curr_date where ' + ccu.COLUMN_NAME + ' in (select ' + ccu.COLUMN_NAME + ' from deleted) and END_DATE_HIST is null; + + IF EXISTS(SELECT * FROM inserted) + insert into [' + s.name + '].[' + t.name + '_HIST] (' + dbo.fnGetColumnsString2(t.name) + substring(t.name, 5, len(t.name)) + '_HIST_ID, END_DATE_HIST, EFFECTIVE_DATE_HIST) + select ' + dbo.fnGetColumnsString2(t.name) + '(next value for [' + s.name + '].[' + t.name + '_H_ID_SEQ]) as ['+substring(t.name, 5, len(t.name)) + '_HIST_ID], null as [END_DATE_HIST], @curr_date as [EFFECTIVE_DATE_HIST] from inserted; + +END TRY +BEGIN CATCH + IF @@trancount > 0 ROLLBACK TRANSACTION + EXEC orbc_error_handling +END CATCH; +go + +' +from sys.tables t join + sys.schemas s on s.schema_id = t.schema_id left join + (select table_alias COLLATE catalog_default value + , table_name COLLATE catalog_default table_name + from ORBCX_TableDefinitions) p on t.name COLLATE catalog_default = p.table_name COLLATE catalog_default, + INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc INNER JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE AS ccu ON tc.CONSTRAINT_NAME = ccu.CONSTRAINT_NAME +WHERE t.TYPE_desc = 'USER_TABLE' + and t.NAME like 'ORBC_%' + and tc.table_name = t.name + and tc.CONSTRAINT_TYPE = 'PRIMARY KEY' + and t.NAME not like '%HIST' + and t.NAME not like 'ORBCX%' + and t.NAME not like '%EFMigration%' + and t.NAME not like 'ETL%' + and t.NAME not like 'PMBC%' + and t.NAME not like '%SYS_VERS%' + -- code value (type and subtype) tables + and t.NAME not like '%TYPE' + and t.NAME not like '%SUBTYPE' + -- tables that do no have APP audit attributes + and t.name != 'ORBC_COUNTRY' + and t.name != 'ORBC_DISTRICT' + and t.name != 'ORBC_PROVINCE_STATE' + and t.name != 'ORBC_REGION' + and t.name != 'ORBC_TENANT' + and s.name != 'tps' +order by 1; + +OPEN @statement_sql +FETCH NEXT +FROM @statement_sql INTO @sql_txt +WHILE @@FETCH_STATUS = 0 +BEGIN + print @sql_txt + FETCH NEXT + FROM @statement_sql INTO @sql_txt +END + +CLOSE @statement_sql +DEALLOCATE @statement_sql + +end + +-- -------------------------------------------------------------------------------------------- +-- Drop functions created earlier +-- -------------------------------------------------------------------------------------------- + +drop function dbo.fnFirsties; +drop function fnGetColumnsString; +drop function fnGetColumnsString2; \ No newline at end of file diff --git a/database/mssql/scripts/history-tables-instructions.md b/database/mssql/scripts/history-tables-instructions.md new file mode 100644 index 000000000..08a1282c6 --- /dev/null +++ b/database/mssql/scripts/history-tables-instructions.md @@ -0,0 +1,35 @@ +# History Tables and Triggers +MoTI database standards dictate a specific approach for maintaining history of database changes. This is handled in ORBC with 'mirror' history tables, named identically to the base table with a _HIST suffix. + +The history tables are populated on each insert, update, and delete operation via a trigger on the base table which inserts a new row into the history table for every action. + +The history tables rely on a database sequence to generate their unique identifier (as opposed to identity columns which are typically used in ORBC for this purpose in the base tables). + +## New Tables +Each new table created in the ORBC database which is not a 'lookup' or 'type' table will need three additional objects created alongside: a history table, a trigger, and a sequence. + +For new tables, the SQL to generate these three objects can be retrieved by running the generate-history-tables-and-triggers.sql file in your local (docker) development database once the new business tables are in place. The .sql file will generate the DDL for all base tables in the database, not just the new ones you've added, so you will need to search the output for your new table name to find the three objects. You can ignore the rest. + +The name of the trigger that the .sql generates in the DDL is not appropriate - you will need to come up with an appropriate name for the trigger that is based on a shortened version of the base table name. Refer to the other triggers in the database for guidance - it isn't critical that it be done a certain way just that it be fairly consistent with the rest of the trigger names, and that it be unique in the database. + +## Updated Tables +When a table is updated in ORBC to add or remove columns, to change the data type of the column, or to change a column from nullable to non-nullable, more manual effort is required. + +__Important__: when copying the DDL that's generated from the attached .sql script, __do not__ copy the 'drop table' or 'drop sequence' components. History tables, once modified, are to remain permanently in the database. For sequences, if it is dropped and re-created it will start at 1 again which will generate errors. + +### Column Additions +New columns must be added to both the history table and the trigger. You can use the generated DDL for guidance with how to add it, or you can add it in manually if just one or two columns (probably easier that way). + +### Column Deletions +Deleted columns must be removed from the trigger, but should remain in the history table. Never delete any columns with data from the history tables, they will remain in perpetuity. + +### Column Renames +However the column rename is done in the base table DDL is how it should be done also in the history table DDL. The trigger will also need to be updated to reflect the new column name, though this is just a text modification to the trigger DDL and not as complex as the table rename. + +### Column Data Type Changes +As with the column renames, the column data type changes must be done in the history table in the same way as it is done in the base table (avoidance of data loss / truncation is important). No changes need to be made to the trigger DDL. + +### Column NULL / NOT NULL Switches +Columns changing from NOT NULL to NULL require that the same change be done to the history table. No changes are required to the trigger. + +Columns changing from NULL to NOT NULL require __no__ changes to the history table to avoid creating fake 'history' data where null is appropriate. No changes are required to the trigger. \ No newline at end of file From 97e4370d30e88a1edbf0da8f81ec6be1e599b1c6 Mon Sep 17 00:00:00 2001 From: John Fletcher <113134542+john-fletcher-aot@users.noreply.github.com> Date: Fri, 4 Oct 2024 14:26:14 -0700 Subject: [PATCH 60/63] feat: Increment version for policy-engine for NPM package (#1629) --- policy-engine/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/policy-engine/package.json b/policy-engine/package.json index 55ac20d00..7a846121b 100644 --- a/policy-engine/package.json +++ b/policy-engine/package.json @@ -1,6 +1,6 @@ { "name": "onroute-policy-engine", - "version": "0.1.0", + "version": "0.2.0", "description": "Policy Engine library for commercial vehicle permitting", "main": "dist/index.js", "exports": { From c277fecfdabb8e2c7ebb8e9977b6a810bcdf96cb Mon Sep 17 00:00:00 2001 From: bcgov-brwang <87880048+bcgov-brwang@users.noreply.github.com> Date: Tue, 8 Oct 2024 14:38:37 -0700 Subject: [PATCH 61/63] ORV2-2780: added idir test cases --- .../orbc_load_test_plan_frontend_bceid.jmx | 9 +- .../orbc_load_test_plan_frontend_idir.jmx | 276 ++++++++++++++++-- 2 files changed, 251 insertions(+), 34 deletions(-) diff --git a/loadtests/frontend/orbc_load_test_plan_frontend_bceid.jmx b/loadtests/frontend/orbc_load_test_plan_frontend_bceid.jmx index 68483a4cf..73fb29947 100644 --- a/loadtests/frontend/orbc_load_test_plan_frontend_bceid.jmx +++ b/loadtests/frontend/orbc_load_test_plan_frontend_bceid.jmx @@ -59,12 +59,12 @@
USER - ORBCTST1 + = PASSWORD - orbcTST2023+ + = @@ -88,7 +88,7 @@ false true - C:\Users\BRWANG\Software\chromedriver-win64\chromedriver-win64-129\chromedriver.exe + C:\Users\brwang\software\chromedriver-win64\chromedriver-win64-129\chromedriver.exe false false true @@ -142,6 +142,9 @@ import java.util.function.Consumer WDS.sampleResult.sampleStart() +WDS.log.info "Groovy version: ${GroovySystem.version}" + + def frontendUrl = WDS.vars.get("FRONTEND_URL") WDS.browser.get(frontendUrl) Thread.sleep(5000) diff --git a/loadtests/frontend/orbc_load_test_plan_frontend_idir.jmx b/loadtests/frontend/orbc_load_test_plan_frontend_idir.jmx index ef1decf49..99c9b68a9 100644 --- a/loadtests/frontend/orbc_load_test_plan_frontend_idir.jmx +++ b/loadtests/frontend/orbc_load_test_plan_frontend_idir.jmx @@ -17,11 +17,34 @@ + + 8889 + + + true + 0 + false + + false + true + true + true + false + 0 + + + + false + false + + + + NUM_THREADS - 200 + 1 = @@ -44,13 +67,33 @@ = + + GET_POWERUNITS_URL + https://onroutebc-test-vehicles.apps.silver.devops.gov.bc.ca/companies/104/vehicles/powerUnits + = + + + GET_TRAILERS_URL + https://onroutebc-test-vehicles.apps.silver.devops.gov.bc.ca/companies/104/vehicles/trailers + = + + + BEARER_TOKEN + + = + + + VEHICLES_API_URL + https://onroutebc-test-vehicles.apps.silver.devops.gov.bc.ca + = + false true - C:\Users\BRWANG\Software\chromedriver-win64\chromedriver-win64\chromedriver.exe + C:\Users\brwang\software\chromedriver-win64\chromedriver-win64-129\chromedriver.exe false false true @@ -87,18 +130,30 @@ true
- + import org.openqa.selenium.By import org.openqa.selenium.support.ui.ExpectedConditions import org.openqa.selenium.support.ui.WebDriverWait import org.openqa.selenium.WebElement +import org.openqa.selenium.devtools.DevTools; +import org.openqa.selenium.devtools.v129.network.Network; +import java.util.Optional; +import org.openqa.selenium.logging.LogType +import org.openqa.selenium.logging.LogEntries +import org.openqa.selenium.chrome.ChromeOptions +import org.openqa.selenium.logging.LoggingPreferences +import java.util.logging.Level +import java.util.function.Consumer WDS.sampleResult.sampleStart() + +WDS.log.info "Groovy version: ${GroovySystem.version}" + + def frontendUrl = WDS.vars.get("FRONTEND_URL") -WDS.browser.get(frontendUrl); +WDS.browser.get(frontendUrl) Thread.sleep(5000) - def loginButton = WDS.browser.findElement(By.id('login-idir')) if (loginButton != null) { loginButton.click() @@ -107,42 +162,53 @@ if (loginButton != null) { WDS.log.info("Button with id 'login-bceid' not found") } -Thread.sleep(10000) -/* -def user = WDS.browser.findElement(By.id('user')) -def password = WDS.browser.findElement(By.id('password')) +Thread.sleep(5000) -def userValue = WDS.vars.get("USER") -def passwordValue = WDS.vars.get("PASSWORD") -if(user != null && password != null) -{ +/* +try { + def user = WDS.browser.findElement(By.id('user')) + def password = WDS.browser.findElement(By.id('password')) + if (user != null) { + def userValue = WDS.vars.get("USER") + def passwordValue = WDS.vars.get("PASSWORD") user.sendKeys(userValue) password.sendKeys(passwordValue) Thread.sleep(5000) + + def submitButton = WDS.browser.findElement(By.name('btnSubmit')) + if (submitButton != null) { + submitButton.click() + } else { + WDS.log.info('Submit button with name="btnSubmit" not found') } - - -def submitButton = WDS.browser.findElement(By.name('btnSubmit')) -if (submitButton != null) { - submitButton.click() -} else { - WDS.log.info('Submit button with name="btnSubmit" not found') + Thread.sleep(5000) + } +} catch (NoSuchElementException e) { + WDS.log.info('User element not found.') } -Thread.sleep(10000) */ + -// idir user search applications - -def searchIcon = WDS.browser.findElement(By.className('search-button')) -searchIcon.click() -Thread.sleep(5000) - -def searchInput = WDS.browser.findElement(By.className('css-1pog434')) -searchInput.sendKeys('p') +def devTools = ((org.openqa.selenium.chrome.ChromeDriver) WDS.browser).getDevTools() +devTools.createSession() +devTools.send(Network.enable(Optional.empty(), Optional.empty(), Optional.empty())) +devTools.addListener(Network.requestWillBeSent(), { request -> + if (request.getRequest().getUrl().contains("https")) { + def headers = request.getRequest().getHeaders() + def authHeader = headers.get("Authorization") + if (authHeader != null && authHeader.startsWith("Bearer ")) { + def token = authHeader.replace("Bearer ", "") + WDS.log.info("Extracted Token: " + token) + WDS.vars.put("BEARER_TOKEN", token) + } + } + else { + WDS.log.info("bruce test no token: ") + } +} as Consumer) Thread.sleep(5000) -def searchButton = WDS.browser.findElement(By.className('search-by__search')) -searchButton.click() +WDS.browser.get(frontendUrl) Thread.sleep(5000) WDS.sampleResult.sampleEnd() @@ -151,6 +217,154 @@ WDS.sampleResult.sampleEnd() groovy + + + + + + + + + ${VEHICLES_API_URL}/permits?searchColumn=permitNumber&searchString=1&page=1&take=10 + GET + true + false + true + false + + + + + + + + + Authorization + Bearer ${BEARER_TOKEN} + + + Accept + application/json + + + Content-Type + application/json + + + + + + + + + + + + + + ${VEHICLES_API_URL}/users?userRole=PPCCLERK&permitIssuerPPCUser=true + GET + true + false + true + false + + + + + + + + + Authorization + Bearer ${BEARER_TOKEN} + + + Accept + application/json + + + Content-Type + application/json + + + + + + + + + + + + + + ${VEHICLES_API_URL}/users/claims?companyId=74 + GET + true + false + true + false + + + + + + + + + Authorization + Bearer ${BEARER_TOKEN} + + + Accept + application/json + + + Content-Type + application/json + + + + + + + + + + + + + + ${VEHICLES_API_URL}/users/user-context + POST + true + false + true + false + + + + + + + + + Authorization + Bearer ${BEARER_TOKEN} + + + Accept + application/json + + + Content-Type + application/json + + + + + false From 4c38f782553250d45510371ce7e12928f499f356 Mon Sep 17 00:00:00 2001 From: bcgov-brwang <87880048+bcgov-brwang@users.noreply.github.com> Date: Tue, 8 Oct 2024 15:09:07 -0700 Subject: [PATCH 62/63] ORV2-2780: added frontend test cases --- ...test_plan_frontend_amend_term_oversize.jmx | 304 ++++++++++++++++ ..._load_test_plan_frontend_term_oversize.jmx | 334 ++++++++++++++++++ ...oad_test_plan_frontend_term_overweight.jmx | 332 +++++++++++++++++ ..._test_plan_frontend_void_term_oversize.jmx | 277 +++++++++++++++ 4 files changed, 1247 insertions(+) create mode 100644 loadtests/frontend/orbc_load_test_plan_frontend_amend_term_oversize.jmx create mode 100644 loadtests/frontend/orbc_load_test_plan_frontend_term_oversize.jmx create mode 100644 loadtests/frontend/orbc_load_test_plan_frontend_term_overweight.jmx create mode 100644 loadtests/frontend/orbc_load_test_plan_frontend_void_term_oversize.jmx diff --git a/loadtests/frontend/orbc_load_test_plan_frontend_amend_term_oversize.jmx b/loadtests/frontend/orbc_load_test_plan_frontend_amend_term_oversize.jmx new file mode 100644 index 000000000..43eaf966a --- /dev/null +++ b/loadtests/frontend/orbc_load_test_plan_frontend_amend_term_oversize.jmx @@ -0,0 +1,304 @@ + + + + + + false + false + + + + Duration + 3180 + = + + + + + + + + + + NUM_THREADS + 200 + = + + + FRONTEND_URL + https://onroutebc-test-frontend.apps.silver.devops.gov.bc.ca + = + + + RESULTS_DIR + ~/results + = + + + USER + + = + + + PASSWORD + + = + + + AMEND_URL + https://onroutebc-test-frontend.apps.silver.devops.gov.bc.ca/companies/1/permits/421/amend + = + + + + + + false + true + C:\Users\brwang\Software\chromedriver-win64\chromedriver-win64-129\chromedriver.exe + false + false + true + + + SYSTEM + + + 8080 + true + + 8080 + true + + 8080 + true + + 8080 + localhost + + + + + continue + + false + 1 + + 1 + 1 + false + + + true + + + + import org.openqa.selenium.By +import org.openqa.selenium.support.ui.ExpectedConditions +import org.openqa.selenium.support.ui.WebDriverWait +import org.openqa.selenium.WebElement + +WDS.sampleResult.sampleStart() +def frontendUrl = WDS.vars.get("FRONTEND_URL") +WDS.browser.get(frontendUrl); +Thread.sleep(5000) + +def loginButton = WDS.browser.findElement(By.id('login-idir')) +if (loginButton != null) { + loginButton.click() + WDS.log.info("Clicked on the login-bceid button") +} else { + WDS.log.info("Button with id 'login-bceid' not found") +} +Thread.sleep(10000) + +def searchIcon = WDS.browser.findElement(By.className('search-button')) +searchIcon.click() +Thread.sleep(5000) + +def company = WDS.browser.findElement(By.cssSelector('[value="companies"]')) +company.click() +Thread.sleep(5000) + + +def searchInput = WDS.browser.findElement(By.className('css-1pog434')) +searchInput.sendKeys('p') +Thread.sleep(5000) + +def searchButton = WDS.browser.findElement(By.className('search-by__search')) +searchButton.click() +Thread.sleep(5000) + +def button = WDS.browser.findElement(By.xpath("//button[text()='Test Transport Inc.']")) +button.click() +Thread.sleep(5000) +def tab = WDS.browser.findElement(By.xpath("//div[@class='tab__label' and text()='Active Permits']")) +tab.click() +Thread.sleep(5000) + +def amendUrl = WDS.vars.get("AMEND_URL") +WDS.browser.get(amendUrl); +Thread.sleep(5000) + +def year = WDS.browser.findElement(By.cssSelector('[name="permitData.vehicleDetails.year"]')) +year.clear() +year.sendKeys("2008") +Thread.sleep(5000) + +def amendment = WDS.browser.findElement(By.cssSelector('[name="comment"]')) +amendment.clear() +amendment.sendKeys("Make year updated") +Thread.sleep(5000) + + +def continueButton = WDS.browser.findElement(By.cssSelector('[data-testid="continue-application-button"]')) +Thread.sleep(5000) + +if (continueButton != null) { + continueButton.click() + WDS.log.info('Clicked the button with data-testid="continue-application-button"') +} else { + WDS.log.info('Button with data-testid="continue-application-button" not found') +} + +Thread.sleep(10000) +def checkboxes = WDS.browser.findElements(By.cssSelector('input[type="checkbox"]')) +checkboxes.each { checkbox -> + WDS.browser.executeScript("window.scrollTo(0, arguments[0].getBoundingClientRect().top + window.pageYOffset - 100);", checkbox) + if (!checkbox.isSelected()) { + checkbox.click() + } +} +Thread.sleep(5000) + +def continueBtn = WDS.browser.findElement(By.xpath("//button[text()='Continue']")) +WDS.browser.executeScript("window.scrollTo(0, arguments[0].getBoundingClientRect().top + window.pageYOffset - 100);", continueBtn) +continueBtn.click() +Thread.sleep(5000) + +def finish = WDS.browser.findElement(By.xpath("//button[text()='Finish']")) +WDS.browser.executeScript("window.scrollTo(0, arguments[0].getBoundingClientRect().top + window.pageYOffset - 100);", finish) +finish.click() +Thread.sleep(5000) + +WDS.sampleResult.sampleEnd() + + + groovy + + + + + false + + saveConfig + + + true + true + true + + true + true + true + true + false + true + true + false + false + false + true + false + false + false + true + 0 + true + true + true + true + true + true + + + + + + + false + + saveConfig + + + true + true + true + + true + true + true + true + false + true + true + false + false + false + true + false + false + false + true + 0 + true + true + true + true + true + true + + + + + + + false + + saveConfig + + + true + true + true + + true + true + true + true + false + true + true + false + false + false + true + false + false + false + true + 0 + true + true + true + true + true + true + + + ${RESULTS_DIR}/frontend.csv + + + + + diff --git a/loadtests/frontend/orbc_load_test_plan_frontend_term_oversize.jmx b/loadtests/frontend/orbc_load_test_plan_frontend_term_oversize.jmx new file mode 100644 index 000000000..99a77351c --- /dev/null +++ b/loadtests/frontend/orbc_load_test_plan_frontend_term_oversize.jmx @@ -0,0 +1,334 @@ + + + + + + false + false + + + + Duration + 3180 + = + + + + + + + + + + NUM_THREADS + 1 + = + + + FRONTEND_URL + https://onroutebc-test-frontend.apps.silver.devops.gov.bc.ca + = + + + RESULTS_DIR + ~/results + = + + + USER + + = + + + PASSWORD + + = + + + NEW_APPLICATION_URL + https://onroutebc-test-frontend.apps.silver.devops.gov.bc.ca/create-application/TROS + = + + + + + + false + true + C:\Users\brwang\Software\chromedriver-win64\chromedriver-win64-129\chromedriver.exe + false + false + true + + + SYSTEM + + + 8080 + true + + 8080 + true + + 8080 + true + + 8080 + localhost + + + + + continue + + false + 1 + + 1 + 1 + false + + + true + + + + import org.openqa.selenium.By +import org.openqa.selenium.support.ui.ExpectedConditions +import org.openqa.selenium.support.ui.WebDriverWait +import org.openqa.selenium.WebElement + +WDS.sampleResult.sampleStart() +def frontendUrl = WDS.vars.get("FRONTEND_URL") +WDS.browser.get(frontendUrl); +Thread.sleep(5000) + + +def loginButton = WDS.browser.findElement(By.id('login-bceid')) +if (loginButton != null) { + loginButton.click() + WDS.log.info("Clicked on the login-bceid button") +} else { + WDS.log.info("Button with id 'login-bceid' not found") +} + +Thread.sleep(10000) +def user = WDS.browser.findElement(By.id('user')) +def password = WDS.browser.findElement(By.id('password')) + +def userValue = WDS.vars.get("USER") +def passwordValue = WDS.vars.get("PASSWORD") +user.sendKeys(userValue) +password.sendKeys(passwordValue) +Thread.sleep(5000) + +def submitButton = WDS.browser.findElement(By.name('btnSubmit')) +if (submitButton != null) { + submitButton.click() +} else { + WDS.log.info('Submit button with name="btnSubmit" not found') +} +Thread.sleep(10000) + +// start a new application +def newApplicationUrl = WDS.vars.get("NEW_APPLICATION_URL") +WDS.browser.get(newApplicationUrl); +Thread.sleep(5000) + +def selectedVehicle = WDS.browser.findElement(By.id('application-select-vehicle')) +selectedVehicle.sendKeys("MCL36") +Thread.sleep(5000) +def vin = WDS.browser.findElement(By.cssSelector('[name="permitData.vehicleDetails.vin"]')) +vin.sendKeys("MCL36A") +Thread.sleep(5000) +def plate = WDS.browser.findElement(By.cssSelector('[name="permitData.vehicleDetails.plate"]')) +plate.sendKeys("L4NDO") +Thread.sleep(5000) +def make = WDS.browser.findElement(By.cssSelector('[name="permitData.vehicleDetails.make"]')) +make.sendKeys("BMW") +Thread.sleep(5000) +def year = WDS.browser.findElement(By.cssSelector('[name="permitData.vehicleDetails.year"]')) +year.sendKeys("2020") +Thread.sleep(5000) +def country = WDS.browser.findElement(By.id('mui-component-select-permitData.vehicleDetails.countryCode')) +WDS.browser.executeScript("window.scrollTo(0, arguments[0].getBoundingClientRect().top + window.pageYOffset - 100);", country) +country.click() +Thread.sleep(5000) +def ca = WDS.browser.findElement(By.cssSelector('[data-value="CA"]')) +ca.click() +Thread.sleep(5000) +def province = WDS.browser.findElement(By.id('mui-component-select-permitData.vehicleDetails.provinceCode')) +province.click() +Thread.sleep(5000) +def bc = WDS.browser.findElement(By.cssSelector('[data-value="BC"]')) +bc.click() +Thread.sleep(5000) +def vehicleType = WDS.browser.findElement(By.id('mui-component-select-permitData.vehicleDetails.vehicleType')) +vehicleType.click() +def powerUnit = WDS.browser.findElement(By.cssSelector('[data-value="powerUnit"]')) +powerUnit.click() +Thread.sleep(5000) + + +Thread.sleep(5000) +def vehicleSubType = WDS.browser.findElement(By.id('mui-component-select-permitData.vehicleDetails.vehicleSubType')) +vehicleSubType.click() +def trucks = WDS.browser.findElement(By.cssSelector('[data-value="REGTRCK"]')) +trucks.click() +Thread.sleep(5000) + +def continueButton = WDS.browser.findElement(By.cssSelector('[data-testid="continue-application-button"]')) +Thread.sleep(5000) + +if (continueButton != null) { + continueButton.click() + WDS.log.info('Clicked the button with data-testid="continue-application-button"') +} else { + WDS.log.info('Button with data-testid="continue-application-button" not found') +} + +Thread.sleep(10000) +def checkboxes = WDS.browser.findElements(By.cssSelector('input[type="checkbox"]')) +checkboxes.each { checkbox -> + WDS.browser.executeScript("window.scrollTo(0, arguments[0].getBoundingClientRect().top + window.pageYOffset - 100);", checkbox) + if (!checkbox.isSelected()) { + checkbox.click() + } +} + +Thread.sleep(5000) +def addToCart = WDS.browser.findElement(By.cssSelector('[data-testid="add-to-cart-btn"]')) +addToCart.click() + +Thread.sleep(10000) +def shoppingCart = WDS.browser.findElement(By.className('shopping-cart-button')) +shoppingCart.click() + +Thread.sleep(5000) +def payNow = WDS.browser.findElement(By.cssSelector('[data-testid="pay-now-btn"]')) +WDS.browser.executeScript("window.scrollTo(0, arguments[0].getBoundingClientRect().top + window.pageYOffset - 100);", payNow) +payNow.click() + +Thread.sleep(5000) + +WDS.sampleResult.sampleEnd() + + + groovy + + + + + false + + saveConfig + + + true + true + true + + true + true + true + true + false + true + true + false + false + false + true + false + false + false + true + 0 + true + true + true + true + true + true + + + + + + + false + + saveConfig + + + true + true + true + + true + true + true + true + false + true + true + false + false + false + true + false + false + false + true + 0 + true + true + true + true + true + true + + + + + + + false + + saveConfig + + + true + true + true + + true + true + true + true + false + true + true + false + false + false + true + false + false + false + true + 0 + true + true + true + true + true + true + + + ${RESULTS_DIR}/frontend.csv + + + + + diff --git a/loadtests/frontend/orbc_load_test_plan_frontend_term_overweight.jmx b/loadtests/frontend/orbc_load_test_plan_frontend_term_overweight.jmx new file mode 100644 index 000000000..600ad2a5e --- /dev/null +++ b/loadtests/frontend/orbc_load_test_plan_frontend_term_overweight.jmx @@ -0,0 +1,332 @@ + + + + + + false + false + + + + Duration + 3180 + = + + + + + + + + + + NUM_THREADS + 1 + = + + + FRONTEND_URL + https://onroutebc-test-frontend.apps.silver.devops.gov.bc.ca + = + + + RESULTS_DIR + ~/results + = + + + USER + + = + + + PASSWORD + + = + + + NEW_APPLICATION_URL + https://onroutebc-test-frontend.apps.silver.devops.gov.bc.ca/create-application/TROW + = + + + + + + false + true + C:\Users\brwang\Software\chromedriver-win64\chromedriver-win64-129\chromedriver.exe + false + false + true + + + SYSTEM + + + 8080 + true + + 8080 + true + + 8080 + true + + 8080 + localhost + + + + + continue + + false + 1 + + 1 + 1 + false + + + true + + + + import org.openqa.selenium.By +import org.openqa.selenium.support.ui.ExpectedConditions +import org.openqa.selenium.support.ui.WebDriverWait +import org.openqa.selenium.WebElement + +WDS.sampleResult.sampleStart() +def frontendUrl = WDS.vars.get("FRONTEND_URL") +WDS.browser.get(frontendUrl); +Thread.sleep(5000) + + +def loginButton = WDS.browser.findElement(By.id('login-bceid')) +if (loginButton != null) { + loginButton.click() + WDS.log.info("Clicked on the login-bceid button") +} else { + WDS.log.info("Button with id 'login-bceid' not found") +} + +Thread.sleep(10000) +def user = WDS.browser.findElement(By.id('user')) +def password = WDS.browser.findElement(By.id('password')) + +def userValue = WDS.vars.get("USER") +def passwordValue = WDS.vars.get("PASSWORD") +user.sendKeys(userValue) +password.sendKeys(passwordValue) +Thread.sleep(5000) + +def submitButton = WDS.browser.findElement(By.name('btnSubmit')) +if (submitButton != null) { + submitButton.click() +} else { + WDS.log.info('Submit button with name="btnSubmit" not found') +} +Thread.sleep(10000) + +// start a new application +def newApplicationUrl = WDS.vars.get("NEW_APPLICATION_URL") +WDS.browser.get(newApplicationUrl); +Thread.sleep(5000) + +def selectedVehicle = WDS.browser.findElement(By.id('application-select-vehicle')) +selectedVehicle.sendKeys("123") +Thread.sleep(5000) +def vin = WDS.browser.findElement(By.cssSelector('[name="permitData.vehicleDetails.vin"]')) +vin.sendKeys("115588") +Thread.sleep(5000) +def plate = WDS.browser.findElement(By.cssSelector('[name="permitData.vehicleDetails.plate"]')) +plate.sendKeys("1B25F") +Thread.sleep(5000) +def make = WDS.browser.findElement(By.cssSelector('[name="permitData.vehicleDetails.make"]')) +make.sendKeys("PHIL") +Thread.sleep(5000) +def year = WDS.browser.findElement(By.cssSelector('[name="permitData.vehicleDetails.year"]')) +year.sendKeys("1992") +Thread.sleep(5000) +def country = WDS.browser.findElement(By.id('mui-component-select-permitData.vehicleDetails.countryCode')) +WDS.browser.executeScript("window.scrollTo(0, arguments[0].getBoundingClientRect().top + window.pageYOffset - 100);", country) +country.click() +Thread.sleep(5000) +def ca = WDS.browser.findElement(By.cssSelector('[data-value="CA"]')) +ca.click() +Thread.sleep(5000) +def province = WDS.browser.findElement(By.id('mui-component-select-permitData.vehicleDetails.provinceCode')) +province.click() +Thread.sleep(5000) +def bc = WDS.browser.findElement(By.cssSelector('[data-value="BC"]')) +bc.click() +Thread.sleep(5000) +def vehicleType = WDS.browser.findElement(By.id('mui-component-select-permitData.vehicleDetails.vehicleType')) +vehicleType.click() +def trailer = WDS.browser.findElement(By.cssSelector('[data-value="trailer"]')) +trailer.click() + +Thread.sleep(5000) +def vehicleSubType = WDS.browser.findElement(By.id('mui-component-select-permitData.vehicleDetails.vehicleSubType')) +vehicleSubType.click() +def dollies = WDS.browser.findElement(By.cssSelector('[data-value="DOLLIES"]')) +dollies.click() +Thread.sleep(5000) + +def continueButton = WDS.browser.findElement(By.cssSelector('[data-testid="continue-application-button"]')) +Thread.sleep(5000) + +if (continueButton != null) { + continueButton.click() + WDS.log.info('Clicked the button with data-testid="continue-application-button"') +} else { + WDS.log.info('Button with data-testid="continue-application-button" not found') +} + +Thread.sleep(10000) +def checkboxes = WDS.browser.findElements(By.cssSelector('input[type="checkbox"]')) +checkboxes.each { checkbox -> + WDS.browser.executeScript("window.scrollTo(0, arguments[0].getBoundingClientRect().top + window.pageYOffset - 100);", checkbox) + if (!checkbox.isSelected()) { + checkbox.click() + } +} + +Thread.sleep(5000) +def addToCart = WDS.browser.findElement(By.cssSelector('[data-testid="add-to-cart-btn"]')) +addToCart.click() + +Thread.sleep(10000) +def shoppingCart = WDS.browser.findElement(By.className('shopping-cart-button')) +shoppingCart.click() + +Thread.sleep(5000) +def payNow = WDS.browser.findElement(By.cssSelector('[data-testid="pay-now-btn"]')) +WDS.browser.executeScript("window.scrollTo(0, arguments[0].getBoundingClientRect().top + window.pageYOffset - 100);", payNow) +payNow.click() + +Thread.sleep(5000) + +WDS.sampleResult.sampleEnd() + + + groovy + + + + + false + + saveConfig + + + true + true + true + + true + true + true + true + false + true + true + false + false + false + true + false + false + false + true + 0 + true + true + true + true + true + true + + + + + + + false + + saveConfig + + + true + true + true + + true + true + true + true + false + true + true + false + false + false + true + false + false + false + true + 0 + true + true + true + true + true + true + + + + + + + false + + saveConfig + + + true + true + true + + true + true + true + true + false + true + true + false + false + false + true + false + false + false + true + 0 + true + true + true + true + true + true + + + ${RESULTS_DIR}/frontend.csv + + + + + diff --git a/loadtests/frontend/orbc_load_test_plan_frontend_void_term_oversize.jmx b/loadtests/frontend/orbc_load_test_plan_frontend_void_term_oversize.jmx new file mode 100644 index 000000000..a7fddd854 --- /dev/null +++ b/loadtests/frontend/orbc_load_test_plan_frontend_void_term_oversize.jmx @@ -0,0 +1,277 @@ + + + + + + false + false + + + + Duration + 3180 + = + + + + + + + + + + NUM_THREADS + 200 + = + + + FRONTEND_URL + https://onroutebc-test-frontend.apps.silver.devops.gov.bc.ca + = + + + RESULTS_DIR + ~/results + = + + + USER + + = + + + PASSWORD + + = + + + VOID_URL + https://onroutebc-test-frontend.apps.silver.devops.gov.bc.ca/companies/1/permits/457/void + = + + + + + + false + true + C:\Users\brwang\Software\chromedriver-win64\chromedriver-win64-129\chromedriver.exe + false + false + true + + + SYSTEM + + + 8080 + true + + 8080 + true + + 8080 + true + + 8080 + localhost + + + + + continue + + false + 1 + + 1 + 1 + false + + + true + + + + import org.openqa.selenium.By +import org.openqa.selenium.support.ui.ExpectedConditions +import org.openqa.selenium.support.ui.WebDriverWait +import org.openqa.selenium.WebElement + +WDS.sampleResult.sampleStart() +def frontendUrl = WDS.vars.get("FRONTEND_URL") +WDS.browser.get(frontendUrl); +Thread.sleep(5000) + +def loginButton = WDS.browser.findElement(By.id('login-idir')) +if (loginButton != null) { + loginButton.click() + WDS.log.info("Clicked on the login-bceid button") +} else { + WDS.log.info("Button with id 'login-bceid' not found") +} +Thread.sleep(10000) + +def searchIcon = WDS.browser.findElement(By.className('search-button')) +searchIcon.click() +Thread.sleep(5000) + +def company = WDS.browser.findElement(By.cssSelector('[value="companies"]')) +company.click() +Thread.sleep(5000) + + +def searchInput = WDS.browser.findElement(By.className('css-1pog434')) +searchInput.sendKeys('p') +Thread.sleep(5000) + +def searchButton = WDS.browser.findElement(By.className('search-by__search')) +searchButton.click() +Thread.sleep(5000) + +def button = WDS.browser.findElement(By.xpath("//button[text()='Test Transport Inc.']")) +button.click() +Thread.sleep(5000) +def tab = WDS.browser.findElement(By.xpath("//div[@class='tab__label' and text()='Active Permits']")) +tab.click() +Thread.sleep(5000) + +def voidUrl = WDS.vars.get("VOID_URL") +WDS.browser.get(voidUrl); +Thread.sleep(5000) + +def reason = WDS.browser.findElement(By.cssSelector('[name="reason"]')) +reason.sendKeys("test to void a appliation") +Thread.sleep(5000) + +def continueBtn = WDS.browser.findElement(By.xpath("//button[text()='Continue']")) +WDS.browser.executeScript("window.scrollTo(0, arguments[0].getBoundingClientRect().top + window.pageYOffset - 100);", continueBtn) +continueBtn.click() +Thread.sleep(5000) + +def finish = WDS.browser.findElement(By.xpath("//button[text()='Finish']")) +WDS.browser.executeScript("window.scrollTo(0, arguments[0].getBoundingClientRect().top + window.pageYOffset - 100);", finish) +finish.click() +Thread.sleep(5000) + +WDS.sampleResult.sampleEnd() + + + groovy + + + + + false + + saveConfig + + + true + true + true + + true + true + true + true + false + true + true + false + false + false + true + false + false + false + true + 0 + true + true + true + true + true + true + + + + + + + false + + saveConfig + + + true + true + true + + true + true + true + true + false + true + true + false + false + false + true + false + false + false + true + 0 + true + true + true + true + true + true + + + + + + + false + + saveConfig + + + true + true + true + + true + true + true + true + false + true + true + false + false + false + true + false + false + false + true + 0 + true + true + true + true + true + true + + + ${RESULTS_DIR}/frontend.csv + + + + + From d93c6924a0b60876c701916311de77a7a53f9280 Mon Sep 17 00:00:00 2001 From: bcgov-brwang <87880048+bcgov-brwang@users.noreply.github.com> Date: Wed, 9 Oct 2024 14:25:23 -0700 Subject: [PATCH 63/63] ORV2-2780: added crud vehicles test cases ORV2-2780: added crud vehicles test cases --- ..._load_test_plan_frontend_crud_vehicles.jmx | 545 ++++++++++++++++++ 1 file changed, 545 insertions(+) create mode 100644 loadtests/frontend/orbc_load_test_plan_frontend_crud_vehicles.jmx diff --git a/loadtests/frontend/orbc_load_test_plan_frontend_crud_vehicles.jmx b/loadtests/frontend/orbc_load_test_plan_frontend_crud_vehicles.jmx new file mode 100644 index 000000000..1d0bff36b --- /dev/null +++ b/loadtests/frontend/orbc_load_test_plan_frontend_crud_vehicles.jmx @@ -0,0 +1,545 @@ + + + + + + false + false + + + + Duration + 3180 + = + + + + + + + + + + NUM_THREADS + 1 + = + + + FRONTEND_URL + https://onroutebc-test-frontend.apps.silver.devops.gov.bc.ca + = + + + RESULTS_DIR + ~/results + = + + + USER + + = + + + PASSWORD + + = + + + NEW_POWER_UNIT_URL + https://onroutebc-test-frontend.apps.silver.devops.gov.bc.ca/manage-vehicles/add-powerunit + = + + + UPDATE_POWER_UNIT_URL + https://onroutebc-test-frontend.apps.silver.devops.gov.bc.ca/manage-vehicles/power-units/106 + = + + + MANAGE_VEHICLES_URL + https://onroutebc-test-frontend.apps.silver.devops.gov.bc.ca/manage-vehicles + = + + + NEW_TRAILER_URL + https://onroutebc-test-frontend.apps.silver.devops.gov.bc.ca/manage-vehicles/add-trailer + = + + + UPDATE_TRAILER_URL + https://onroutebc-test-frontend.apps.silver.devops.gov.bc.ca/manage-vehicles/trailers/106 + = + + + + + + false + true + C:\Users\brwang\Software\chromedriver-win64\chromedriver-win64-129\chromedriver.exe + false + false + true + + + SYSTEM + + + 8080 + true + + 8080 + true + + 8080 + true + + 8080 + localhost + + + + + continue + + false + 1 + + 1 + 1 + false + + + true + + + + import org.openqa.selenium.By +import org.openqa.selenium.support.ui.ExpectedConditions +import org.openqa.selenium.support.ui.WebDriverWait +import org.openqa.selenium.WebElement + +WDS.sampleResult.sampleStart() +def frontendUrl = WDS.vars.get("FRONTEND_URL") +WDS.browser.get(frontendUrl); +Thread.sleep(5000) + + +def loginButton = WDS.browser.findElement(By.id('login-bceid')) +if (loginButton != null) { + loginButton.click() + WDS.log.info("Clicked on the login-bceid button") +} else { + WDS.log.info("Button with id 'login-bceid' not found") +} + +Thread.sleep(10000) +def user = WDS.browser.findElement(By.id('user')) +def password = WDS.browser.findElement(By.id('password')) + +def userValue = WDS.vars.get("USER") +def passwordValue = WDS.vars.get("PASSWORD") +user.sendKeys(userValue) +password.sendKeys(passwordValue) +Thread.sleep(5000) + +def submitButton = WDS.browser.findElement(By.name('btnSubmit')) +if (submitButton != null) { + submitButton.click() +} else { + WDS.log.info('Submit button with name="btnSubmit" not found') +} +Thread.sleep(10000) + +WDS.sampleResult.sampleEnd() + + groovy + + + + import org.openqa.selenium.By +import org.openqa.selenium.support.ui.ExpectedConditions +import org.openqa.selenium.support.ui.WebDriverWait +import org.openqa.selenium.WebElement + +WDS.sampleResult.sampleStart() +Thread.sleep(50000) + +// create a new power unit +def newPowerUnitUrl = WDS.vars.get("NEW_POWER_UNIT_URL") +WDS.browser.get(newPowerUnitUrl); +Thread.sleep(5000) + +def unitNumber = WDS.browser.findElement(By.cssSelector('[name="unitNumber"]')) +unitNumber.sendKeys("MCL37") +Thread.sleep(5000) + +def make = WDS.browser.findElement(By.cssSelector('[name="make"]')) +make.sendKeys("Toyota") +Thread.sleep(5000) + +def year = WDS.browser.findElement(By.cssSelector('[name="year"]')) +year.sendKeys("2002") +Thread.sleep(5000) + +def vin = WDS.browser.findElement(By.cssSelector('[name="vin"]')) +vin.sendKeys("MCL37A") +Thread.sleep(5000) + +def plate = WDS.browser.findElement(By.cssSelector('[name="plate"]')) +plate.sendKeys("VB0007") +Thread.sleep(5000) + +def vehicleSubType = WDS.browser.findElement(By.id('mui-component-select-powerUnitTypeCode')) +vehicleSubType.click() +def bus = WDS.browser.findElement(By.cssSelector('[data-value="BUSCRUM"]')) +bus.click() +Thread.sleep(5000) + +def country = WDS.browser.findElement(By.id('mui-component-select-countryCode')) +WDS.browser.executeScript("window.scrollTo(0, arguments[0].getBoundingClientRect().top + window.pageYOffset - 100);", country) +country.click() +Thread.sleep(5000) +def ca = WDS.browser.findElement(By.cssSelector('[data-value="CA"]')) +ca.click() +Thread.sleep(5000) + +def province = WDS.browser.findElement(By.id('mui-component-select-provinceCode')) +province.click() +Thread.sleep(5000) +def ab = WDS.browser.findElement(By.cssSelector('[data-value="AB"]')) +ab.click() +Thread.sleep(5000) + +def licensedGvw = WDS.browser.findElement(By.cssSelector('[name="licensedGvw"]')) +licensedGvw.sendKeys("2000") +Thread.sleep(5000) + +def addToInventory = WDS.browser.findElement(By.className('css-xie432')) +addToInventory.click() +Thread.sleep(5000) + +WDS.sampleResult.sampleEnd() + + groovy + + + + import org.openqa.selenium.By +import org.openqa.selenium.support.ui.ExpectedConditions +import org.openqa.selenium.support.ui.WebDriverWait +import org.openqa.selenium.WebElement + +WDS.sampleResult.sampleStart() +Thread.sleep(5000) + +// update a power unit +def updatePowerUnitUrl = WDS.vars.get("UPDATE_POWER_UNIT_URL") +WDS.browser.get(updatePowerUnitUrl); +Thread.sleep(5000) + +def make = WDS.browser.findElement(By.cssSelector('[name="make"]')) +make.clear() +make.sendKeys("Toyota") +Thread.sleep(5000) + +def year = WDS.browser.findElement(By.cssSelector('[name="year"]')) +year.clear() +year.sendKeys("2021") +Thread.sleep(5000) + +def licensedGvw = WDS.browser.findElement(By.cssSelector('[name="licensedGvw"]')) +licensedGvw.clear() +licensedGvw.sendKeys("5000") +Thread.sleep(5000) + +def save = WDS.browser.findElement(By.className('css-xie432')) +save.click() +Thread.sleep(5000) + +WDS.sampleResult.sampleEnd() + + groovy + + + + import org.openqa.selenium.By +import org.openqa.selenium.support.ui.ExpectedConditions +import org.openqa.selenium.support.ui.WebDriverWait +import org.openqa.selenium.WebElement + +WDS.sampleResult.sampleStart() + +Thread.sleep(10000) + +// delete a power unit +def manageVehiclesUrl = WDS.vars.get("MANAGE_VEHICLES_URL") +WDS.browser.get(manageVehiclesUrl); +Thread.sleep(5000) + +def checkbox = WDS.browser.findElement(By.xpath("(//input[@type='checkbox'])[2]")) +if (!checkbox.isSelected()) { + checkbox.click() +} + +def delete = WDS.browser.findElement(By.className('delete-btn--active')) +delete.click() +Thread.sleep(5000) + +def deleteConfirm = WDS.browser.findElement(By.className('css-1a53fri')) +deleteConfirm.click() +Thread.sleep(5000) + +WDS.sampleResult.sampleEnd() + + groovy + + + + import org.openqa.selenium.By +import org.openqa.selenium.support.ui.ExpectedConditions +import org.openqa.selenium.support.ui.WebDriverWait +import org.openqa.selenium.WebElement + +WDS.sampleResult.sampleStart() +Thread.sleep(5000) + +// create a new trailer +def newTrailerUrl = WDS.vars.get("NEW_TRAILER_URL") +WDS.browser.get(newTrailerUrl); +Thread.sleep(5000) + +def unitNumber = WDS.browser.findElement(By.cssSelector('[name="unitNumber"]')) +unitNumber.sendKeys("TCL37") +Thread.sleep(5000) + +def make = WDS.browser.findElement(By.cssSelector('[name="make"]')) +make.sendKeys("Toyota") +Thread.sleep(5000) + +def year = WDS.browser.findElement(By.cssSelector('[name="year"]')) +year.sendKeys("2002") +Thread.sleep(5000) + +def vin = WDS.browser.findElement(By.cssSelector('[name="vin"]')) +vin.sendKeys("TCL37A") +Thread.sleep(5000) + +def plate = WDS.browser.findElement(By.cssSelector('[name="plate"]')) +plate.sendKeys("VT0007") +Thread.sleep(5000) + +def vehicleSubType = WDS.browser.findElement(By.id('mui-component-select-trailerTypeCode')) +vehicleSubType.click() +def bus = WDS.browser.findElement(By.cssSelector('[data-value="BOOSTER"]')) +bus.click() +Thread.sleep(5000) + +def country = WDS.browser.findElement(By.id('mui-component-select-countryCode')) +WDS.browser.executeScript("window.scrollTo(0, arguments[0].getBoundingClientRect().top + window.pageYOffset - 100);", country) +country.click() +Thread.sleep(5000) +def ca = WDS.browser.findElement(By.cssSelector('[data-value="CA"]')) +ca.click() +Thread.sleep(5000) + +def province = WDS.browser.findElement(By.id('mui-component-select-provinceCode')) +province.click() +Thread.sleep(5000) +def ab = WDS.browser.findElement(By.cssSelector('[data-value="AB"]')) +ab.click() +Thread.sleep(5000) + +def addToInventory = WDS.browser.findElement(By.className('css-xie432')) +addToInventory.click() +Thread.sleep(5000) + +WDS.sampleResult.sampleEnd() + + groovy + + + + import org.openqa.selenium.By +import org.openqa.selenium.support.ui.ExpectedConditions +import org.openqa.selenium.support.ui.WebDriverWait +import org.openqa.selenium.WebElement + +WDS.sampleResult.sampleStart() +Thread.sleep(5000) + +// update a trailer +def updateTrailerUrl = WDS.vars.get("UPDATE_TRAILER_URL") +WDS.browser.get(updateTrailerUrl); +Thread.sleep(5000) + +def unitNumber = WDS.browser.findElement(By.cssSelector('[name="unitNumber"]')) +unitNumber.clear() +unitNumber.sendKeys("TCL37") +Thread.sleep(5000) + +def year = WDS.browser.findElement(By.cssSelector('[name="year"]')) +year.clear() +year.sendKeys("2021") +Thread.sleep(5000) + +def save = WDS.browser.findElement(By.className('css-xie432')) +WDS.browser.executeScript("window.scrollTo(0, arguments[0].getBoundingClientRect().top + window.pageYOffset - 100);", save) +save.click() +Thread.sleep(5000) + +WDS.sampleResult.sampleEnd() + + groovy + + + + import org.openqa.selenium.By +import org.openqa.selenium.support.ui.ExpectedConditions +import org.openqa.selenium.support.ui.WebDriverWait +import org.openqa.selenium.WebElement + +WDS.sampleResult.sampleStart() +Thread.sleep(5000) + +// delete a trailer +def manageVehiclesUrl = WDS.vars.get("MANAGE_VEHICLES_URL") +WDS.browser.get(manageVehiclesUrl); +Thread.sleep(5000) + +def trailerTab = WDS.browser.findElement(By.id('layout-tab-1')) +trailerTab.click() +Thread.sleep(5000) + +def checkbox = WDS.browser.findElement(By.xpath("(//input[@type='checkbox'])[2]")) +if (!checkbox.isSelected()) { + checkbox.click() +} + +def delete = WDS.browser.findElement(By.className('delete-btn--active')) +delete.click() +Thread.sleep(5000) + +def deleteConfirm = WDS.browser.findElement(By.className('css-1a53fri')) +deleteConfirm.click() +Thread.sleep(5000) + +WDS.sampleResult.sampleEnd() + + groovy + + + + + false + + saveConfig + + + true + true + true + + true + true + true + true + false + true + true + false + false + false + true + false + false + false + true + 0 + true + true + true + true + true + true + + + + + + + false + + saveConfig + + + true + true + true + + true + true + true + true + false + true + true + false + false + false + true + false + false + false + true + 0 + true + true + true + true + true + true + + + + + + + false + + saveConfig + + + true + true + true + + true + true + true + true + false + true + true + false + false + false + true + false + false + false + true + 0 + true + true + true + true + true + true + + + ${RESULTS_DIR}/frontend.csv + + + + +