diff --git a/.circleci/README.md b/.circleci/README.md index f08a5f0e0a..1b0c4c0311 100644 --- a/.circleci/README.md +++ b/.circleci/README.md @@ -14,10 +14,10 @@ This script will generate a complete config for building, testing, and deploying ### Directory structure #### build-and-test -Contains workflows, jobs, and commands for building and testing the application. +Contains workflows, jobs, and commands for building and testing the application. For all development side builds, these are now triggered by GitHub Actions that serve as a filter so only the code that's changed is tested. See [build-all](../.github/workflows/build-all.yml), [build-backend](../.github/workflows/build-backend.yml), and [build-frontend](../.github/workflows/build-frontend.yml) #### infrastructure -Contains workflows, jobs, and commands for setting up the infrastructure on Cloud gov. +Contains workflows, jobs, and commands for setting up the infrastructure on Cloud gov. For all development side builds, this is now triggered by GitHub Actions that serve as a filter so only runs when infrastructure code is changed. See [deploy-infrastructure](../.github/workflows/deploy-infrastructure.yml) #### deployment Contains workflows, jobs, and commands for deploying the application on Cloud gov. Note: merges to develop now automatically trigger a develop deploy using [deploy-develop-on-merge](../.github/workflows/deploy-develop-on-merge.yml) and deploys to dev environments happen when a label is created on the PR using [deploy-on-label](../.github/workflows/deploy-on-label.yml) @@ -71,3 +71,17 @@ You want to set the branch to be the branch you want this scan to be run on. You want to add a Pipeline Parameter with `run_nightly_owasp_scan`to be a boolean and set to `true`. You want Attribution set to Scheduled Actor (Scheduling System) + +## Updating Cloud Foundry App OS +Cloud Foundry (CF) occasionally releases OS updates. In doing so they deprecate the previous OS and after a short time +do not allow any apps to run/deploy on anything but the latest OS. The steps below describe how the main TDP apps are +updated along with the secondary apps running in CF. + +### Frontend/Backend + - Before updating, make sure the current buildpacks that these apps use are supported by the latest OS. If they aren't you can update the manifest to point them to the correct buildpacks. + - To update the apps you can either deploy each of the environments (sandbox, raft, qasp, etc) from CircleCi or you can use the `tdrs-deploy ` command from `commands.sh`. Assuming the buildpacks are up to date, that is all you need to do. + +### Secondary apps + - Before you can make the update, you need to ensure you have the CF plugin that allows you to do so. Download the binary for your respective OS [HERE](https://github.com/cloudfoundry/stack-auditor/releases) and follow the installation instructions [HERE](https://docs.cloudfoundry.org/adminguide/stack-auditor.html#install). + - Verify the installation succeeded by running `cf audit-stack`. Note you need to be logged in and have targeted a space via `cf target -o hhs-acf-ofa -s ` + - To update the remaining apps you need to run `cf change-stack ` against every app that is not a frontend/backend app. diff --git a/.circleci/base_config.yml b/.circleci/base_config.yml index eb4b9af15c..d722abecf1 100644 --- a/.circleci/base_config.yml +++ b/.circleci/base_config.yml @@ -21,6 +21,18 @@ executors: resource_class: large parameters: + build_and_test_all: + type: boolean + default: false + build_and_test_backend: + type: boolean + default: false + build_and_test_frontend: + type: boolean + default: false + deploy_infrastructure: + type: boolean + default: false develop_branch_deploy: type: boolean default: false @@ -36,3 +48,9 @@ parameters: target_env: type: string default: '' + triggered: + type: boolean + default: false + util_make_erd: + type: boolean + default: false diff --git a/.circleci/build-and-test/workflows.yml b/.circleci/build-and-test/workflows.yml index 9122ab1666..7c0e559b0f 100644 --- a/.circleci/build-and-test/workflows.yml +++ b/.circleci/build-and-test/workflows.yml @@ -1,19 +1,67 @@ # workflows: - build-and-test: - unless: - or: - - << pipeline.parameters.run_dev_deployment >> - - << pipeline.parameters.develop_branch_deploy >> - - << pipeline.parameters.run_owasp_scan >> - - << pipeline.parameters.run_nightly_owasp_scan >> + build-and-test-all: + when: << pipeline.parameters.build_and_test_all >> jobs: - secrets-check + - test-backend: + requires: + - secrets-check - test-frontend: requires: - secrets-check + - test-e2e: + requires: + - secrets-check + + ci-build-and-test-all: + jobs: + - secrets-check: + filters: + branches: + only: + - main + - master + - /^release.*/ - test-backend: + filters: + branches: + only: + - main + - master + - /^release.*/ + requires: + - secrets-check + - test-frontend: + filters: + branches: + only: + - main + - master + - /^release.*/ requires: - secrets-check - test-e2e: + filters: + branches: + only: + - main + - master + - /^release.*/ + requires: + - secrets-check + + build-and-test-backend: + when: << pipeline.parameters.build_and_test_backend >> + jobs: + - secrets-check + - test-backend: + requires: + - secrets-check + + build-and-test-frontend: + when: << pipeline.parameters.build_and_test_frontend >> + jobs: + - secrets-check + - test-frontend: requires: - secrets-check diff --git a/.circleci/config.yml b/.circleci/config.yml index ea0ddd1c49..5d0be7af65 100755 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -13,6 +13,18 @@ orbs: # parameters from github actions parameters: + build_and_test_all: + type: boolean + default: false + build_and_test_backend: + type: boolean + default: false + build_and_test_frontend: + type: boolean + default: false + deploy_infrastructure: + type: boolean + default: false develop_branch_deploy: type: boolean default: false @@ -28,6 +40,12 @@ parameters: target_env: type: string default: '' + triggered: + type: boolean + default: false + util_make_erd: + type: boolean + default: false jobs: setup: @@ -45,6 +63,23 @@ jobs: # our single workflow, that triggers the setup job defined above workflows: - setup: + github-triggered-setup: + when: << pipeline.parameters.triggered >> + jobs: + - setup: + filters: + branches: + ignore: + - main + - master + - /^release.*/ + circle-ci-setup: jobs: - - setup + - setup: + filters: + branches: + only: + - main + - master + - /^release.*/ + diff --git a/.circleci/deployment/commands.yml b/.circleci/deployment/commands.yml index 65cab6a939..b259fb57f1 100644 --- a/.circleci/deployment/commands.yml +++ b/.circleci/deployment/commands.yml @@ -110,10 +110,10 @@ default: tdp-frontend type: string # So the frontend knows what space its in for the banner. -# I am unclear if the domain is a reliable metric to make this function +# I am unclear if the domain is a reliable metric to make this function # It seems like it might not be working cf-space: - default: dev + default: dev type: string steps: - install-nodejs: diff --git a/.circleci/deployment/jobs.yml b/.circleci/deployment/jobs.yml index dc1ee1d5b7..a24baef461 100644 --- a/.circleci/deployment/jobs.yml +++ b/.circleci/deployment/jobs.yml @@ -20,7 +20,7 @@ cf-password: CF_PASSWORD_STAGING cf-space: tanf-staging cf-username: CF_USERNAME_STAGING - + deploy-develop: executor: docker-executor working_directory: ~/tdp-deploy diff --git a/.circleci/deployment/workflows.yml b/.circleci/deployment/workflows.yml index 730a87373f..91e5ea56a9 100644 --- a/.circleci/deployment/workflows.yml +++ b/.circleci/deployment/workflows.yml @@ -11,7 +11,7 @@ - deploy-infrastructure-dev staging-deployment: - unless: + unless: or: - << pipeline.parameters.run_dev_deployment >> - << pipeline.parameters.run_nightly_owasp_scan >> @@ -71,3 +71,4 @@ branches: only: - master + diff --git a/.circleci/infrastructure/workflows.yml b/.circleci/infrastructure/workflows.yml index 46f29aec7a..9cb85e8ed8 100644 --- a/.circleci/infrastructure/workflows.yml +++ b/.circleci/infrastructure/workflows.yml @@ -1,6 +1,10 @@ -#workflows: +#workflows: enable-versioning-for-s3-buckets: - unless: << pipeline.parameters.run_nightly_owasp_scan >> + when: + or: + - << pipeline.parameters.deploy_infrastructure >> + - equal: [ 'main', << pipeline.git.branch >> ] + - equal: [ 'master', << pipeline.git.branch >> ] jobs: - enable-versioning: filters: diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 895d9cd92a..625fe7f9c0 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -16,15 +16,15 @@ cd tdrs-backend && docker-compose -f docker-compose.yml -f docker-compose.local. > *Demo GIF(s) and screenshots for testing procedure* ## Deliverables -_More details on how deliverables herein are assessed included [here](../docs/How-We-Work/our-priorities-values-expectations.md#Deliverables)._ +_More details on how deliverables herein are assessed included [here](https://github.com/raft-tech/TANF-app/blob/develop/docs/How-We-Work/our-priorities-values-expectations.md#Deliverables)._ -### [Deliverable 1: Accepted Features](../docs/How-We-Work/our-priorities-values-expectations.md#Deliverable-1-Accepted-Features) +### [Deliverable 1: Accepted Features](https://github.com/raft-tech/TANF-app/blob/develop/docs/How-We-Work/our-priorities-values-expectations.md#Deliverable-1-Accepted-Features) Checklist of ACs: + [ ] [**_insert ACs here_**] + [ ] **`lfrohlich`** and/or **`adpennington`** confirmed that ACs are met. -### [Deliverable 2: Tested Code](../docs/How-We-Work/our-priorities-values-expectations.md#Deliverable-2-Tested-Code) +### [Deliverable 2: Tested Code](https://github.com/raft-tech/TANF-app/blob/develop/docs/How-We-Work/our-priorities-values-expectations.md#Deliverable-2-Tested-Code) + Are all areas of code introduced in this PR meaningfully tested? + [ ] If this PR introduces backend code changes, are they meaningfully tested? @@ -33,13 +33,13 @@ Checklist of ACs: + [ ] Frontend coverage: [_insert coverage %_] (see `CodeCov Report` comment in PR) + [ ] Backend coverage: [_insert coverage %_] (see `CodeCov Report` comment in PR) -### [Deliverable 3: Properly Styled Code](../docs/How-We-Work/our-priorities-values-expectations.md#Deliverable-3-Properly-Styled-Code) +### [Deliverable 3: Properly Styled Code](https://github.com/raft-tech/TANF-app/blob/develop/docs/How-We-Work/our-priorities-values-expectations.md#Deliverable-3-Properly-Styled-Code) + [ ] Are backend code style checks passing on CircleCI? + [ ] Are frontend code style checks passing on CircleCI? + [ ] Are code maintainability principles being followed? -### [Deliverable 4: Accessible](../docs/How-We-Work/our-priorities-values-expectations.md#Deliverable-4-Accessibility) +### [Deliverable 4: Accessible](https://github.com/raft-tech/TANF-app/blob/develop/docs/How-We-Work/our-priorities-values-expectations.md#Deliverable-4-Accessibility) + [ ] Does this PR complete the epic? + [ ] Are links included to any other gov-approved PRs associated with epic? @@ -47,11 +47,11 @@ Checklist of ACs: + [ ] Did automated and manual testing with `iamjolly` and `ttran-hub` using Accessibility Insights reveal any errors introduced in this PR? -### [Deliverable 5: Deployed](../docs/How-We-Work/our-priorities-values-expectations.md#Deliverable-5-Deployed) +### [Deliverable 5: Deployed](https://github.com/raft-tech/TANF-app/blob/develop/docs/How-We-Work/our-priorities-values-expectations.md#Deliverable-5-Deployed) + [ ] Was the code successfully deployed via automated CircleCI process to development on Cloud.gov? -### [Deliverable 6: Documented](../docs/How-We-Work/our-priorities-values-expectations.md#Deliverable-6-Code-documentation) +### [Deliverable 6: Documented](https://github.com/raft-tech/TANF-app/blob/develop/docs/How-We-Work/our-priorities-values-expectations.md#Deliverable-6-Code-documentation) + [ ] Does this PR provide background for why coding decisions were made? + [ ] If this PR introduces backend code, is that code easy to understand and sufficiently documented, both inline and overall? @@ -59,13 +59,13 @@ Checklist of ACs: + [ ] If this PR introduces dependencies, are their licenses documented? + [ ] Can reviewer explain and take ownership of these elements presented in this code review? -### [Deliverable 7: Secure](../docs/How-We-Work/our-priorities-values-expectations.md#Deliverable-7-Secure) +### [Deliverable 7: Secure](https://github.com/raft-tech/TANF-app/blob/develop/docs/How-We-Work/our-priorities-values-expectations.md#Deliverable-7-Secure) + [ ] Does the OWASP Scan pass on CircleCI? + [ ] Do manual code review and manual testing detect any new security issues? + [ ] If new issues detected, is investigation and/or remediation plan documented? -### [Deliverable 8: User Research](../docs/How-We-Work/our-priorities-values-expectations.md#Deliverable-8-User-Research) +### [Deliverable 8: User Research](https://github.com/raft-tech/TANF-app/blob/develop/docs/How-We-Work/our-priorities-values-expectations.md#Deliverable-8-User-Research) Research product(s) clearly articulate(s): + [ ] the purpose of the research diff --git a/.github/workflows/build-all.yml b/.github/workflows/build-all.yml new file mode 100644 index 0000000000..c03d344abb --- /dev/null +++ b/.github/workflows/build-all.yml @@ -0,0 +1,58 @@ +########################################################################### +# GitHub Action Workflow +# On changes to scripts or changes to the pipeline code to any branch +# besides develop, staging and master triggers the full build and test +# pipeline. +# +# NOTE: develop, staging(main) and master are skipped on the push because this +# would be redundant after running the full set of tests from the PR. +# See build-pr.yml for builds that run on code being merged into develop. +# See deploy-develop-on-merge.yml and make_erd for the workflow +# pipelines that run on merge to develop, staging, and master branches. +# HHS (main and master and release/**) branches build all only +# and are managed in CircleCI +# +# Step 0: Make changes on your branch to files in scripts/ .circleci or .github +# and push changes to your remote branch. +# +# Step 1: Makes a request to the V2 CircleCI API to initiate the project, +# which will filter based upon build_and_test_backend and +# build_and_test_frontend to run the workflow/jobs listed here: +# build-and-test:[ +# test-backend, +# test-frontend, +# test-e2e +# ] +# +# Leverages the open source GitHub Action: +# https://github.com/promiseofcake/circleci-trigger-action +########################################################################### +name: Build and test All on push when scripts/commands change +on: + push: + branches-ignore: + - develop + - main + - master + - 'release/**' + paths: + - 'scripts/**' + - '.circleci/**' + - '.github/**' +jobs: + build_and_test_all: + runs-on: ubuntu-latest + name: Initiate deploy job in CircleCI + steps: + - uses: actions/checkout@v2 + - name: Circle CI Deployment Trigger + id: curl-circle-ci + uses: promiseofcake/circleci-trigger-action@v1 + with: + user-token: ${{ secrets.CIRCLE_CI_V2_TOKEN }} + project-slug: ${{ github.repository }} + branch: ${{ (github.event_name == 'pull_request') && github.head_ref || github.ref_name }} + payload: '{ + "build_and_test_all": true, + "triggered": true + }' diff --git a/.github/workflows/build-backend.yml b/.github/workflows/build-backend.yml new file mode 100644 index 0000000000..26ef5c03eb --- /dev/null +++ b/.github/workflows/build-backend.yml @@ -0,0 +1,44 @@ +########################################################################### +# GitHub Action Workflow +# On push to any branch, triggers the back end build and test pipeline +# if the tdrs-backend has changed. +# +# Step 0: make changes on your branch to non-documentation files in +# tdrs-backend and push changes to your remote branch +# +# Step 1: Makes a request to the V2 CircleCI API to initiate the project, +# which will filter based upon build_and_test_backend +# to run the workflow/jobs listed here: +# build-and-test:[ +# test-backend, +# test-e2e +# ] +# +# Leverages the open source GitHub Action: +# https://github.com/promiseofcake/circleci-trigger-action +########################################################################### +name: Build Only Backend When tdrs-backend/ Files Change +on: + push: + paths: 'tdrs-backend/**' + branches-ignore: + - develop + - main + - master +jobs: + build_and_test_backend: + runs-on: ubuntu-latest + name: Build and Test Backend + steps: + - uses: actions/checkout@v2 + - name: Circle CI Deployment Trigger + id: curl-circle-ci + uses: promiseofcake/circleci-trigger-action@v1 + with: + user-token: ${{ secrets.CIRCLE_CI_V2_TOKEN }} + project-slug: ${{ github.repository }} + branch: ${{ github.ref_name }} + payload: '{ + "build_and_test_backend": true, + "triggered": true + }' diff --git a/.github/workflows/build-frontend.yml b/.github/workflows/build-frontend.yml new file mode 100644 index 0000000000..b9b60a9141 --- /dev/null +++ b/.github/workflows/build-frontend.yml @@ -0,0 +1,44 @@ +########################################################################### +# GitHub Action Workflow +# On push to any branch, triggers the front end build and test pipeline +# if the tdrs-frontend has changed. +# +# Step 0: make changes on your branch to non-documentation files in +# tdrs-frontend and push changes to your remote branch +# +# Step 1: Makes a request to the V2 CircleCI API to initiate the project, +# which will filter based upon build_and_test_frontend +# to run the workflow/jobs listed here: +# build-and-test:[ +# test-frontend, +# test-e2e +# ] +# +# Leverages the open source GitHub Action: +# https://github.com/promiseofcake/circleci-trigger-action +########################################################################### +name: Build Only Frontend When tdrs-frontend Files Change +on: + push: + paths: 'tdrs-frontend/**' + branches-ignore: + - develop + - main + - master +jobs: + build_and_test_frontend: + runs-on: ubuntu-latest + name: Build and Test Frontend + steps: + - uses: actions/checkout@v2 + - name: Circle CI Deployment Trigger + id: curl-circle-ci + uses: promiseofcake/circleci-trigger-action@v1 + with: + user-token: ${{ secrets.CIRCLE_CI_V2_TOKEN }} + project-slug: ${{ github.repository }} + branch: ${{ github.ref_name }} + payload: '{ + "build_and_test_frontend": true, + "triggered": true + }' diff --git a/.github/workflows/build-pr.yml b/.github/workflows/build-pr.yml new file mode 100644 index 0000000000..5aef710990 --- /dev/null +++ b/.github/workflows/build-pr.yml @@ -0,0 +1,47 @@ +########################################################################### +# GitHub Action Workflow +# On pull requests requesting review from individuals, besides staging, +# master, and release branches triggers the full build and test pipeline. +# +# NOTE: release branches, staging(main) and master are skipped because +# these branch builds are managed in CircleCI +# +# Step 0: make PR from your branch into develop, then select reviewers. +# +# Step 1: Makes a request to the V2 CircleCI API to initiate the project, +# which will filter based upon build_and_test_backend and +# build_and_test_frontend to run the workflow/jobs listed here: +# build-and-test:[ +# test-backend, +# test-frontend, +# test-e2e +# ] +# +# Leverages the open source GitHub Action: +# https://github.com/promiseofcake/circleci-trigger-action +########################################################################### +name: Build and test All for PRs +on: + pull_request: + branches-ignore: #handled in circleci + - main + - master + - 'release/**' + types: [review_requested, ready_for_review, synchronize] +jobs: + build_and_test_pr: + runs-on: ubuntu-latest + name: Initiate deploy job in CircleCI + steps: + - uses: actions/checkout@v2 + - name: Circle CI Deployment Trigger + id: curl-circle-ci + uses: promiseofcake/circleci-trigger-action@v1 + with: + user-token: ${{ secrets.CIRCLE_CI_V2_TOKEN }} + project-slug: ${{ github.repository }} + branch: ${{ (github.event_name == 'pull_request') && github.head_ref || github.ref_name }} + payload: '{ + "build_and_test_all": true, + "triggered": true + }' \ No newline at end of file diff --git a/.github/workflows/deploy-develop-on-merge.yml b/.github/workflows/deploy-develop-on-merge.yml index 80ad9b3088..a9df826455 100644 --- a/.github/workflows/deploy-develop-on-merge.yml +++ b/.github/workflows/deploy-develop-on-merge.yml @@ -24,7 +24,7 @@ on: push: branches: - develop - paths_ignore: + paths-ignore: - 'docs/**' - '**.md' - '**.txt' diff --git a/.github/workflows/deploy-infrastructure.yml b/.github/workflows/deploy-infrastructure.yml new file mode 100644 index 0000000000..e5eeeb611a --- /dev/null +++ b/.github/workflows/deploy-infrastructure.yml @@ -0,0 +1,46 @@ +########################################################################### +# GitHub Action Workflow +# On push changing terraform files or infrastructure pipelines, triggers the +# terraform deploy pipeline for the appropriate cf space. +# +# Step 0: make changes to non-documentation files in terraform/ or +# .circleci/infrastructure/ and push/merge changes. +# +# Step 1: Makes a request to the V2 CircleCI API to initiate the project, +# which will filter based upon terraform: true flag +# to run the workflow/jobs listed here: +# build-and-test:[ +# enable-versioning-for-s3-buckets +# ] +# +# Leverages the open source GitHub Action: +# https://github.com/promiseofcake/circleci-trigger-action +########################################################################### +name: Run Infrastructure Pipeline When Terraform or Infrastructure Files Change +on: + push: + branches-ignore: #handled in CircleCI + - main + - master + - 'release/**' + paths: + - 'terraform/**' + - '.circleci/infrastructure/**' +jobs: + run_infrastructure_deployment: + runs-on: ubuntu-latest + name: Deploy Infrastructure + steps: + - uses: actions/checkout@v2 + - name: Circle CI Deployment Trigger + id: curl-circle-ci + uses: promiseofcake/circleci-trigger-action@v1 + with: + user-token: ${{ secrets.CIRCLE_CI_V2_TOKEN }} + project-slug: ${{ github.repository }} + branch: ${{ github.ref_name }} + payload: '{ + "deploy_infrastructure": true, + "triggered": true + }' + \ No newline at end of file diff --git a/docs/Sprint-Review/sprint-74-summary.md b/docs/Sprint-Review/sprint-74-summary.md new file mode 100644 index 0000000000..9d64430d39 --- /dev/null +++ b/docs/Sprint-Review/sprint-74-summary.md @@ -0,0 +1,54 @@ +# Sprint 74 Summary +05/24/23 - 06/06/23 + +Velocity: 21 + +## Sprint Goal +* Continue parsing engine development for Section 1 and close out integration test epic (310). +* UX to continue STT onboarding (focusing on onboarding CyberFusion users), errors research sessions, provide copy for 2509 (e-mail notification for data submission and errors/transmission report) +* DevOps to resolve utility images for CircleCI and container registry and close out path filtering for CI builds + + +## Tickets + +#### Completed/Merged +* [#2439 - [Design] Video Release — Embed videos in knowledge center +](https://app.zenhub.com/workspaces/sprint-board-5f18ab06dfd91c000f7e682e/issues/gh/raft-tech/tanf-app/2439) +* [#2503 [Design] May Knowledge Center Enhancements](https://app.zenhub.com/workspaces/sprint-board-5f18ab06dfd91c000f7e682e/issues/gh/raft-tech/tanf-app/2503) +* [#2531 Bug/Max file size](https://app.zenhub.com/workspaces/sprint-board-5f18ab06dfd91c000f7e682e/issues/gh/raft-tech/tanf-app/2531) +* [#2424 Complete TANF section 1 parsing](https://app.zenhub.com/workspaces/sprint-board-5f18ab06dfd91c000f7e682e/issues/gh/raft-tech/tanf-app/2424) +* [#2368 errors reporting research](https://app.zenhub.com/workspaces/sprint-board-5f18ab06dfd91c000f7e682e/issues/gh/raft-tech/tanf-app/2368) + + + +#### Submitted (QASP Review, OCIO Review) +* N/A + + +#### Closed (not merged) +* N/A + +### Moved to Next Sprint (Blocked, Raft Review, In Progress) + +#### Blocked +* [#2115 [DevOps] Create utility image(s) for CircleCI pipeline](https://app.zenhub.com/workspaces/sprint-board-5f18ab06dfd91c000f7e682e/issues/gh/raft-tech/tanf-app/2115) + +#### Raft Review +* [2486 [Spike - Parser Performance]](https://app.zenhub.com/workspaces/sprint-board-5f18ab06dfd91c000f7e682e/issues/gh/raft-tech/tanf-app/2486) +* [#2521 - Update to CFlinuxfs4](https://app.zenhub.com/workspaces/sprint-board-5f18ab06dfd91c000f7e682e/issues/gh/raft-tech/tanf-app/2521) +* [#2550 - Deactivation warning emails are missing hyperlinks in staging](https://app.zenhub.com/workspaces/sprint-board-5f18ab06dfd91c000f7e682e/issues/gh/raft-tech/tanf-app/2550) + +#### In Progress +* [#2116 [DevOps] Container Registry creation](https://app.zenhub.com/workspaces/sprint-board-5f18ab06dfd91c000f7e682e/issues/gh/raft-tech/tanf-app/2116) +* [#1613 As a developer, I need parsed file meta data (TANF Section 1)](https://app.zenhub.com/workspaces/sprint-board-5f18ab06dfd91c000f7e682e/board) +* [#1610 As a user, I need information about the acceptance of my data and a link for the error report](https://app.zenhub.com/workspaces/sprint-board-5f18ab06dfd91c000f7e682e/issues/gh/raft-tech/tanf-app/1610) +* [#2369 As tech lead, we need the parsing engine to run quailty checks across TANF section 1](https://app.zenhub.com/workspaces/sprint-board-5f18ab06dfd91c000f7e682e/issues/gh/raft-tech/tanf-app/2369) + + + +### Sprint 74 Demo +* Internal: + * UX walkthrough of Knowledge Center enhancements + * [#2424 Complete TANF section 1 parsing](https://app.zenhub.com/workspaces/sprint-board-5f18ab06dfd91c000f7e682e/issues/gh/raft-tech/tanf-app/2424) +* External: + * N/A diff --git a/docs/Technical-Documentation/Architecture-Decision-Record/020-pipeline-build-flow.md b/docs/Technical-Documentation/Architecture-Decision-Record/020-pipeline-build-flow.md new file mode 100644 index 0000000000..0e5f9b17ce --- /dev/null +++ b/docs/Technical-Documentation/Architecture-Decision-Record/020-pipeline-build-flow.md @@ -0,0 +1,44 @@ +# 20. Pipeline Build Flow + +Date: 2023-06-07 (_Updated 2023-06-13_) + +## Status + +Pending + +## Context + +We use [CircleCI](https://app.circleci.com/pipelines/github/raft-tech/TANF-app)] as our primary pipeline build tool. On the HHS side, the standard pipeline, build all and deploy ran by CircleCI is sufficiently granular to meet all our build needs. However, on the dev Raft-TANF side, where work can often be held up by waiting for build and test pipelines, it's useful to reduce build times by filtering which workflows run based upon which code is changing. In order to do this, GitHub Actions is leveraged to kick off different CircleCI build workflows since Actions has more granular control over what paths are changed. + +These pipelines are closely tied to the [Git workflow](./009-git-workflow.md) and should run build and test as expected based on what code changed, and still deploy to the correct CF spaces based upon the Decision tree in the [Deployment Flow](./008-deployment-flow.md) + +## Build Logic + +For all release branches, the main, and the master branch, CircleCI should run the full build, infrastructure deploy, and app deployment. + +for feature/development branches, only the build and test pertainint to the code changed should be built. +Front end tests should be run if /tdrs-frontent changes +Back end tests should be run if /tdrs-backend changes +the entire build and test all should run if anything pertaining to the pipeline changes +infrastructure deploy should run if /terraform or infrastructure deploy pipeline changes + +Once a pull request is flagged as ready for review and/or has reviewers assigned, a full build and test all should be run (and tests must pass before merge to develop) + +Develop merges trigger a deploy to the develop CF space, and then a special integration end-2-end test that tests against the real development environment instead of a simulated environment on the CircleCI build servers. + +## Consequences + +**Pros** +* reduce time of build and tests by only running the appropriate workflows. +* only run infrastructure deploys when changes are made to infrastructure code. +* only run end-2-end tests when code is ready to be reviewed. +* only run full integration end-2-end testing when the develop environment assets are updated. + +**Risks** +* Increased pipeline logic complexity + +## Notes + +- For the nuanced build triggers, CircleCI documentation recommends using Actions to trigger CircleCI builds and send different flags to tell which workflows should run. See this [blog](https://circleci.com/blog/trigger-circleci-pipeline-github-action/) for details, though we use [promiseofcake/circleci-trigger-action@v](https://github.com/promiseofcake/circleci-trigger-action) plugin vs circleci/trigger_circleci_pipeline@v1.0 + +- This could be an argument for future complete pipeline switchover to GitHub Actions in order to reduce pipeline complexity, while maintaining the desired build granularity. \ No newline at end of file diff --git a/docs/Technical-Documentation/buildpack-changelog.md b/docs/Technical-Documentation/buildpack-changelog.md index 6208437faf..a53fdcf6af 100644 --- a/docs/Technical-Documentation/buildpack-changelog.md +++ b/docs/Technical-Documentation/buildpack-changelog.md @@ -1,4 +1,6 @@ ## Buildpacks Changelog +- 05/15/2023 [nginx-buildpack v1.2.2](https://github.com/cloudfoundry/nginx-buildpack.git#v1.2.2) + - 11/09/2022 [python-buildpack v1.8.3](https://github.com/cloudfoundry/python-buildpack/releases/tag/v1.8.3) - 11/09/2022 [nginx-buildpack v1.1.45](https://github.com/cloudfoundry/nginx-buildpack/releases/tag/v1.1.45) @@ -10,7 +12,7 @@ - 05/11/2022 [python-buildpack v1.7.53:](https://github.com/cloudfoundry/python-buildpack/releases/tag/v1.7.53) Forced python version to 3.10.4 - 03/10/2022 [python-buildpack v1.7.51:](https://github.com/cloudfoundry/python-buildpack/releases/tag/v1.7.51) - + - 03/10/2022 [nginx-buildpack v1.1.36:](https://github.com/cloudfoundry/nginx-buildpack/releases/tag/v1.1.36) - 01/03/2022 [python-buildpack v1.7.48:](https://github.com/cloudfoundry/python-buildpack/releases/tag/v1.7.48) diff --git a/docs/Technical-Documentation/github-actions.md b/docs/Technical-Documentation/github-actions.md new file mode 100644 index 0000000000..05839498a4 --- /dev/null +++ b/docs/Technical-Documentation/github-actions.md @@ -0,0 +1,5 @@ +# How We Use GitHub Actions +For now, the only use case we have for GitHub Actions is to help up trigger CircleCI builds the way we want to. This is actually the preferred method CircleCI advises for branch, path, pull-request, and labelled filtering and job triggering. See this [blog](https://circleci.com/blog/trigger-circleci-pipeline-github-action/) for details, though we use [promiseofcake/circleci-trigger-action@v](https://github.com/promiseofcake/circleci-trigger-action) plugin vs circleci/trigger_circleci_pipeline@v1.0 + +## Path Filtering +We use Actions to filter which workflows are getting run by CircleCI by sending different flags to CircleCI through the promiseofcake CircleCI API trigger. See the individual files in [.github](../../.github/) for detailed instructions for how to use each. diff --git a/docs/User-Experience/Research-Syntheses/2023, Spring - Testing CSV & Excel-based error reports.md b/docs/User-Experience/Research-Syntheses/2023, Spring - Testing CSV & Excel-based error reports.md new file mode 100644 index 0000000000..c6ca830664 --- /dev/null +++ b/docs/User-Experience/Research-Syntheses/2023, Spring - Testing CSV & Excel-based error reports.md @@ -0,0 +1,209 @@ +# Spring 2023 - Testing CSV & Excel-based error reports + +## Contents: +* [Key insights](#Key-insights) +* [Who we talked to](#Who-we-talked-to) +* [What we did](#What-we-did) +* [What we tested](#What-we-tested) +* [What we learned](#What-we-learned) +* [What's next](#Whats-next) +___ + +### Key insights +As research conducted in [January 2023 Errors Research](https://hackmd.io/WxtMOPCUQiO-JHjahVMPDQ) focused on error messaging and specific internal workflows occuring after data submission, our research in this cycle explored the end-to-end error report experience and simulated it in the direct context of the file formats that the parsing engine will ultimately produce. + + + +- All participants were able to automatically open all variations of the error report prototypes that we tested in Excel. Participants were also able to expand collapsed columns themselves, but we found that it decreased time and effort on the part of the grantee when we provided versions of the prototype with columns that were pre-expanded to fit their content. + + - **Impact**: As a consequence of this finding and conversations with the development team we shifted from CSV format to XLSX to take advantage of AutoFit column widths to enhance the immediate readability of reports. + + +- We identified which columns should be included—and in what order—to maximize the actionable : extraneous data ratio of reports. + - **Impact**: Case Number, Month, and Error Message columns proved most critical for participants with Item Number and Field Name frequently assessed as a "nice to have". A final prototype reflecting our complete findings in this area will be produced for [#2527](https://github.com/raft-tech/TANF-app/issues/2527) and include the following columns: + + | Case Number | Month | Error Message | Item Number | Field Name | + | ----------- | ----- | ------------- | ----------- | ---------- | + +- Item number and field name represent an area where the language used in TANF documentation has shifted over time. Participants frequently appeared more familiar with the term "Data Element" than "Item" or "Field" but were ultimately all able to make the correct association with the relevant content of the data reporting instructions. + - **Impact** After discussions with ACF regarding upcoming revisions to the instructions "Item number" does reflect the preferred terminology going forward. This will be captured in [#2527](https://github.com/raft-tech/TANF-app/issues/2527) and additionally justify future knowledge center content to address any resulting confusion for TDP users. + +**Overall the feedback on the post data file submission was positive and encouraging to continue developing the email communication notice and Error Report.** + +> “This [Excel file] is helpful too [...] after further review, I’m able to understand the spreadsheet more. I’m excited for this project!" - Tribe + +> "I think this excel sheet is more user friendly than the [legacy system report] table. I think this has more information than compared to what I get now" - State + +> "[...]I think this is perfect. Once I knew what I was looking at it’s very easy to follow." - Tribe + +> “I’m excited about [having this in] an online portal. One of the things that was an issue prior was they would ask for proof that we submitted and we didn’t have it.” - Tribe + +> "I like the words and not just the [item] numbers. This saves me a step." - State +___ + + + +### Who we talked to + +We recruited based primarily on the following criteria: +* Participants from past error message research sessions +* TANF programs which had previously encountered errors on their Section 1 data files +* Programs and past participants who had expressed specific interest in participating in research sessions + +Research sessions were conducted with: +* 5 States +* 4 Tribes +___ + +### What we did + +Our research was conducted in order to: + +* Test the usability of an Excel-based error report located in Submission History to evaluate whether participants would be successful in downloading, opening, and ultimately acting on the reports. +* Explore optimal column structures and data needed to help guide error correction and cut down on the time required to understand the report itself. + +___ + +### What we tested + +During these sessions, we wanted to simulate the future experience of the error reports with our participants. We asked participants to: + +* Speak about their expectations at each step of the process including the error report email, the submission history page (including acceptance status and the link to the error report), and the downloadable error report prototype itself. +* Open the error report prototype once they downloaded it. +* Identify the meaning in their own words of key columns. +* Rank the columns in order of their priority in regard to error correction. +* Use the Error Report as if they were using it to resolve the errors listed and expand on how it might fit into their current workflows. + +**Supporting Documentation:** +- [A variation of our HTML/XLSX prototype](https://reitermb.github.io/HTML-Table-example/xlsx-login) +___ + +### What we learned + +Jump to: +* [Collapsed columns in the Error Report created extra steps for participants when first opening the CSV-based prototype](#Collapsed-columns-in-the-error-report-created-extra-steps-for-participants-when-first-opening-the-csv-based-prototype) +* [We identified which columns should be included—and in what order—to maximize the actionable : extraneous data ratio of reports](#We-identified-which-columns-should-be-included-and-in-what-order-to-maximize-the-actionable-extraneous-data-ratio-of-reports) +* [Participants use the coding instructions in conjunction with the Error Report for error definition, but it can be challenging to know whether all information is available](#Participants-use-the-coding-instructions-in-conjunction-with-the-error-report-for-error-definition-but-it-can-be-challenging-to-know-whether-all-information-is-available) +* [Item number and field name represent an area where the language used in TANF documentation has shifted over time](#Item-number-and-field-name-represent-an-area-where-the-language-used-in-TANF-documentation-has-shifted-over-time) +* [We further validated the utility of submission history and notification emails as ways for TANF programs to show proof of transmission for audit purposes](#We-further-validated-the-utility-of-submission-history-and-notification-emails-as-ways-for-tanf-programs-to-show-proof-of-transmission-for-audit-purposes) + +--- + +#### Collapsed columns in the Error Report created extra steps for participants when first opening the CSV-based prototype + +The following observations were made of the first few participants when opening the initial file format of .csv (comma-separated values) + +- Participant expanded the columns one-by-one manually +- Participant began to expand the first few columns, but then stopped as the screen size hid the final column from view +- One participant did not expand any of the columns and moved from cell to cell to read the content in the formula bar +- The Case Number field was truncated by Excel and could not be easily read (e.g. 1.111+08) + +After this initial round of review we determined (via conversations with the product and development teams) that we could move forward with a .xlsx file format which could take advantage of column AutoFit. All further research sessions were conducted with the .xlsx-based prototypes, which eliminated the need for participants to adjust columns and allowed more time to be spent dedicated to the content of the error report. + +--- + +#### We identified which columns should be included—and in what order—to maximize the actionable : extraneous data ratio of reports. + +We started the first few research sessions with a version of the column headers and iterated as we went on to further sessions based on early participant feedback. + +Our first version used the following columns/orderings: + + +| Case Number | Month | Item Number | Field Name | Error Message | Error Type | +| ----------- | ----- | ----------- | ---------- | ------------- | ---------- | + + + +> “I’m not sure about the item number - what does this represent?” - Tribe + +> “I don’t know what item number and field name are.” Initial reaction was that the Error Report did not provide the information they needed - State + +> “I’d suggest removing item number and field name but leave the rest” - Tribe + +> “I would prefer the Error Message come before the Item Number and Field Name” - Tribe + +After the first three research sessions we reevaluated our hypothesis that that Item Number and Field Name near the beginning was the most digestible way to present an error report. Those columns coming before the Error Message seemed to be at odds with participant's priorities and expectations. + +Our subsequent version—used for the remaining research sessions—had the following columns/orderings: + + +| Case Number | Month | Error Message | Item Number | Field Name | Error Type | +| ----------- | ----- | ------------- | ----------- | ---------- | ---------- | + + +> “I like the flow of the columns - Tribe + +> “I think the sequence is good for me” - State + +> “I am strictly looking at Case Numbers, Month and Error Message here. The rest is noise to me” - State + +> “I think these columns are pretty good at showing me where things are at” - Tribe + +We received a wide range of feedback around the utility of Item Number and Field Name. Participants who had many years of experience with TANF data tended to feel they were redundant to the Error Message—but might be useful for those new to correcting TANF data. Others seemed to appreciate the degree to which those columns reinforced key parts of the Error Message. + +While this research did not directly content test Error Types, some participants were able to correctly interpret their meanings. However, it seemed that the primary way Data Analysts categorize different types of errors among themselves is by classification under their Item/Field names. For example, a Data Analyst receiving the error, "If Item 49 (Work Participation Status) = 99 Or Blank, Item 30 (Family Affiliation - Adult) Must = 2-5" would consider its type to be a "Work Participation Status Error". + + +--- + +#### Participants use the coding instructions in conjunction with the Error Report for error definition, but it can be challenging to know whether all information is available + +When we asked participants to use the error report prototype to resolve the errors they consistently understood how to pair it with the coding instructions. + +> “I want to cheat here” (Participant referring to the Tribal Coding Instructions as a cheat sheet while responding to a particular error) - Tribe + +> “I will look at this line and then go to the guide to find more information for Item 7” - State + +> “The way the error report is… it is kind of like a maze where we have to go here and then back” - Tribe + +While all had access to at least some of the coding instructions, it wasn't always clear whether the participants had the latest or even complete versions of them. We observed one participant who had printed a few pages to keep in their workspace to help handle common errors. + +> “Is there any updated code instructions book so that we have the latest?” - State + +> “Can you get to the Instructions from [the excel error report] or no?” - Tribe + +Linking to the coding instructions; and particularly linking directly to relevant items may help reduce lookup times and make the whole process easier to navigate for those new to TANF data coding. + +> “A link to the coding instructions would not be helpful because it is 97 pages long”. - State + +--- + +#### Item number and field name represent an area where the language used in TANF documentation has shifted over time. + +The term “Item Number” originated from the fTANF system where each field is labeled as “Item [x]”. However, in the current coding instructions, it is referred to as a "Data Element". + +> “Are Item Numbers related to Data Elements?” - State + +> “What is it called… it’s not item number…” (Participant flips through a printed excerpt of the Coding Instructions) - Tribe + +After discussions with OFA regarding upcoming revisions to the coding instructions "Item number" does reflect the preferred terminology going forward. All participants ultimately managed to connect the two terms, but this is still a likely area for future knowledge center content such as an FAQ item to reassure TDP users that they're making the correct connection of terms. + +--- + +#### We further validated the utility of submission history and notification emails as ways for TANF programs to show proof of transmission for audit purposes + +The error report email and submission history page would serve to help answer two common questions that Data Analysts—and/or their auditors—have after data file submission. "When did we transmit the data files and has ACF received them?"" + +> “Referenced the transmission file as what they still gets for confirmation on when files are transmitted to ACF.” - State + +> “Transmission report is what the auditors get to show that I’ve met the timeline” - State + +> “The date and time that I submitted is critical for the auditors” - State + +> “Auditors want proof” - State + +Participants also spoke to the usefulness of TDP's notification emails for fulfilling elements of these audits. + +A common subsequent question is "Are my files without errors or do they need correction?". While evaluating TDP's acceptance statuses were not a primary goal of this research, multiple participants did respond to its presence in our prototype—commentating on acceptance status and its lack of clarity in TDRS. + +> “[After I submit] has it been accepted or is the data okay? Is it acceptable data? Do I need correct anything?” - Tribe + +> “[I] wasn’t too clear whether the current transmission report provided [all] errors or files were transmitted successfully” - State + + + +--- + +### What's next +- We plan to capture final prototype encompassing all changes informed by this research in [#2527](https://github.com/raft-tech/TANF-app/issues/2527). +- Further errors research with participants from this round who submitted files with errors for the May 15th deadline to repeat many elements of this test but directly in the context of their real data (rather than example data). \ No newline at end of file diff --git a/docs/User-Experience/Research-Syntheses/README.md b/docs/User-Experience/Research-Syntheses/README.md index 261a30fe24..43496f75a8 100644 --- a/docs/User-Experience/Research-Syntheses/README.md +++ b/docs/User-Experience/Research-Syntheses/README.md @@ -5,9 +5,15 @@ With a few exceptions, we've tended to publish markdown research syntheses to su The syntheses included herein are organized reverse-chronologically from newest to oldest: +### [2023, Sprint - TDP 3.0 Pilot Program](https://github.com/raft-tech/TANF-app/blob/develop/docs/User-Experience/Research-Syntheses/2023%2C%20Spring%20-%20Testing%20CSV%20%26%20Excel-based%20error%20reports.md#spring-2023---testing-csv--excel-based-error-reports) + +- Research sessions conducted with 5 states and 4 Tribes with a focus on programs that had errors on their Section 1 Data Files. +- Tested the usability of an Excel-based error report located in Submission History to evaluate whether participants would be successful in downloading, opening, and ultimately acting on the reports. +* Explored optimal column structures and data needed to help guide error correction and cut down on the time required to understand the report itself. + ### [2023, Winter - TDP 3.0 Pilot Program](https://github.com/raft-tech/TANF-app/blob/develop/docs/User-Experience/Research-Syntheses/2023%2C%20Winter%20-%20TDP%203.0%20Pilot%20Program.md) -- A total of 17 states, 17 tribes and two territories participated in the pilot expansion using the production version of TDP to submit their FY2023 Q1 data files. +- A total of 17 states, 17 Tribes and two territories participated in the pilot expansion using the production version of TDP to submit their FY2023 Q1 data files. - Conducted a retrospective on the usability of Django (system admin) as the TDP user base continues to expand and what might the System Admins need to keep up with onboarding, and managing users and logs at scale. ### [2022, Winter - Understanding How STTs Would Use the Transmission Report](https://github.com/raft-tech/TANF-app/blob/develop/docs/User-Experience/Research-Syntheses/2022%2C%20Winter%20-%20Understanding%20How%20STTs%20Would%20Use%20the%20Transmission%20Report.md) diff --git a/scripts/cf-check.sh b/scripts/cf-check.sh index c5f513ed7d..5eacbd9523 100755 --- a/scripts/cf-check.sh +++ b/scripts/cf-check.sh @@ -13,4 +13,5 @@ else apt-get update apt-get install cf7-cli + fi diff --git a/tdrs-backend/tdpservice/parsers/migrations/0006_alter_parsererror_item_number.py b/tdrs-backend/tdpservice/parsers/migrations/0006_alter_parsererror_item_number.py new file mode 100644 index 0000000000..79607377ed --- /dev/null +++ b/tdrs-backend/tdpservice/parsers/migrations/0006_alter_parsererror_item_number.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.15 on 2023-06-15 18:28 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('parsers', '0005_auto_20230601_1510'), + ] + + operations = [ + migrations.AlterField( + model_name='parsererror', + name='item_number', + field=models.CharField(max_length=8, null=True), + ), + ] diff --git a/tdrs-backend/tdpservice/parsers/models.py b/tdrs-backend/tdpservice/parsers/models.py index f6775021fb..4356cfb68f 100644 --- a/tdrs-backend/tdpservice/parsers/models.py +++ b/tdrs-backend/tdpservice/parsers/models.py @@ -35,7 +35,7 @@ class Meta: ) row_number = models.IntegerField(null=False) column_number = models.IntegerField(null=True) - item_number = models.IntegerField(null=True) + item_number = models.CharField(null=True, max_length=8) field_name = models.TextField(null=True, max_length=128) rpt_month_year = models.IntegerField(null=True, blank=False) case_number = models.TextField(null=True, max_length=128) diff --git a/tdrs-backend/tdpservice/parsers/schema_defs/header.py b/tdrs-backend/tdpservice/parsers/schema_defs/header.py index b51c433ede..3183142521 100644 --- a/tdrs-backend/tdpservice/parsers/schema_defs/header.py +++ b/tdrs-backend/tdpservice/parsers/schema_defs/header.py @@ -16,34 +16,34 @@ ], postparsing_validators=[], fields=[ - Field(item=1, name='title', type='string', startIndex=0, endIndex=6, required=True, validators=[ + Field(item="2", name='title', type='string', startIndex=0, endIndex=6, required=True, validators=[ validators.matches('HEADER'), ]), - Field(item=2, name='year', type='number', startIndex=6, endIndex=10, required=True, validators=[ + Field(item="4", name='year', type='number', startIndex=6, endIndex=10, required=True, validators=[ validators.between(2000, 2099) ]), - Field(item=3, name='quarter', type='string', startIndex=10, endIndex=11, required=True, validators=[ + Field(item="5", name='quarter', type='string', startIndex=10, endIndex=11, required=True, validators=[ validators.oneOf(['1', '2', '3', '4']) ]), - Field(item=4, name='type', type='string', startIndex=11, endIndex=12, required=True, validators=[ + Field(item="6", name='type', type='string', startIndex=11, endIndex=12, required=True, validators=[ validators.oneOf(['A', 'C', 'G', 'S']) ]), - Field(item=5, name='state_fips', type='string', startIndex=12, endIndex=14, required=True, validators=[ + Field(item="1", name='state_fips', type='string', startIndex=12, endIndex=14, required=True, validators=[ validators.between(0, 99) ]), - Field(item=6, name='tribe_code', type='string', startIndex=14, endIndex=17, required=False, validators=[ + Field(item="3", name='tribe_code', type='string', startIndex=14, endIndex=17, required=False, validators=[ validators.between(0, 999) ]), - Field(item=7, name='program_type', type='string', startIndex=17, endIndex=20, required=True, validators=[ + Field(item="7", name='program_type', type='string', startIndex=17, endIndex=20, required=True, validators=[ validators.oneOf(['TAN', 'SSP']) ]), - Field(item=8, name='edit', type='string', startIndex=20, endIndex=21, required=True, validators=[ + Field(item="8", name='edit', type='string', startIndex=20, endIndex=21, required=True, validators=[ validators.oneOf(['1', '2']) ]), - Field(item=9, name='encryption', type='string', startIndex=21, endIndex=22, required=False, validators=[ + Field(item="9", name='encryption', type='string', startIndex=21, endIndex=22, required=False, validators=[ validators.matches('E') ]), - Field(item=10, name='update', type='string', startIndex=22, endIndex=23, required=True, validators=[ + Field(item="10", name='update', type='string', startIndex=22, endIndex=23, required=True, validators=[ validators.oneOf(['N', 'D', 'U']) ]), ], diff --git a/tdrs-backend/tdpservice/parsers/schema_defs/ssp/m1.py b/tdrs-backend/tdpservice/parsers/schema_defs/ssp/m1.py index 79b9c8bc83..590ca4ea1e 100644 --- a/tdrs-backend/tdpservice/parsers/schema_defs/ssp/m1.py +++ b/tdrs-backend/tdpservice/parsers/schema_defs/ssp/m1.py @@ -13,89 +13,91 @@ ], postparsing_validators=[], fields=[ - Field(item=1, name='RecordType', type='string', startIndex=0, endIndex=2, + Field(item="0", name='RecordType', type='string', startIndex=0, endIndex=2, required=True, validators=[]), - Field(item=2, name='RPT_MONTH_YEAR', type='number', startIndex=2, endIndex=8, + Field(item="3", name='RPT_MONTH_YEAR', type='number', startIndex=2, endIndex=8, required=True, validators=[]), - Field(item=3, name='CASE_NUMBER', type='string', startIndex=8, endIndex=19, + Field(item="5", name='CASE_NUMBER', type='string', startIndex=8, endIndex=19, required=True, validators=[]), - Field(item=4, name='COUNTY_FIPS_CODE', type='string', startIndex=19, endIndex=22, + Field(item="2", name='COUNTY_FIPS_CODE', type='string', startIndex=19, endIndex=22, required=True, validators=[]), - Field(item=5, name='STRATUM', type='number', startIndex=22, endIndex=24, + Field(item="4", name='STRATUM', type='number', startIndex=22, endIndex=24, required=True, validators=[]), - Field(item=6, name='ZIP_CODE', type='string', startIndex=24, endIndex=29, + Field(item="6", name='ZIP_CODE', type='string', startIndex=24, endIndex=29, required=True, validators=[]), - Field(item=7, name='DISPOSITION', type='number', startIndex=29, endIndex=30, + Field(item="7", name='DISPOSITION', type='number', startIndex=29, endIndex=30, required=True, validators=[]), - Field(item=8, name='NBR_FAMILY_MEMBERS', type='number', startIndex=30, endIndex=32, + Field(item="8", name='NBR_FAMILY_MEMBERS', type='number', startIndex=30, endIndex=32, required=True, validators=[]), - Field(item=10, name='TANF_ASST_IN_6MONTHS', type='number', startIndex=33, endIndex=34, + Field(item="9", name='FAMILY_TYPE', type='number', startIndex=32, endIndex=33, required=True, validators=[]), - Field(item=11, name='RECEIVES_SUB_HOUSING', type='number', startIndex=34, endIndex=35, + Field(item="10", name='TANF_ASST_IN_6MONTHS', type='number', startIndex=33, endIndex=34, required=True, validators=[]), - Field(item=12, name='RECEIVES_MED_ASSISTANCE', type='number', startIndex=35, endIndex=36, + Field(item="11", name='RECEIVES_SUB_HOUSING', type='number', startIndex=34, endIndex=35, required=True, validators=[]), - Field(item=13, name='RECEIVES_FOOD_STAMPS', type='number', startIndex=36, endIndex=37, + Field(item="12", name='RECEIVES_MED_ASSISTANCE', type='number', startIndex=35, endIndex=36, required=True, validators=[]), - Field(item=14, name='AMT_FOOD_STAMP_ASSISTANCE', type='number', startIndex=37, endIndex=41, + Field(item="13", name='RECEIVES_FOOD_STAMPS', type='number', startIndex=36, endIndex=37, required=True, validators=[]), - Field(item=15, name='RECEIVES_SUB_CC', type='number', startIndex=41, endIndex=42, + Field(item="14", name='AMT_FOOD_STAMP_ASSISTANCE', type='number', startIndex=37, endIndex=41, required=True, validators=[]), - Field(item=16, name='AMT_SUB_CC', type='number', startIndex=42, endIndex=46, + Field(item="15", name='RECEIVES_SUB_CC', type='number', startIndex=41, endIndex=42, required=True, validators=[]), - Field(item=17, name='CHILD_SUPPORT_AMT', type='number', startIndex=46, endIndex=50, + Field(item="16", name='AMT_SUB_CC', type='number', startIndex=42, endIndex=46, required=True, validators=[]), - Field(item=18, name='FAMILY_CASH_RESOURCES', type='number', startIndex=50, endIndex=54, + Field(item="17", name='CHILD_SUPPORT_AMT', type='number', startIndex=46, endIndex=50, required=True, validators=[]), - Field(item=19, name='CASH_AMOUNT', type='number', startIndex=54, endIndex=58, + Field(item="18", name='FAMILY_CASH_RESOURCES', type='number', startIndex=50, endIndex=54, required=True, validators=[]), - Field(item=20, name='NBR_MONTHS', type='number', startIndex=58, endIndex=61, + Field(item="19A", name='CASH_AMOUNT', type='number', startIndex=54, endIndex=58, required=True, validators=[]), - Field(item=21, name='CC_AMOUNT', type='number', startIndex=61, endIndex=65, + Field(item="19B", name='NBR_MONTHS', type='number', startIndex=58, endIndex=61, required=True, validators=[]), - Field(item=22, name='CHILDREN_COVERED', type='number', startIndex=65, endIndex=67, + Field(item="20A", name='CC_AMOUNT', type='number', startIndex=61, endIndex=65, required=True, validators=[]), - Field(item=23, name='CC_NBR_MONTHS', type='number', startIndex=67, endIndex=70, + Field(item="20B", name='CHILDREN_COVERED', type='number', startIndex=65, endIndex=67, required=True, validators=[]), - Field(item=24, name='TRANSP_AMOUNT', type='number', startIndex=70, endIndex=74, + Field(item="20C", name='CC_NBR_MONTHS', type='number', startIndex=67, endIndex=70, required=True, validators=[]), - Field(item=25, name='TRANSP_NBR_MONTHS', type='number', startIndex=74, endIndex=77, + Field(item="21A", name='TRANSP_AMOUNT', type='number', startIndex=70, endIndex=74, required=True, validators=[]), - Field(item=26, name='TRANSITION_SERVICES_AMOUNT', type='number', startIndex=77, endIndex=81, + Field(item="21B", name='TRANSP_NBR_MONTHS', type='number', startIndex=74, endIndex=77, required=True, validators=[]), - Field(item=27, name='TRANSITION_NBR_MONTHS', type='number', startIndex=81, endIndex=84, + Field(item="22A", name='TRANSITION_SERVICES_AMOUNT', type='number', startIndex=77, endIndex=81, required=True, validators=[]), - Field(item=28, name='OTHER_AMOUNT', type='number', startIndex=84, endIndex=88, + Field(item="22B", name='TRANSITION_NBR_MONTHS', type='number', startIndex=81, endIndex=84, required=True, validators=[]), - Field(item=29, name='OTHER_NBR_MONTHS', type='number', startIndex=88, endIndex=91, + Field(item="23A", name='OTHER_AMOUNT', type='number', startIndex=84, endIndex=88, required=True, validators=[]), - Field(item=30, name='SANC_REDUCTION_AMT', type='number', startIndex=91, endIndex=95, + Field(item="23B", name='OTHER_NBR_MONTHS', type='number', startIndex=88, endIndex=91, required=True, validators=[]), - Field(item=31, name='WORK_REQ_SANCTION', type='number', startIndex=95, endIndex=96, + Field(item="24AI", name='SANC_REDUCTION_AMT', type='number', startIndex=91, endIndex=95, required=True, validators=[]), - Field(item=32, name='FAMILY_SANC_ADULT', type='number', startIndex=96, endIndex=97, + Field(item="24AII", name='WORK_REQ_SANCTION', type='number', startIndex=95, endIndex=96, required=True, validators=[]), - Field(item=33, name='SANC_TEEN_PARENT', type='number', startIndex=97, endIndex=98, + Field(item="24AIII", name='FAMILY_SANC_ADULT', type='number', startIndex=96, endIndex=97, required=True, validators=[]), - Field(item=34, name='NON_COOPERATION_CSE', type='number', startIndex=98, endIndex=99, + Field(item="24AIV", name='SANC_TEEN_PARENT', type='number', startIndex=97, endIndex=98, required=True, validators=[]), - Field(item=35, name='FAILURE_TO_COMPLY', type='number', startIndex=99, endIndex=100, + Field(item="24AV", name='NON_COOPERATION_CSE', type='number', startIndex=98, endIndex=99, required=True, validators=[]), - Field(item=36, name='OTHER_SANCTION', type='number', startIndex=100, endIndex=101, + Field(item="24AVI", name='FAILURE_TO_COMPLY', type='number', startIndex=99, endIndex=100, required=True, validators=[]), - Field(item=37, name='RECOUPMENT_PRIOR_OVRPMT', type='number', startIndex=101, endIndex=105, + Field(item="24AVII", name='OTHER_SANCTION', type='number', startIndex=100, endIndex=101, required=True, validators=[]), - Field(item=38, name='OTHER_TOTAL_REDUCTIONS', type='number', startIndex=105, endIndex=109, + Field(item="24B", name='RECOUPMENT_PRIOR_OVRPMT', type='number', startIndex=101, endIndex=105, required=True, validators=[]), - Field(item=39, name='FAMILY_CAP', type='number', startIndex=109, endIndex=110, + Field(item="24CI", name='OTHER_TOTAL_REDUCTIONS', type='number', startIndex=105, endIndex=109, required=True, validators=[]), - Field(item=40, name='REDUCTIONS_ON_RECEIPTS', type='number', startIndex=110, endIndex=111, + Field(item="24CII", name='FAMILY_CAP', type='number', startIndex=109, endIndex=110, required=True, validators=[]), - Field(item=41, name='OTHER_NON_SANCTION', type='number', startIndex=111, endIndex=112, + Field(item="24CIII", name='REDUCTIONS_ON_RECEIPTS', type='number', startIndex=110, endIndex=111, required=True, validators=[]), - Field(item=42, name='WAIVER_EVAL_CONTROL_GRPS', type='number', startIndex=112, endIndex=113, + Field(item="24CIV", name='OTHER_NON_SANCTION', type='number', startIndex=111, endIndex=112, required=True, validators=[]), - Field(item=43, name='BLANK', type='string', startIndex=113, endIndex=150, + Field(item="25", name='WAIVER_EVAL_CONTROL_GRPS', type='number', startIndex=112, endIndex=113, + required=True, validators=[]), + Field(item="-1", name='BLANK', type='string', startIndex=113, endIndex=150, required=False, validators=[]), ] ) diff --git a/tdrs-backend/tdpservice/parsers/schema_defs/ssp/m2.py b/tdrs-backend/tdpservice/parsers/schema_defs/ssp/m2.py index fd855181be..cc80e3431c 100644 --- a/tdrs-backend/tdpservice/parsers/schema_defs/ssp/m2.py +++ b/tdrs-backend/tdpservice/parsers/schema_defs/ssp/m2.py @@ -13,137 +13,137 @@ ], postparsing_validators=[], fields=[ - Field(item=1, name='RecordType', type='string', startIndex=0, endIndex=2, + Field(item="0", name='RecordType', type='string', startIndex=0, endIndex=2, required=True, validators=[]), - Field(item=2, name='RPT_MONTH_YEAR', type='number', startIndex=2, endIndex=8, + Field(item="3", name='RPT_MONTH_YEAR', type='number', startIndex=2, endIndex=8, required=True, validators=[]), - Field(item=3, name='CASE_NUMBER', type='string', startIndex=8, endIndex=19, + Field(item="5", name='CASE_NUMBER', type='string', startIndex=8, endIndex=19, required=True, validators=[]), - Field(item=4, name='FAMILY_AFFILIATION', type='number', startIndex=19, endIndex=20, + Field(item="26", name='FAMILY_AFFILIATION', type='number', startIndex=19, endIndex=20, required=True, validators=[]), - Field(item=5, name='NONCUSTODIAL_PARENT', type='number', startIndex=20, endIndex=21, + Field(item="27", name='NONCUSTODIAL_PARENT', type='number', startIndex=20, endIndex=21, required=True, validators=[]), - Field(item=6, name='DATE_OF_BIRTH', type='string', startIndex=21, endIndex=29, + Field(item="28", name='DATE_OF_BIRTH', type='string', startIndex=21, endIndex=29, required=True, validators=[]), - Field(item=7, name='SSN', type='string', startIndex=29, endIndex=38, + Field(item="29", name='SSN', type='string', startIndex=29, endIndex=38, required=True, validators=[]), - Field(item=8, name='RACE_HISPANIC', type='number', startIndex=38, endIndex=39, + Field(item="30A", name='RACE_HISPANIC', type='number', startIndex=38, endIndex=39, required=True, validators=[]), - Field(item=9, name='RACE_AMER_INDIAN', type='number', startIndex=39, endIndex=40, + Field(item="30B", name='RACE_AMER_INDIAN', type='number', startIndex=39, endIndex=40, required=True, validators=[]), - Field(item=10, name='RACE_ASIAN', type='number', startIndex=40, endIndex=41, + Field(item="30C", name='RACE_ASIAN', type='number', startIndex=40, endIndex=41, required=True, validators=[]), - Field(item=11, name='RACE_BLACK', type='number', startIndex=41, endIndex=42, + Field(item="30D", name='RACE_BLACK', type='number', startIndex=41, endIndex=42, required=True, validators=[]), - Field(item=12, name='RACE_HAWAIIAN', type='number', startIndex=42, endIndex=43, + Field(item="30E", name='RACE_HAWAIIAN', type='number', startIndex=42, endIndex=43, required=True, validators=[]), - Field(item=13, name='RACE_WHITE', type='number', startIndex=43, endIndex=44, + Field(item="30F", name='RACE_WHITE', type='number', startIndex=43, endIndex=44, required=True, validators=[]), - Field(item=14, name='GENDER', type='number', startIndex=44, endIndex=45, + Field(item="31", name='GENDER', type='number', startIndex=44, endIndex=45, required=True, validators=[]), - Field(item=15, name='FED_OASDI_PROGRAM', type='number', startIndex=45, endIndex=46, + Field(item="32A", name='FED_OASDI_PROGRAM', type='number', startIndex=45, endIndex=46, required=True, validators=[]), - Field(item=16, name='FED_DISABILITY_STATUS', type='number', startIndex=46, endIndex=47, + Field(item="32B", name='FED_DISABILITY_STATUS', type='number', startIndex=46, endIndex=47, required=True, validators=[]), - Field(item=17, name='DISABLED_TITLE_XIVAPDT', type='number', startIndex=47, endIndex=48, + Field(item="32C", name='DISABLED_TITLE_XIVAPDT', type='number', startIndex=47, endIndex=48, required=True, validators=[]), - Field(item=18, name='AID_AGED_BLIND', type='number', startIndex=48, endIndex=49, + Field(item="32D", name='AID_AGED_BLIND', type='number', startIndex=48, endIndex=49, required=True, validators=[]), - Field(item=19, name='RECEIVE_SSI', type='number', startIndex=49, endIndex=50, + Field(item="32E", name='RECEIVE_SSI', type='number', startIndex=49, endIndex=50, required=True, validators=[]), - Field(item=20, name='MARITAL_STATUS', type='number', startIndex=50, endIndex=51, + Field(item="33", name='MARITAL_STATUS', type='number', startIndex=50, endIndex=51, required=True, validators=[]), - Field(item=21, name='RELATIONSHIP_HOH', type='number', startIndex=51, endIndex=53, + Field(item="34", name='RELATIONSHIP_HOH', type='number', startIndex=51, endIndex=53, required=True, validators=[]), - Field(item=22, name='PARENT_MINOR_CHILD', type='number', startIndex=53, endIndex=54, + Field(item="35", name='PARENT_MINOR_CHILD', type='number', startIndex=53, endIndex=54, required=True, validators=[]), - Field(item=23, name='NEEDS_PREGNANT_WOMAN', type='number', startIndex=54, endIndex=55, + Field(item="36", name='NEEDS_PREGNANT_WOMAN', type='number', startIndex=54, endIndex=55, required=True, validators=[]), - Field(item=24, name='EDUCATION_LEVEL', type='number', startIndex=55, endIndex=57, + Field(item="37", name='EDUCATION_LEVEL', type='number', startIndex=55, endIndex=57, required=True, validators=[]), - Field(item=25, name='CITIZENSHIP_STATUS', type='number', startIndex=57, endIndex=58, + Field(item="38", name='CITIZENSHIP_STATUS', type='number', startIndex=57, endIndex=58, required=True, validators=[]), - Field(item=26, name='COOPERATION_CHILD_SUPPORT', type='number', startIndex=58, endIndex=59, + Field(item="39", name='COOPERATION_CHILD_SUPPORT', type='number', startIndex=58, endIndex=59, required=True, validators=[]), - Field(item=27, name='EMPLOYMENT_STATUS', type='number', startIndex=59, endIndex=60, + Field(item="40", name='EMPLOYMENT_STATUS', type='number', startIndex=59, endIndex=60, required=True, validators=[]), - Field(item=28, name='WORK_ELIGIBLE_INDICATOR', type='number', startIndex=60, endIndex=62, + Field(item="41", name='WORK_ELIGIBLE_INDICATOR', type='number', startIndex=60, endIndex=62, required=True, validators=[]), - Field(item=29, name='WORK_PART_STATUS', type='number', startIndex=62, endIndex=64, + Field(item="42", name='WORK_PART_STATUS', type='number', startIndex=62, endIndex=64, required=True, validators=[]), - Field(item=30, name='UNSUB_EMPLOYMENT', type='number', startIndex=64, endIndex=66, + Field(item="43", name='UNSUB_EMPLOYMENT', type='number', startIndex=64, endIndex=66, required=True, validators=[]), - Field(item=31, name='SUB_PRIVATE_EMPLOYMENT', type='number', startIndex=66, endIndex=68, + Field(item="44", name='SUB_PRIVATE_EMPLOYMENT', type='number', startIndex=66, endIndex=68, required=True, validators=[]), - Field(item=32, name='SUB_PUBLIC_EMPLOYMENT', type='number', startIndex=68, endIndex=70, + Field(item="45", name='SUB_PUBLIC_EMPLOYMENT', type='number', startIndex=68, endIndex=70, required=True, validators=[]), - Field(item=33, name='WORK_EXPERIENCE_HOP', type='number', startIndex=70, endIndex=72, + Field(item="46A", name='WORK_EXPERIENCE_HOP', type='number', startIndex=70, endIndex=72, required=True, validators=[]), - Field(item=34, name='WORK_EXPERIENCE_EA', type='number', startIndex=72, endIndex=74, + Field(item="46B", name='WORK_EXPERIENCE_EA', type='number', startIndex=72, endIndex=74, required=True, validators=[]), - Field(item=35, name='WORK_EXPERIENCE_HOL', type='number', startIndex=74, endIndex=76, + Field(item="46C", name='WORK_EXPERIENCE_HOL', type='number', startIndex=74, endIndex=76, required=True, validators=[]), - Field(item=36, name='OJT', type='number', startIndex=76, endIndex=78, + Field(item="47", name='OJT', type='number', startIndex=76, endIndex=78, required=True, validators=[]), - Field(item=37, name='JOB_SEARCH_HOP', type='number', startIndex=78, endIndex=80, + Field(item="48A", name='JOB_SEARCH_HOP', type='number', startIndex=78, endIndex=80, required=True, validators=[]), - Field(item=38, name='JOB_SEARCH_EA', type='number', startIndex=80, endIndex=82, + Field(item="48B", name='JOB_SEARCH_EA', type='number', startIndex=80, endIndex=82, required=True, validators=[]), - Field(item=39, name='JOB_SEARCH_HOL', type='number', startIndex=82, endIndex=84, + Field(item="48C", name='JOB_SEARCH_HOL', type='number', startIndex=82, endIndex=84, required=True, validators=[]), - Field(item=40, name='COMM_SERVICES_HOP', type='number', startIndex=84, endIndex=86, + Field(item="49A", name='COMM_SERVICES_HOP', type='number', startIndex=84, endIndex=86, required=True, validators=[]), - Field(item=41, name='COMM_SERVICES_EA', type='number', startIndex=86, endIndex=88, + Field(item="49B", name='COMM_SERVICES_EA', type='number', startIndex=86, endIndex=88, required=True, validators=[]), - Field(item=42, name='COMM_SERVICES_HOL', type='number', startIndex=88, endIndex=90, + Field(item="49C", name='COMM_SERVICES_HOL', type='number', startIndex=88, endIndex=90, required=True, validators=[]), - Field(item=43, name='VOCATIONAL_ED_TRAINING_HOP', type='number', startIndex=90, endIndex=92, + Field(item="50A", name='VOCATIONAL_ED_TRAINING_HOP', type='number', startIndex=90, endIndex=92, required=True, validators=[]), - Field(item=44, name='VOCATIONAL_ED_TRAINING_EA', type='number', startIndex=92, endIndex=94, + Field(item="50B", name='VOCATIONAL_ED_TRAINING_EA', type='number', startIndex=92, endIndex=94, required=True, validators=[]), - Field(item=45, name='VOCATIONAL_ED_TRAINING_HOL', type='number', startIndex=94, endIndex=96, + Field(item="50C", name='VOCATIONAL_ED_TRAINING_HOL', type='number', startIndex=94, endIndex=96, required=True, validators=[]), - Field(item=46, name='JOB_SKILLS_TRAINING_HOP', type='number', startIndex=96, endIndex=98, + Field(item="51A", name='JOB_SKILLS_TRAINING_HOP', type='number', startIndex=96, endIndex=98, required=True, validators=[]), - Field(item=47, name='JOB_SKILLS_TRAINING_EA', type='number', startIndex=98, endIndex=100, + Field(item="51B", name='JOB_SKILLS_TRAINING_EA', type='number', startIndex=98, endIndex=100, required=True, validators=[]), - Field(item=48, name='JOB_SKILLS_TRAINING_HOL', type='number', startIndex=100, endIndex=102, + Field(item="51C", name='JOB_SKILLS_TRAINING_HOL', type='number', startIndex=100, endIndex=102, required=True, validators=[]), - Field(item=49, name='ED_NO_HIGH_SCHOOL_DIPL_HOP', type='number', startIndex=102, endIndex=104, + Field(item="52A", name='ED_NO_HIGH_SCHOOL_DIPL_HOP', type='number', startIndex=102, endIndex=104, required=True, validators=[]), - Field(item=50, name='ED_NO_HIGH_SCHOOL_DIPL_EA', type='number', startIndex=104, endIndex=106, + Field(item="52B", name='ED_NO_HIGH_SCHOOL_DIPL_EA', type='number', startIndex=104, endIndex=106, required=True, validators=[]), - Field(item=51, name='ED_NO_HIGH_SCHOOL_DIPL_HOL', type='number', startIndex=106, endIndex=108, + Field(item="52C", name='ED_NO_HIGH_SCHOOL_DIPL_HOL', type='number', startIndex=106, endIndex=108, required=True, validators=[]), - Field(item=52, name='SCHOOL_ATTENDENCE_HOP', type='number', startIndex=108, endIndex=110, + Field(item="53A", name='SCHOOL_ATTENDENCE_HOP', type='number', startIndex=108, endIndex=110, required=True, validators=[]), - Field(item=53, name='SCHOOL_ATTENDENCE_EA', type='number', startIndex=110, endIndex=112, + Field(item="53B", name='SCHOOL_ATTENDENCE_EA', type='number', startIndex=110, endIndex=112, required=True, validators=[]), - Field(item=54, name='SCHOOL_ATTENDENCE_HOL', type='number', startIndex=112, endIndex=114, + Field(item="53C", name='SCHOOL_ATTENDENCE_HOL', type='number', startIndex=112, endIndex=114, required=True, validators=[]), - Field(item=55, name='PROVIDE_CC_HOP', type='number', startIndex=114, endIndex=116, + Field(item="54A", name='PROVIDE_CC_HOP', type='number', startIndex=114, endIndex=116, required=True, validators=[]), - Field(item=56, name='PROVIDE_CC_EA', type='number', startIndex=116, endIndex=118, + Field(item="54B", name='PROVIDE_CC_EA', type='number', startIndex=116, endIndex=118, required=True, validators=[]), - Field(item=57, name='PROVIDE_CC_HOL', type='number', startIndex=118, endIndex=120, + Field(item="54C", name='PROVIDE_CC_HOL', type='number', startIndex=118, endIndex=120, required=True, validators=[]), - Field(item=58, name='OTHER_WORK_ACTIVITIES', type='number', startIndex=120, endIndex=122, + Field(item="55", name='OTHER_WORK_ACTIVITIES', type='number', startIndex=120, endIndex=122, required=True, validators=[]), - Field(item=59, name='DEEMED_HOURS_FOR_OVERALL', type='number', startIndex=122, endIndex=124, + Field(item="56", name='DEEMED_HOURS_FOR_OVERALL', type='number', startIndex=122, endIndex=124, required=True, validators=[]), - Field(item=60, name='DEEMED_HOURS_FOR_TWO_PARENT', type='number', startIndex=124, endIndex=126, + Field(item="57", name='DEEMED_HOURS_FOR_TWO_PARENT', type='number', startIndex=124, endIndex=126, required=True, validators=[]), - Field(item=61, name='EARNED_INCOME', type='number', startIndex=126, endIndex=130, + Field(item="58", name='EARNED_INCOME', type='number', startIndex=126, endIndex=130, required=True, validators=[]), - Field(item=62, name='UNEARNED_INCOME_TAX_CREDIT', type='number', startIndex=130, endIndex=134, + Field(item="59A", name='UNEARNED_INCOME_TAX_CREDIT', type='number', startIndex=130, endIndex=134, required=True, validators=[]), - Field(item=63, name='UNEARNED_SOCIAL_SECURITY', type='number', startIndex=134, endIndex=138, + Field(item="59B", name='UNEARNED_SOCIAL_SECURITY', type='number', startIndex=134, endIndex=138, required=True, validators=[]), - Field(item=64, name='UNEARNED_SSI', type='number', startIndex=138, endIndex=142, + Field(item="59C", name='UNEARNED_SSI', type='number', startIndex=138, endIndex=142, required=True, validators=[]), - Field(item=65, name='UNEARNED_WORKERS_COMP', type='number', startIndex=142, endIndex=146, + Field(item="59D", name='UNEARNED_WORKERS_COMP', type='number', startIndex=142, endIndex=146, required=True, validators=[]), - Field(item=66, name='OTHER_UNEARNED_INCOME', type='number', startIndex=146, endIndex=150, + Field(item="59E", name='OTHER_UNEARNED_INCOME', type='number', startIndex=146, endIndex=150, required=True, validators=[]), ], ) diff --git a/tdrs-backend/tdpservice/parsers/schema_defs/ssp/m3.py b/tdrs-backend/tdpservice/parsers/schema_defs/ssp/m3.py index c269861ff7..c2f1551cc6 100644 --- a/tdrs-backend/tdpservice/parsers/schema_defs/ssp/m3.py +++ b/tdrs-backend/tdpservice/parsers/schema_defs/ssp/m3.py @@ -13,47 +13,47 @@ ], postparsing_validators=[], fields=[ - Field(item=1, name='RecordType', type='string', startIndex=0, endIndex=2, + Field(item="0", name='RecordType', type='string', startIndex=0, endIndex=2, required=True, validators=[]), - Field(item=2, name='RPT_MONTH_YEAR', type='number', startIndex=2, endIndex=8, + Field(item="3", name='RPT_MONTH_YEAR', type='number', startIndex=2, endIndex=8, required=True, validators=[]), - Field(item=3, name='CASE_NUMBER', type='string', startIndex=8, endIndex=19, + Field(item="5", name='CASE_NUMBER', type='string', startIndex=8, endIndex=19, required=True, validators=[]), - Field(item=4, name='FAMILY_AFFILIATION', type='number', startIndex=19, endIndex=20, + Field(item="60", name='FAMILY_AFFILIATION', type='number', startIndex=19, endIndex=20, required=True, validators=[]), - Field(item=5, name='DATE_OF_BIRTH', type='string', startIndex=20, endIndex=28, + Field(item="61", name='DATE_OF_BIRTH', type='string', startIndex=20, endIndex=28, required=True, validators=[]), - Field(item=6, name='SSN', type='string', startIndex=28, endIndex=37, + Field(item="62", name='SSN', type='string', startIndex=28, endIndex=37, required=True, validators=[]), - Field(item=7, name='RACE_HISPANIC', type='number', startIndex=37, endIndex=38, + Field(item="63A", name='RACE_HISPANIC', type='number', startIndex=37, endIndex=38, required=True, validators=[]), - Field(item=8, name='RACE_AMER_INDIAN', type='number', startIndex=38, endIndex=39, + Field(item="63B", name='RACE_AMER_INDIAN', type='number', startIndex=38, endIndex=39, required=True, validators=[]), - Field(item=9, name='RACE_ASIAN', type='number', startIndex=39, endIndex=40, + Field(item="63C", name='RACE_ASIAN', type='number', startIndex=39, endIndex=40, required=True, validators=[]), - Field(item=10, name='RACE_BLACK', type='number', startIndex=40, endIndex=41, + Field(item="63D", name='RACE_BLACK', type='number', startIndex=40, endIndex=41, required=True, validators=[]), - Field(item=11, name='RACE_HAWAIIAN', type='number', startIndex=41, endIndex=42, + Field(item="63E", name='RACE_HAWAIIAN', type='number', startIndex=41, endIndex=42, required=True, validators=[]), - Field(item=12, name='RACE_WHITE', type='number', startIndex=42, endIndex=43, + Field(item="63F", name='RACE_WHITE', type='number', startIndex=42, endIndex=43, required=True, validators=[]), - Field(item=13, name='GENDER', type='number', startIndex=43, endIndex=44, + Field(item="64", name='GENDER', type='number', startIndex=43, endIndex=44, required=True, validators=[]), - Field(item=14, name='RECEIVE_NONSSI_BENEFITS', type='number', startIndex=44, endIndex=45, + Field(item="65A", name='RECEIVE_NONSSI_BENEFITS', type='number', startIndex=44, endIndex=45, required=True, validators=[]), - Field(item=15, name='RECEIVE_SSI', type='number', startIndex=45, endIndex=46, + Field(item="65B", name='RECEIVE_SSI', type='number', startIndex=45, endIndex=46, required=True, validators=[]), - Field(item=16, name='RELATIONSHIP_HOH', type='number', startIndex=46, endIndex=48, + Field(item="66", name='RELATIONSHIP_HOH', type='number', startIndex=46, endIndex=48, required=True, validators=[]), - Field(item=17, name='PARENT_MINOR_CHILD', type='number', startIndex=48, endIndex=49, + Field(item="67", name='PARENT_MINOR_CHILD', type='number', startIndex=48, endIndex=49, required=True, validators=[]), - Field(item=18, name='EDUCATION_LEVEL', type='number', startIndex=49, endIndex=51, + Field(item="68", name='EDUCATION_LEVEL', type='number', startIndex=49, endIndex=51, required=True, validators=[]), - Field(item=19, name='CITIZENSHIP_STATUS', type='number', startIndex=51, endIndex=52, + Field(item="69", name='CITIZENSHIP_STATUS', type='number', startIndex=51, endIndex=52, required=True, validators=[]), - Field(item=20, name='UNEARNED_SSI', type='number', startIndex=52, endIndex=56, + Field(item="70A", name='UNEARNED_SSI', type='number', startIndex=52, endIndex=56, required=True, validators=[]), - Field(item=21, name='OTHER_UNEARNED_INCOME', type='number', startIndex=56, endIndex=60, + Field(item="70B", name='OTHER_UNEARNED_INCOME', type='number', startIndex=56, endIndex=60, required=True, validators=[]) ] ) @@ -67,47 +67,47 @@ ], postparsing_validators=[], fields=[ - Field(item=1, name='RecordType', type='string', startIndex=0, endIndex=2, + Field(item="0", name='RecordType', type='string', startIndex=0, endIndex=2, required=True, validators=[]), - Field(item=2, name='RPT_MONTH_YEAR', type='number', startIndex=2, endIndex=8, + Field(item="3", name='RPT_MONTH_YEAR', type='number', startIndex=2, endIndex=8, required=True, validators=[]), - Field(item=3, name='CASE_NUMBER', type='string', startIndex=8, endIndex=19, + Field(item="5", name='CASE_NUMBER', type='string', startIndex=8, endIndex=19, required=True, validators=[]), - Field(item=22, name='FAMILY_AFFILIATION', type='number', startIndex=60, endIndex=61, + Field(item="60", name='FAMILY_AFFILIATION', type='number', startIndex=60, endIndex=61, required=True, validators=[]), - Field(item=23, name='DATE_OF_BIRTH', type='string', startIndex=61, endIndex=69, + Field(item="61", name='DATE_OF_BIRTH', type='string', startIndex=61, endIndex=69, required=True, validators=[]), - Field(item=24, name='SSN', type='string', startIndex=69, endIndex=78, + Field(item="62", name='SSN', type='string', startIndex=69, endIndex=78, required=True, validators=[]), - Field(item=25, name='RACE_HISPANIC', type='number', startIndex=78, endIndex=79, + Field(item="63A", name='RACE_HISPANIC', type='number', startIndex=78, endIndex=79, required=True, validators=[]), - Field(item=26, name='RACE_AMER_INDIAN', type='number', startIndex=79, endIndex=80, + Field(item="63B", name='RACE_AMER_INDIAN', type='number', startIndex=79, endIndex=80, required=True, validators=[]), - Field(item=27, name='RACE_ASIAN', type='number', startIndex=80, endIndex=81, + Field(item="63C", name='RACE_ASIAN', type='number', startIndex=80, endIndex=81, required=True, validators=[]), - Field(item=28, name='RACE_BLACK', type='number', startIndex=81, endIndex=82, + Field(item="63D", name='RACE_BLACK', type='number', startIndex=81, endIndex=82, required=True, validators=[]), - Field(item=29, name='RACE_HAWAIIAN', type='number', startIndex=82, endIndex=83, + Field(item="63E", name='RACE_HAWAIIAN', type='number', startIndex=82, endIndex=83, required=True, validators=[]), - Field(item=30, name='RACE_WHITE', type='number', startIndex=83, endIndex=84, + Field(item="63F", name='RACE_WHITE', type='number', startIndex=83, endIndex=84, required=True, validators=[]), - Field(item=31, name='GENDER', type='number', startIndex=84, endIndex=85, + Field(item="64", name='GENDER', type='number', startIndex=84, endIndex=85, required=True, validators=[]), - Field(item=32, name='RECEIVE_NONSSI_BENEFITS', type='number', startIndex=85, endIndex=86, + Field(item="65A", name='RECEIVE_NONSSI_BENEFITS', type='number', startIndex=85, endIndex=86, required=True, validators=[]), - Field(item=33, name='RECEIVE_SSI', type='number', startIndex=86, endIndex=87, + Field(item="65B", name='RECEIVE_SSI', type='number', startIndex=86, endIndex=87, required=True, validators=[]), - Field(item=34, name='RELATIONSHIP_HOH', type='number', startIndex=87, endIndex=89, + Field(item="66", name='RELATIONSHIP_HOH', type='number', startIndex=87, endIndex=89, required=True, validators=[]), - Field(item=35, name='PARENT_MINOR_CHILD', type='number', startIndex=89, endIndex=90, + Field(item="67", name='PARENT_MINOR_CHILD', type='number', startIndex=89, endIndex=90, required=True, validators=[]), - Field(item=36, name='EDUCATION_LEVEL', type='number', startIndex=90, endIndex=92, + Field(item="68", name='EDUCATION_LEVEL', type='number', startIndex=90, endIndex=92, required=True, validators=[]), - Field(item=37, name='CITIZENSHIP_STATUS', type='number', startIndex=92, endIndex=93, + Field(item="69", name='CITIZENSHIP_STATUS', type='number', startIndex=92, endIndex=93, required=True, validators=[]), - Field(item=38, name='UNEARNED_SSI', type='number', startIndex=93, endIndex=97, + Field(item="70A", name='UNEARNED_SSI', type='number', startIndex=93, endIndex=97, required=True, validators=[]), - Field(item=39, name='OTHER_UNEARNED_INCOME', type='number', startIndex=97, endIndex=101, + Field(item="70B", name='OTHER_UNEARNED_INCOME', type='number', startIndex=97, endIndex=101, required=True, validators=[]) ] ) diff --git a/tdrs-backend/tdpservice/parsers/schema_defs/tanf/t1.py b/tdrs-backend/tdpservice/parsers/schema_defs/tanf/t1.py index ceb59db10e..7626278aa2 100644 --- a/tdrs-backend/tdpservice/parsers/schema_defs/tanf/t1.py +++ b/tdrs-backend/tdpservice/parsers/schema_defs/tanf/t1.py @@ -13,96 +13,96 @@ ], postparsing_validators=[], fields=[ - Field(item=1, name='RecordType', type='string', startIndex=0, endIndex=2, + Field(item="0", name='RecordType', type='string', startIndex=0, endIndex=2, required=True, validators=[]), - Field(item=2, name='RPT_MONTH_YEAR', type='number', startIndex=2, endIndex=8, + Field(item="4", name='RPT_MONTH_YEAR', type='number', startIndex=2, endIndex=8, required=True, validators=[]), - Field(item=3, name='CASE_NUMBER', type='string', startIndex=8, endIndex=19, + Field(item="6", name='CASE_NUMBER', type='string', startIndex=8, endIndex=19, required=True, validators=[]), - Field(item=4, name='COUNTY_FIPS_CODE', type='string', startIndex=19, endIndex=22, + Field(item="2", name='COUNTY_FIPS_CODE', type='string', startIndex=19, endIndex=22, required=True, validators=[]), - Field(item=5, name='STRATUM', type='number', startIndex=22, endIndex=24, + Field(item="5", name='STRATUM', type='number', startIndex=22, endIndex=24, required=True, validators=[]), - Field(item=6, name='ZIP_CODE', type='string', startIndex=24, endIndex=29, + Field(item="7", name='ZIP_CODE', type='string', startIndex=24, endIndex=29, required=True, validators=[]), - Field(item=7, name='FUNDING_STREAM', type='number', startIndex=29, endIndex=30, + Field(item="8", name='FUNDING_STREAM', type='number', startIndex=29, endIndex=30, required=True, validators=[]), - Field(item=8, name='DISPOSITION', type='number', startIndex=30, endIndex=31, + Field(item="9", name='DISPOSITION', type='number', startIndex=30, endIndex=31, required=True, validators=[]), - Field(item=9, name='NEW_APPLICANT', type='number', startIndex=31, endIndex=32, + Field(item="10", name='NEW_APPLICANT', type='number', startIndex=31, endIndex=32, required=True, validators=[]), - Field(item=10, name='NBR_FAMILY_MEMBERS', type='number', startIndex=32, endIndex=34, + Field(item="11", name='NBR_FAMILY_MEMBERS', type='number', startIndex=32, endIndex=34, required=True, validators=[]), - Field(item=11, name='FAMILY_TYPE', type='number', startIndex=34, endIndex=35, + Field(item="12", name='FAMILY_TYPE', type='number', startIndex=34, endIndex=35, required=True, validators=[]), - Field(item=12, name='RECEIVES_SUB_HOUSING', type='number', startIndex=35, endIndex=36, + Field(item="13", name='RECEIVES_SUB_HOUSING', type='number', startIndex=35, endIndex=36, required=True, validators=[]), - Field(item=13, name='RECEIVES_MED_ASSISTANCE', type='number', startIndex=36, endIndex=37, + Field(item="14", name='RECEIVES_MED_ASSISTANCE', type='number', startIndex=36, endIndex=37, required=True, validators=[]), - Field(item=14, name='RECEIVES_FOOD_STAMPS', type='number', startIndex=37, endIndex=38, + Field(item="15", name='RECEIVES_FOOD_STAMPS', type='number', startIndex=37, endIndex=38, required=True, validators=[]), - Field(item=15, name='AMT_FOOD_STAMP_ASSISTANCE', type='number', startIndex=38, endIndex=42, + Field(item="16", name='AMT_FOOD_STAMP_ASSISTANCE', type='number', startIndex=38, endIndex=42, required=True, validators=[]), - Field(item=16, name='RECEIVES_SUB_CC', type='number', startIndex=42, endIndex=43, + Field(item="17", name='RECEIVES_SUB_CC', type='number', startIndex=42, endIndex=43, required=True, validators=[]), - Field(item=17, name='AMT_SUB_CC', type='number', startIndex=43, endIndex=47, + Field(item="18", name='AMT_SUB_CC', type='number', startIndex=43, endIndex=47, required=True, validators=[]), - Field(item=18, name='CHILD_SUPPORT_AMT', type='number', startIndex=47, endIndex=51, + Field(item="19", name='CHILD_SUPPORT_AMT', type='number', startIndex=47, endIndex=51, required=True, validators=[]), - Field(item=19, name='FAMILY_CASH_RESOURCES', type='number', startIndex=51, endIndex=55, + Field(item="20", name='FAMILY_CASH_RESOURCES', type='number', startIndex=51, endIndex=55, required=True, validators=[]), - Field(item=20, name='CASH_AMOUNT', type='number', startIndex=55, endIndex=59, + Field(item="21A", name='CASH_AMOUNT', type='number', startIndex=55, endIndex=59, required=True, validators=[]), - Field(item=21, name='NBR_MONTHS', type='number', startIndex=59, endIndex=62, + Field(item="21B", name='NBR_MONTHS', type='number', startIndex=59, endIndex=62, required=True, validators=[]), - Field(item=22, name='CC_AMOUNT', type='number', startIndex=62, endIndex=66, + Field(item="22A", name='CC_AMOUNT', type='number', startIndex=62, endIndex=66, required=True, validators=[]), - Field(item=23, name='CHILDREN_COVERED', type='number', startIndex=66, endIndex=68, + Field(item="22B", name='CHILDREN_COVERED', type='number', startIndex=66, endIndex=68, required=True, validators=[]), - Field(item=24, name='CC_NBR_MONTHS', type='number', startIndex=68, endIndex=71, + Field(item="22C", name='CC_NBR_MONTHS', type='number', startIndex=68, endIndex=71, required=True, validators=[]), - Field(item=25, name='TRANSP_AMOUNT', type='number', startIndex=71, endIndex=75, + Field(item="23A", name='TRANSP_AMOUNT', type='number', startIndex=71, endIndex=75, required=True, validators=[]), - Field(item=26, name='TRANSP_NBR_MONTHS', type='number', startIndex=75, endIndex=78, + Field(item="23B", name='TRANSP_NBR_MONTHS', type='number', startIndex=75, endIndex=78, required=True, validators=[]), - Field(item=27, name='TRANSITION_SERVICES_AMOUNT', type='number', startIndex=78, endIndex=82, + Field(item="24A", name='TRANSITION_SERVICES_AMOUNT', type='number', startIndex=78, endIndex=82, required=True, validators=[]), - Field(item=28, name='TRANSITION_NBR_MONTHS', type='number', startIndex=82, endIndex=85, + Field(item="24B", name='TRANSITION_NBR_MONTHS', type='number', startIndex=82, endIndex=85, required=True, validators=[]), - Field(item=29, name='OTHER_AMOUNT', type='number', startIndex=85, endIndex=89, + Field(item="25A", name='OTHER_AMOUNT', type='number', startIndex=85, endIndex=89, required=True, validators=[]), - Field(item=30, name='OTHER_NBR_MONTHS', type='number', startIndex=89, endIndex=92, + Field(item="25B", name='OTHER_NBR_MONTHS', type='number', startIndex=89, endIndex=92, required=True, validators=[]), - Field(item=31, name='SANC_REDUCTION_AMT', type='number', startIndex=92, endIndex=96, + Field(item="26AI", name='SANC_REDUCTION_AMT', type='number', startIndex=92, endIndex=96, required=True, validators=[]), - Field(item=32, name='WORK_REQ_SANCTION', type='number', startIndex=96, endIndex=97, + Field(item="26AII", name='WORK_REQ_SANCTION', type='number', startIndex=96, endIndex=97, required=True, validators=[]), - Field(item=33, name='FAMILY_SANC_ADULT', type='number', startIndex=97, endIndex=98, + Field(item="26AIII", name='FAMILY_SANC_ADULT', type='number', startIndex=97, endIndex=98, required=True, validators=[]), - Field(item=34, name='SANC_TEEN_PARENT', type='number', startIndex=98, endIndex=99, + Field(item="26AIV", name='SANC_TEEN_PARENT', type='number', startIndex=98, endIndex=99, required=True, validators=[]), - Field(item=35, name='NON_COOPERATION_CSE', type='number', startIndex=99, endIndex=100, + Field(item="26AV", name='NON_COOPERATION_CSE', type='number', startIndex=99, endIndex=100, required=True, validators=[]), - Field(item=36, name='FAILURE_TO_COMPLY', type='number', startIndex=100, endIndex=101, + Field(item="26AVI", name='FAILURE_TO_COMPLY', type='number', startIndex=100, endIndex=101, required=True, validators=[]), - Field(item=37, name='OTHER_SANCTION', type='number', startIndex=101, endIndex=102, + Field(item="26AVII", name='OTHER_SANCTION', type='number', startIndex=101, endIndex=102, required=True, validators=[]), - Field(item=38, name='RECOUPMENT_PRIOR_OVRPMT', type='number', startIndex=102, endIndex=106, + Field(item="26B", name='RECOUPMENT_PRIOR_OVRPMT', type='number', startIndex=102, endIndex=106, required=True, validators=[]), - Field(item=39, name='OTHER_TOTAL_REDUCTIONS', type='number', startIndex=106, endIndex=110, + Field(item="26CI", name='OTHER_TOTAL_REDUCTIONS', type='number', startIndex=106, endIndex=110, required=True, validators=[]), - Field(item=40, name='FAMILY_CAP', type='number', startIndex=110, endIndex=111, + Field(item="26CII", name='FAMILY_CAP', type='number', startIndex=110, endIndex=111, required=True, validators=[]), - Field(item=41, name='REDUCTIONS_ON_RECEIPTS', type='number', startIndex=111, endIndex=112, + Field(item="26CIII", name='REDUCTIONS_ON_RECEIPTS', type='number', startIndex=111, endIndex=112, required=True, validators=[]), - Field(item=42, name='OTHER_NON_SANCTION', type='number', startIndex=112, endIndex=113, + Field(item="26CIV", name='OTHER_NON_SANCTION', type='number', startIndex=112, endIndex=113, required=True, validators=[]), - Field(item=43, name='WAIVER_EVAL_CONTROL_GRPS', type='number', startIndex=113, endIndex=114, + Field(item="27", name='WAIVER_EVAL_CONTROL_GRPS', type='number', startIndex=113, endIndex=114, required=True, validators=[]), - Field(item=44, name='FAMILY_EXEMPT_TIME_LIMITS', type='number', startIndex=114, endIndex=116, + Field(item="28", name='FAMILY_EXEMPT_TIME_LIMITS', type='number', startIndex=114, endIndex=116, required=True, validators=[]), - Field(item=45, name='FAMILY_NEW_CHILD', type='number', startIndex=116, endIndex=117, + Field(item="29", name='FAMILY_NEW_CHILD', type='number', startIndex=116, endIndex=117, required=True, validators=[]), - Field(item=46, name='BLANK', type='string', startIndex=117, endIndex=156, required=False, validators=[]), + Field(item="-1", name='BLANK', type='string', startIndex=117, endIndex=156, required=False, validators=[]), ], ) diff --git a/tdrs-backend/tdpservice/parsers/schema_defs/tanf/t2.py b/tdrs-backend/tdpservice/parsers/schema_defs/tanf/t2.py index dc94263d45..49ec6eff1e 100644 --- a/tdrs-backend/tdpservice/parsers/schema_defs/tanf/t2.py +++ b/tdrs-backend/tdpservice/parsers/schema_defs/tanf/t2.py @@ -13,143 +13,143 @@ ], postparsing_validators=[], fields=[ - Field(item=1, name='RecordType', type='string', startIndex=0, endIndex=2, + Field(item="0", name='RecordType', type='string', startIndex=0, endIndex=2, required=True, validators=[]), - Field(item=2, name='RPT_MONTH_YEAR', type='number', startIndex=2, endIndex=8, + Field(item="4", name='RPT_MONTH_YEAR', type='number', startIndex=2, endIndex=8, required=True, validators=[]), - Field(item=3, name='CASE_NUMBER', type='string', startIndex=8, endIndex=19, + Field(item="6", name='CASE_NUMBER', type='string', startIndex=8, endIndex=19, required=True, validators=[]), - Field(item=4, name='FAMILY_AFFILIATION', type='number', startIndex=19, endIndex=20, + Field(item="30", name='FAMILY_AFFILIATION', type='number', startIndex=19, endIndex=20, required=True, validators=[]), - Field(item=5, name='NONCUSTODIAL_PARENT', type='number', startIndex=20, endIndex=21, + Field(item="31", name='NONCUSTODIAL_PARENT', type='number', startIndex=20, endIndex=21, required=True, validators=[]), - Field(item=6, name='DATE_OF_BIRTH', type='number', startIndex=21, endIndex=29, + Field(item="32", name='DATE_OF_BIRTH', type='number', startIndex=21, endIndex=29, required=True, validators=[]), - Field(item=7, name='SSN', type='string', startIndex=29, endIndex=38, + Field(item="33", name='SSN', type='string', startIndex=29, endIndex=38, required=True, validators=[]), - Field(item=8, name='RACE_HISPANIC', type='string', startIndex=38, endIndex=39, + Field(item="34A", name='RACE_HISPANIC', type='string', startIndex=38, endIndex=39, required=True, validators=[]), - Field(item=9, name='RACE_AMER_INDIAN', type='string', startIndex=39, endIndex=40, + Field(item="34B", name='RACE_AMER_INDIAN', type='string', startIndex=39, endIndex=40, required=True, validators=[]), - Field(item=10, name='RACE_ASIAN', type='string', startIndex=40, endIndex=41, + Field(item="34C", name='RACE_ASIAN', type='string', startIndex=40, endIndex=41, required=True, validators=[]), - Field(item=11, name='RACE_BLACK', type='string', startIndex=41, endIndex=42, + Field(item="34D", name='RACE_BLACK', type='string', startIndex=41, endIndex=42, required=True, validators=[]), - Field(item=12, name='RACE_HAWAIIAN', type='string', startIndex=42, endIndex=43, + Field(item="34E", name='RACE_HAWAIIAN', type='string', startIndex=42, endIndex=43, required=True, validators=[]), - Field(item=13, name='RACE_WHITE', type='string', startIndex=43, endIndex=44, + Field(item="34F", name='RACE_WHITE', type='string', startIndex=43, endIndex=44, required=True, validators=[]), - Field(item=14, name='GENDER', type='number', startIndex=44, endIndex=45, + Field(item="35", name='GENDER', type='number', startIndex=44, endIndex=45, required=True, validators=[]), - Field(item=15, name='FED_OASDI_PROGRAM', type='string', startIndex=45, endIndex=46, + Field(item="36A", name='FED_OASDI_PROGRAM', type='string', startIndex=45, endIndex=46, required=True, validators=[]), - Field(item=16, name='FED_DISABILITY_STATUS', type='string', startIndex=46, endIndex=47, + Field(item="36B", name='FED_DISABILITY_STATUS', type='string', startIndex=46, endIndex=47, required=True, validators=[]), - Field(item=17, name='DISABLED_TITLE_XIVAPDT', type='string', startIndex=47, endIndex=48, + Field(item="36C", name='DISABLED_TITLE_XIVAPDT', type='string', startIndex=47, endIndex=48, required=True, validators=[]), - Field(item=18, name='AID_AGED_BLIND', type='string', startIndex=48, endIndex=49, + Field(item="36D", name='AID_AGED_BLIND', type='string', startIndex=48, endIndex=49, required=True, validators=[]), - Field(item=19, name='RECEIVE_SSI', type='string', startIndex=49, endIndex=50, + Field(item="36E", name='RECEIVE_SSI', type='string', startIndex=49, endIndex=50, required=True, validators=[]), - Field(item=20, name='MARITAL_STATUS', type='string', startIndex=50, endIndex=51, + Field(item="37", name='MARITAL_STATUS', type='string', startIndex=50, endIndex=51, required=True, validators=[]), - Field(item=21, name='RELATIONSHIP_HOH', type='number', startIndex=51, endIndex=53, + Field(item="38", name='RELATIONSHIP_HOH', type='number', startIndex=51, endIndex=53, required=True, validators=[]), - Field(item=22, name='PARENT_WITH_MINOR_CHILD', type='string', startIndex=53, endIndex=54, + Field(item="39", name='PARENT_WITH_MINOR_CHILD', type='string', startIndex=53, endIndex=54, required=True, validators=[]), - Field(item=23, name='NEEDS_PREGNANT_WOMAN', type='string', startIndex=54, endIndex=55, + Field(item="40", name='NEEDS_PREGNANT_WOMAN', type='string', startIndex=54, endIndex=55, required=True, validators=[]), - Field(item=24, name='EDUCATION_LEVEL', type='string', startIndex=55, endIndex=57, + Field(item="41", name='EDUCATION_LEVEL', type='string', startIndex=55, endIndex=57, required=True, validators=[]), - Field(item=25, name='CITIZENSHIP_STATUS', type='string', startIndex=57, endIndex=58, + Field(item="42", name='CITIZENSHIP_STATUS', type='string', startIndex=57, endIndex=58, required=True, validators=[]), - Field(item=26, name='COOPERATION_CHILD_SUPPORT', type='string', startIndex=58, endIndex=59, + Field(item="43", name='COOPERATION_CHILD_SUPPORT', type='string', startIndex=58, endIndex=59, required=True, validators=[]), - Field(item=27, name='MONTHS_FED_TIME_LIMIT', type='string', startIndex=59, endIndex=62, + Field(item="44", name='MONTHS_FED_TIME_LIMIT', type='string', startIndex=59, endIndex=62, required=True, validators=[]), - Field(item=28, name='MONTHS_STATE_TIME_LIMIT', type='string', startIndex=62, endIndex=64, + Field(item="45", name='MONTHS_STATE_TIME_LIMIT', type='string', startIndex=62, endIndex=64, required=True, validators=[]), - Field(item=29, name='CURRENT_MONTH_STATE_EXEMPT', type='string', startIndex=64, endIndex=65, + Field(item="46", name='CURRENT_MONTH_STATE_EXEMPT', type='string', startIndex=64, endIndex=65, required=True, validators=[]), - Field(item=30, name='EMPLOYMENT_STATUS', type='string', startIndex=65, endIndex=66, + Field(item="47", name='EMPLOYMENT_STATUS', type='string', startIndex=65, endIndex=66, required=True, validators=[]), - Field(item=31, name='WORK_ELIGIBLE_INDICATOR', type='string', startIndex=66, endIndex=68, + Field(item="48", name='WORK_ELIGIBLE_INDICATOR', type='string', startIndex=66, endIndex=68, required=True, validators=[]), - Field(item=32, name='WORK_PART_STATUS', type='string', startIndex=68, endIndex=70, + Field(item="49", name='WORK_PART_STATUS', type='string', startIndex=68, endIndex=70, required=True, validators=[]), - Field(item=33, name='UNSUB_EMPLOYMENT', type='string', startIndex=70, endIndex=72, + Field(item="50", name='UNSUB_EMPLOYMENT', type='string', startIndex=70, endIndex=72, required=True, validators=[]), - Field(item=34, name='SUB_PRIVATE_EMPLOYMENT', type='string', startIndex=72, endIndex=74, + Field(item="51", name='SUB_PRIVATE_EMPLOYMENT', type='string', startIndex=72, endIndex=74, required=True, validators=[]), - Field(item=35, name='SUB_PUBLIC_EMPLOYMENT', type='string', startIndex=74, endIndex=76, + Field(item="52", name='SUB_PUBLIC_EMPLOYMENT', type='string', startIndex=74, endIndex=76, required=True, validators=[]), - Field(item=36, name='WORK_EXPERIENCE_HOP', type='string', startIndex=76, endIndex=78, + Field(item="53A", name='WORK_EXPERIENCE_HOP', type='string', startIndex=76, endIndex=78, required=True, validators=[]), - Field(item=37, name='WORK_EXPERIENCE_EA', type='string', startIndex=78, endIndex=80, + Field(item="53B", name='WORK_EXPERIENCE_EA', type='string', startIndex=78, endIndex=80, required=True, validators=[]), - Field(item=38, name='WORK_EXPERIENCE_HOL', type='string', startIndex=80, endIndex=82, + Field(item="53C", name='WORK_EXPERIENCE_HOL', type='string', startIndex=80, endIndex=82, required=True, validators=[]), - Field(item=39, name='OJT', type='string', startIndex=82, endIndex=84, + Field(item="54", name='OJT', type='string', startIndex=82, endIndex=84, required=True, validators=[]), - Field(item=40, name='JOB_SEARCH_HOP', type='string', startIndex=84, endIndex=86, + Field(item="55A", name='JOB_SEARCH_HOP', type='string', startIndex=84, endIndex=86, required=True, validators=[]), - Field(item=41, name='JOB_SEARCH_EA', type='string', startIndex=86, endIndex=88, + Field(item="55B", name='JOB_SEARCH_EA', type='string', startIndex=86, endIndex=88, required=True, validators=[]), - Field(item=42, name='JOB_SEARCH_HOL', type='string', startIndex=88, endIndex=90, + Field(item="55C", name='JOB_SEARCH_HOL', type='string', startIndex=88, endIndex=90, required=True, validators=[]), - Field(item=43, name='COMM_SERVICES_HOP', type='string', startIndex=90, endIndex=92, + Field(item="56A", name='COMM_SERVICES_HOP', type='string', startIndex=90, endIndex=92, required=True, validators=[]), - Field(item=44, name='COMM_SERVICES_EA', type='string', startIndex=92, endIndex=94, + Field(item="56B", name='COMM_SERVICES_EA', type='string', startIndex=92, endIndex=94, required=True, validators=[]), - Field(item=45, name='COMM_SERVICES_HOL', type='string', startIndex=94, endIndex=96, + Field(item="56C", name='COMM_SERVICES_HOL', type='string', startIndex=94, endIndex=96, required=True, validators=[]), - Field(item=46, name='VOCATIONAL_ED_TRAINING_HOP', type='string', startIndex=96, endIndex=98, + Field(item="57A", name='VOCATIONAL_ED_TRAINING_HOP', type='string', startIndex=96, endIndex=98, required=False, validators=[]), - Field(item=47, name='VOCATIONAL_ED_TRAINING_EA', type='string', startIndex=98, endIndex=100, + Field(item="57B", name='VOCATIONAL_ED_TRAINING_EA', type='string', startIndex=98, endIndex=100, required=False, validators=[]), - Field(item=48, name='VOCATIONAL_ED_TRAINING_HOL', type='string', startIndex=100, endIndex=102, + Field(item="57C", name='VOCATIONAL_ED_TRAINING_HOL', type='string', startIndex=100, endIndex=102, required=False, validators=[]), - Field(item=49, name='JOB_SKILLS_TRAINING_HOP', type='string', startIndex=102, endIndex=104, + Field(item="58A", name='JOB_SKILLS_TRAINING_HOP', type='string', startIndex=102, endIndex=104, required=False, validators=[]), - Field(item=50, name='JOB_SKILLS_TRAINING_EA', type='string', startIndex=104, endIndex=106, + Field(item="58B", name='JOB_SKILLS_TRAINING_EA', type='string', startIndex=104, endIndex=106, required=False, validators=[]), - Field(item=51, name='JOB_SKILLS_TRAINING_HOL', type='string', startIndex=106, endIndex=108, + Field(item="58C", name='JOB_SKILLS_TRAINING_HOL', type='string', startIndex=106, endIndex=108, required=False, validators=[]), - Field(item=52, name='ED_NO_HIGH_SCHOOL_DIPL_HOP', type='string', startIndex=108, endIndex=110, + Field(item="59A", name='ED_NO_HIGH_SCHOOL_DIPL_HOP', type='string', startIndex=108, endIndex=110, required=False, validators=[]), - Field(item=53, name='ED_NO_HIGH_SCHOOL_DIPL_EA', type='string', startIndex=110, endIndex=112, + Field(item="59B", name='ED_NO_HIGH_SCHOOL_DIPL_EA', type='string', startIndex=110, endIndex=112, required=False, validators=[]), - Field(item=54, name='ED_NO_HIGH_SCHOOL_DIPL_HOL', type='string', startIndex=112, endIndex=114, + Field(item="59C", name='ED_NO_HIGH_SCHOOL_DIPL_HOL', type='string', startIndex=112, endIndex=114, required=False, validators=[]), - Field(item=55, name='SCHOOL_ATTENDENCE_HOP', type='string', startIndex=114, endIndex=116, + Field(item="60A", name='SCHOOL_ATTENDENCE_HOP', type='string', startIndex=114, endIndex=116, required=False, validators=[]), - Field(item=56, name='SCHOOL_ATTENDENCE_EA', type='string', startIndex=116, endIndex=118, + Field(item="60B", name='SCHOOL_ATTENDENCE_EA', type='string', startIndex=116, endIndex=118, required=False, validators=[]), - Field(item=57, name='SCHOOL_ATTENDENCE_HOL', type='string', startIndex=118, endIndex=120, + Field(item="60C", name='SCHOOL_ATTENDENCE_HOL', type='string', startIndex=118, endIndex=120, required=False, validators=[]), - Field(item=58, name='PROVIDE_CC_HOP', type='string', startIndex=120, endIndex=122, + Field(item="61A", name='PROVIDE_CC_HOP', type='string', startIndex=120, endIndex=122, required=False, validators=[]), - Field(item=59, name='PROVIDE_CC_EA', type='string', startIndex=122, endIndex=124, + Field(item="61B", name='PROVIDE_CC_EA', type='string', startIndex=122, endIndex=124, required=False, validators=[]), - Field(item=60, name='PROVIDE_CC_HOL', type='string', startIndex=124, endIndex=126, + Field(item="61C", name='PROVIDE_CC_HOL', type='string', startIndex=124, endIndex=126, required=False, validators=[]), - Field(item=61, name='OTHER_WORK_ACTIVITIES', type='string', startIndex=126, endIndex=128, + Field(item="62", name='OTHER_WORK_ACTIVITIES', type='string', startIndex=126, endIndex=128, required=False, validators=[]), - Field(item=62, name='DEEMED_HOURS_FOR_OVERALL', type='string', startIndex=128, endIndex=130, + Field(item="63", name='DEEMED_HOURS_FOR_OVERALL', type='string', startIndex=128, endIndex=130, required=False, validators=[]), - Field(item=63, name='DEEMED_HOURS_FOR_TWO_PARENT', type='string', startIndex=130, endIndex=132, + Field(item="64", name='DEEMED_HOURS_FOR_TWO_PARENT', type='string', startIndex=130, endIndex=132, required=False, validators=[]), - Field(item=64, name='EARNED_INCOME', type='string', startIndex=132, endIndex=136, + Field(item="65", name='EARNED_INCOME', type='string', startIndex=132, endIndex=136, required=False, validators=[]), - Field(item=65, name='UNEARNED_INCOME_TAX_CREDIT', type='string', startIndex=136, endIndex=140, + Field(item="66A", name='UNEARNED_INCOME_TAX_CREDIT', type='string', startIndex=136, endIndex=140, required=False, validators=[]), - Field(item=67, name='UNEARNED_SOCIAL_SECURITY', type='string', startIndex=140, endIndex=144, + Field(item="66B", name='UNEARNED_SOCIAL_SECURITY', type='string', startIndex=140, endIndex=144, required=False, validators=[]), - Field(item=68, name='UNEARNED_SSI', type='string', startIndex=144, endIndex=148, + Field(item="66C", name='UNEARNED_SSI', type='string', startIndex=144, endIndex=148, required=False, validators=[]), - Field(item=69, name='UNEARNED_WORKERS_COMP', type='string', startIndex=148, endIndex=152, + Field(item="66D", name='UNEARNED_WORKERS_COMP', type='string', startIndex=148, endIndex=152, required=False, validators=[]), - Field(item=70, name='OTHER_UNEARNED_INCOME', type='string', startIndex=152, endIndex=156, + Field(item="66E", name='OTHER_UNEARNED_INCOME', type='string', startIndex=152, endIndex=156, required=False, validators=[]), ], ) diff --git a/tdrs-backend/tdpservice/parsers/schema_defs/tanf/t3.py b/tdrs-backend/tdpservice/parsers/schema_defs/tanf/t3.py index c22dddc7a7..4da311c988 100644 --- a/tdrs-backend/tdpservice/parsers/schema_defs/tanf/t3.py +++ b/tdrs-backend/tdpservice/parsers/schema_defs/tanf/t3.py @@ -13,47 +13,47 @@ ], postparsing_validators=[], fields=[ - Field(item=1, name='RecordType', type='string', startIndex=0, endIndex=2, + Field(item="0", name='RecordType', type='string', startIndex=0, endIndex=2, required=True, validators=[]), - Field(item=2, name='RPT_MONTH_YEAR', type='number', startIndex=2, endIndex=8, + Field(item="4", name='RPT_MONTH_YEAR', type='number', startIndex=2, endIndex=8, required=True, validators=[]), - Field(item=3, name='CASE_NUMBER', type='string', startIndex=8, endIndex=19, + Field(item="6", name='CASE_NUMBER', type='string', startIndex=8, endIndex=19, required=True, validators=[]), - Field(item=4, name='FAMILY_AFFILIATION', type='number', startIndex=19, endIndex=20, + Field(item="67", name='FAMILY_AFFILIATION', type='number', startIndex=19, endIndex=20, required=True, validators=[]), - Field(item=5, name='DATE_OF_BIRTH', type='number', startIndex=20, endIndex=28, + Field(item="68", name='DATE_OF_BIRTH', type='number', startIndex=20, endIndex=28, required=True, validators=[]), - Field(item=6, name='SSN', type='string', startIndex=28, endIndex=37, + Field(item="69", name='SSN', type='string', startIndex=28, endIndex=37, required=True, validators=[]), - Field(item=7, name='RACE_HISPANIC', type='string', startIndex=37, endIndex=38, + Field(item="70A", name='RACE_HISPANIC', type='string', startIndex=37, endIndex=38, required=True, validators=[]), - Field(item=8, name='RACE_AMER_INDIAN', type='string', startIndex=38, endIndex=39, + Field(item="70B", name='RACE_AMER_INDIAN', type='string', startIndex=38, endIndex=39, required=True, validators=[]), - Field(item=9, name='RACE_ASIAN', type='string', startIndex=39, endIndex=40, + Field(item="70C", name='RACE_ASIAN', type='string', startIndex=39, endIndex=40, required=True, validators=[]), - Field(item=10, name='RACE_BLACK', type='string', startIndex=40, endIndex=41, + Field(item="70D", name='RACE_BLACK', type='string', startIndex=40, endIndex=41, required=True, validators=[]), - Field(item=11, name='RACE_HAWAIIAN', type='string', startIndex=41, endIndex=42, + Field(item="70E", name='RACE_HAWAIIAN', type='string', startIndex=41, endIndex=42, required=True, validators=[]), - Field(item=12, name='RACE_WHITE', type='string', startIndex=42, endIndex=43, + Field(item="70F", name='RACE_WHITE', type='string', startIndex=42, endIndex=43, required=True, validators=[]), - Field(item=13, name='GENDER', type='number', startIndex=43, endIndex=44, + Field(item="71", name='GENDER', type='number', startIndex=43, endIndex=44, required=True, validators=[]), - Field(item=14, name='RECEIVE_NONSSA_BENEFITS', type='string', startIndex=44, endIndex=45, + Field(item="72A", name='RECEIVE_NONSSA_BENEFITS', type='string', startIndex=44, endIndex=45, required=True, validators=[]), - Field(item=15, name='RECEIVE_SSI', type='string', startIndex=45, endIndex=46, + Field(item="72B", name='RECEIVE_SSI', type='string', startIndex=45, endIndex=46, required=True, validators=[]), - Field(item=16, name='RELATIONSHIP_HOH', type='number', startIndex=46, endIndex=48, + Field(item="73", name='RELATIONSHIP_HOH', type='number', startIndex=46, endIndex=48, required=True, validators=[]), - Field(item=17, name='PARENT_MINOR_CHILD', type='string', startIndex=48, endIndex=49, + Field(item="74", name='PARENT_MINOR_CHILD', type='string', startIndex=48, endIndex=49, required=True, validators=[]), - Field(item=18, name='EDUCATION_LEVEL', type='string', startIndex=49, endIndex=51, + Field(item="75", name='EDUCATION_LEVEL', type='string', startIndex=49, endIndex=51, required=True, validators=[]), - Field(item=19, name='CITIZENSHIP_STATUS', type='string', startIndex=51, endIndex=52, + Field(item="76", name='CITIZENSHIP_STATUS', type='string', startIndex=51, endIndex=52, required=True, validators=[]), - Field(item=20, name='UNEARNED_SSI', type='string', startIndex=52, endIndex=56, + Field(item="77A", name='UNEARNED_SSI', type='string', startIndex=52, endIndex=56, required=False, validators=[]), - Field(item=21, name='OTHER_UNEARNED_INCOME', type='string', startIndex=56, endIndex=60, + Field(item="77B", name='OTHER_UNEARNED_INCOME', type='string', startIndex=56, endIndex=60, required=False, validators=[]), ], ) @@ -66,47 +66,47 @@ ], postparsing_validators=[], fields=[ - Field(item=1, name='RecordType', type='string', startIndex=0, endIndex=2, + Field(item="0", name='RecordType', type='string', startIndex=0, endIndex=2, required=True, validators=[]), - Field(item=2, name='RPT_MONTH_YEAR', type='number', startIndex=2, endIndex=8, + Field(item="4", name='RPT_MONTH_YEAR', type='number', startIndex=2, endIndex=8, required=True, validators=[]), - Field(item=3, name='CASE_NUMBER', type='string', startIndex=8, endIndex=19, + Field(item="6", name='CASE_NUMBER', type='string', startIndex=8, endIndex=19, required=True, validators=[]), - Field(item=22, name='FAMILY_AFFILIATION', type='number', startIndex=60, endIndex=61, + Field(item="67", name='FAMILY_AFFILIATION', type='number', startIndex=60, endIndex=61, required=True, validators=[]), - Field(item=23, name='DATE_OF_BIRTH', type='number', startIndex=61, endIndex=69, + Field(item="68", name='DATE_OF_BIRTH', type='number', startIndex=61, endIndex=69, required=True, validators=[]), - Field(item=24, name='SSN', type='string', startIndex=69, endIndex=78, + Field(item="69", name='SSN', type='string', startIndex=69, endIndex=78, required=True, validators=[]), - Field(item=25, name='RACE_HISPANIC', type='string', startIndex=78, endIndex=79, + Field(item="70A", name='RACE_HISPANIC', type='string', startIndex=78, endIndex=79, required=True, validators=[]), - Field(item=26, name='RACE_AMER_INDIAN', type='string', startIndex=79, endIndex=80, + Field(item="70B", name='RACE_AMER_INDIAN', type='string', startIndex=79, endIndex=80, required=True, validators=[]), - Field(item=27, name='RACE_ASIAN', type='string', startIndex=80, endIndex=81, + Field(item="70C", name='RACE_ASIAN', type='string', startIndex=80, endIndex=81, required=True, validators=[]), - Field(item=28, name='RACE_BLACK', type='string', startIndex=81, endIndex=82, + Field(item="70D", name='RACE_BLACK', type='string', startIndex=81, endIndex=82, required=True, validators=[]), - Field(item=29, name='RACE_HAWAIIAN', type='string', startIndex=82, endIndex=83, + Field(item="70E", name='RACE_HAWAIIAN', type='string', startIndex=82, endIndex=83, required=True, validators=[]), - Field(item=30, name='RACE_WHITE', type='string', startIndex=83, endIndex=84, + Field(item="70F", name='RACE_WHITE', type='string', startIndex=83, endIndex=84, required=True, validators=[]), - Field(item=31, name='GENDER', type='number', startIndex=84, endIndex=85, + Field(item="71", name='GENDER', type='number', startIndex=84, endIndex=85, required=True, validators=[]), - Field(item=32, name='RECEIVE_NONSSA_BENEFITS', type='string', startIndex=85, endIndex=86, + Field(item="72A", name='RECEIVE_NONSSA_BENEFITS', type='string', startIndex=85, endIndex=86, required=True, validators=[]), - Field(item=33, name='RECEIVE_SSI', type='string', startIndex=86, endIndex=87, + Field(item="72B", name='RECEIVE_SSI', type='string', startIndex=86, endIndex=87, required=True, validators=[]), - Field(item=34, name='RELATIONSHIP_HOH', type='number', startIndex=87, endIndex=89, + Field(item="73", name='RELATIONSHIP_HOH', type='number', startIndex=87, endIndex=89, required=True, validators=[]), - Field(item=35, name='PARENT_MINOR_CHILD', type='string', startIndex=89, endIndex=90, + Field(item="74", name='PARENT_MINOR_CHILD', type='string', startIndex=89, endIndex=90, required=True, validators=[]), - Field(item=36, name='EDUCATION_LEVEL', type='string', startIndex=90, endIndex=92, + Field(item="75", name='EDUCATION_LEVEL', type='string', startIndex=90, endIndex=92, required=True, validators=[]), - Field(item=37, name='CITIZENSHIP_STATUS', type='string', startIndex=92, endIndex=93, + Field(item="76", name='CITIZENSHIP_STATUS', type='string', startIndex=92, endIndex=93, required=True, validators=[]), - Field(item=38, name='UNEARNED_SSI', type='string', startIndex=93, endIndex=97, + Field(item="77A", name='UNEARNED_SSI', type='string', startIndex=93, endIndex=97, required=False, validators=[]), - Field(item=39, name='OTHER_UNEARNED_INCOME', type='string', startIndex=97, endIndex=101, + Field(item="77B", name='OTHER_UNEARNED_INCOME', type='string', startIndex=97, endIndex=101, required=False, validators=[]), ], ) diff --git a/tdrs-backend/tdpservice/parsers/schema_defs/trailer.py b/tdrs-backend/tdpservice/parsers/schema_defs/trailer.py index 3657cfc515..086c83e85a 100644 --- a/tdrs-backend/tdpservice/parsers/schema_defs/trailer.py +++ b/tdrs-backend/tdpservice/parsers/schema_defs/trailer.py @@ -16,13 +16,13 @@ ], postparsing_validators=[], fields=[ - Field(item=1, name='title', type='string', startIndex=0, endIndex=7, required=True, validators=[ + Field(item="1", name='title', type='string', startIndex=0, endIndex=7, required=True, validators=[ validators.matches('TRAILER') ]), - Field(item=2, name='record_count', type='number', startIndex=7, endIndex=14, required=True, validators=[ + Field(item="2", name='record_count', type='number', startIndex=7, endIndex=14, required=True, validators=[ validators.between(0, 9999999) ]), - Field(item=3, name='blank', type='string', startIndex=14, endIndex=23, required=False, validators=[ + Field(item="-1", name='blank', type='string', startIndex=14, endIndex=23, required=False, validators=[ validators.matches(' ') ]), ], diff --git a/tdrs-backend/tdpservice/parsers/test/factories.py b/tdrs-backend/tdpservice/parsers/test/factories.py index 74bf925297..8d0e709505 100644 --- a/tdrs-backend/tdpservice/parsers/test/factories.py +++ b/tdrs-backend/tdpservice/parsers/test/factories.py @@ -13,7 +13,7 @@ class Meta: file = factory.SubFactory(DataFileFactory) row_number = 1 column_number = 1 - item_number = 1 + item_number = "1" field_name = "test field name" case_number = '1' rpt_month_year = 202001 diff --git a/tdrs-backend/tdpservice/users/models.py b/tdrs-backend/tdpservice/users/models.py index 7d9a9507c4..d0a9c924dc 100644 --- a/tdrs-backend/tdpservice/users/models.py +++ b/tdrs-backend/tdpservice/users/models.py @@ -33,6 +33,11 @@ class AccountApprovalStatusChoices(models.TextChoices): class User(AbstractUser): """Define user fields and methods.""" + class Meta: + """Define meta user model attributes.""" + + ordering = ['pk'] + id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) stt = models.ForeignKey( diff --git a/tdrs-backend/tdpservice/users/test/test_api/test_endpoints.py b/tdrs-backend/tdpservice/users/test/test_api/test_endpoints.py index a9265b74fb..a20244538e 100644 --- a/tdrs-backend/tdpservice/users/test/test_api/test_endpoints.py +++ b/tdrs-backend/tdpservice/users/test/test_api/test_endpoints.py @@ -231,7 +231,6 @@ def test_list_users(self, api_client, user): results = response.data['results'] assert response.status_code == status.HTTP_200_OK assert len(results) == 2 - assert results[1]['id'] == user.id def test_get_user(self, api_client, user): """Get a specific user, expect 200 and ability to get any user.""" diff --git a/tdrs-frontend/manifest.buildpack.yml b/tdrs-frontend/manifest.buildpack.yml index 097d89323a..870321b775 100755 --- a/tdrs-frontend/manifest.buildpack.yml +++ b/tdrs-frontend/manifest.buildpack.yml @@ -3,7 +3,7 @@ version: 1 applications: - name: tdp-frontend buildpacks: - - https://github.com/cloudfoundry/nginx-buildpack.git#v1.1.45 + - https://github.com/cloudfoundry/nginx-buildpack.git#v1.2.2 memory: 128M instances: 1 disk_quota: 256M diff --git a/tdrs-frontend/nginx/local/locations.conf b/tdrs-frontend/nginx/local/locations.conf index 4f53dd27b7..9859f5fd19 100644 --- a/tdrs-frontend/nginx/local/locations.conf +++ b/tdrs-frontend/nginx/local/locations.conf @@ -7,7 +7,7 @@ location = /nginx_status { location ~ ^/(v1|admin|static/admin|swagger|redocs) { limit_req zone=limitreqsbyaddr delay=5; proxy_pass http://${BACK_END}:8080$request_uri; - proxy_set_header Host $host; + proxy_set_header Host $host:3000; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto https;