-
Notifications
You must be signed in to change notification settings - Fork 19
Caseflow Data Model and Dictionary
Please go to the updated page: https://department-of-veterans-affairs.github.io/caseflow/task_trees/data-model.html
Deprecated
This page provides information about Caseflow's data model, data dictionary, and resources to help understand Caseflow's database contents ([terminology](https://dataedo.com/blog/data-model-data-dictionary-database-schema-erd) and [example data-dictionaries](https://www.usgs.gov/products/data-and-tools/data-management/data-dictionaries)). The main audience are Caseflow engineers, BVA's Reporting Team, those who know SQL, and onboarders.This page consists of these major sections:
- By product
- By workflow
- By page
- (Feel free to add another section if desired)
Also check out Caseflow Database Schema Documentation.
Instructions:
- Document any non-obvious semantics or logic that would be useful when interpreting database tables and constituent data.
- Reference other relevant wiki pages to provide context/background.
- Link to relevant code (in case it changes in the future).
- To create tables diagram, go to http://dbdiagram.io/, click "Import", and paste table definition excerpts from
schema.rb
; then add cross-table links using the mouse and move the boxes around to your liking. Click "Save" and copy the URL to this page.- Note: you can only import once; try it a couple of times to get a hang of it before spending too much time.
- Table columns with
***
in the name are used to designate categories of columns. In the Certifications diagram, you will see a column titled_initial ***
in the Form8s table. The Form8s table has twelve columns beginning with "_initial":_initial_appellant_name
,_initial_appellant_relationship
, etc. To keep the diagram and tables more tidy we grouped these categories together. - Pro-tip: Open another browser tab, paste the new excerpt, then copy-and-paste the resulting Table definition into the original tab.
- To insert a screenshot of the diagram, paste the image into a comment on ticket #15510, which will upload the image to GitHub and provide a URL for the image, which can then be linked from this page.
Caseflow Certification ensures accurate Veteran and appeal information are transferred from the Veterans Benefits Administration (VBA) to the Board of Veterans Appeals (BVA). The Certifications table facilitates this process by ensuring necessary documentation has been submitted with an Appeal and is consistent between VBMS and VACOLS. Caseflow Certification is also responsible for verifying the veteran's representation and hearings request are accurate and ready to be sent to the Board.
poa_correct_in_bgs
poa_correct_in_vbms
nod_matching
soc_matching
already_certified
Once an Appeal has been certified, the information on a Form8 form will be sent to the Board and the representation and hearing information will be updated in VACOLS accordingly.
-
hearing_requested
-
hearing_held
:nil
ifhearing_requested
set toNo
-
certification_date
-
soc_date
-
power_of_attorney
information pulled from BGS
The LegacyAppeals table stores records of non-AMA appeals, appeals which originated in VACOLS, that are worked by Caseflow.
-
changed_request_type
is either the value ofR
representing a virtual hearing orV
representing a video hearing. Those are the only two options when updating a hearing request -
vbms_id
is either the Veteran's file number + "C" or the Veteran's SSN + "S"
The CertificationCancellations table stores instances of cancelled certifications.
-
cancellation_reason
can be one of the following:VBMS and VACOLS dates didn't match and couldn't be changed
Missing document could not be found
Pending FOIA request
Other
In the diagram below you will see the certifications
table's id
is stored on the certification_cancellations
table as well as the form8s
table.
The form8s
table connects with the certifications
table through the certification_date
, representative_name
, representative_type
, and vacols_id
, which also connects it with the legacy_appeals
table. It is connected with a Veteran by storing the veteran_file_number
.
Caseflow eFolder Express (EE) serves the specific role of allowing users to bulk download all of a Veteran's files at once. It is the only Caseflow product that has a separate code repository and runs on separate servers.
When mentioning a Veteran's files in EE, those can vary between PDFs, TIFFs, and IMGs. The Records table exists to store references to these files
As mentioned above, the purpose of EE is to allow users to download all of a Veteran's files at once. The reasoning for this is to reduce the need for the user to select and download files individually. A Manifest
represents the collection of all of a Veteran's files and consists of a ManifestSource
for each file, pointing to its source.
The sources for files made available for download in EE are VBMS and Virtual VA (VVA). A ManifestSource
groups a set of Records
to allow all of a Veteran's files to be downloaded at the same time.
-
name
: Either "VBMS" or "VVA" -
status
: Stores whether aRecord
was successfully added to aManifest
When a user searches for the Veteran they are looking for in EE, they are presented with a view of all files available for download. The FileDownloads table stores each time a user downloads all of a Veteran's files.
In the diagram below you can see that every FileDownload
will store a manifest_id
, as well as every ManifestSource
. This makes sense given the fact that a Manifest
is a collection of ManifestSources
, with each ManifestSource
containing a Record
. The files indirectly referenced by a Manifest
can be downloaded as many times as needed.
Caseflow Dispatch exists to create EndProducts in VBMS from completed cases in VACOLS. Users of Dispatch, VBA Office of Administrative Review (OAR) employees, are presented with VACOLS cases that have received a decision and need to be routed to the correct VBA entity to update a Veteran's benefits.
The LegacyAppeals table is utilized by numerous Caseflow products. A description can be found above in the Certification section.
Caseflow tasks designate what action needs to be taken on an appeal and who is responsible for taking said action. There are a wide variety of tasks across Caseflow products, but the Dispatch::Tasks table currently only stores EstablishClaim task records which are used to create the EndProduct in VBMS. You can read more about tasks here.
aasm_state
-
user_id
gets assigned upon clicking "Establish Next Claim" in Dispatch
Caseflow users are distinguished by their role, with different roles having different permissions and thus different capabilities made available to them.
-
roles
: All of the user's roles -
css_id
: A unique identifier for VA employees or contractors
In the diagram below, you will see that the dispatch_tasks
tables stores the id
of the user
assigned to the task as well as the id
of the legacy_appeal
. The legacy_appeals
tables does not store any dispatch_task
ids
because each appeal can have many dispatch_tasks
.
Intake is the source of all AMA decision review request submissions. There are three decision review lanes: Appeals, HigherLevelReviews, and SupplementalClaims.
Class diagram of relevant terminology:
Appeals represent an AMA review that gets filed with the Board of Veterans' Appeals (BVA). Refer to Intake tables diagram below.
-
docket_type
can be one of the following:-
direct_review
- No new evidence and not requesting a hearing -
evidence_submission
- New evidence but not requesting a hearing -
hearing
- Submit new evidence and want to testify before a VLJ
-
-
poa_participant_id
: Power of Attorney (POA) is connected to legacy appeals in VACOLS and Veterans in BGS. Since this model represents AMA appeals, we are getting this data from BGS -
veteran_is_not_claimant
: A claimant on an appeal does not have to be the Veteran. It can be a spouse, child, or even an attorney.
A HigherLevelReview and SupplementalClaim are a type of ClaimReviews. These ClaimReviews are sent to the Veterans Benefit Administration (VBA) and differentiate from Appeals in that they include a benefit type. Benefit types of compensation
and pension
are processed in VBMS, where as the rest are processed in Caseflow.
RequestIssues are submitted as part of a DecisionReview and represent a specific issue a Veteran is facing, such as hearing loss or sleep apnea. There are three categories of RequestIssues: rating
, non-rating
, and unidentified
.
The EndProductEstablishment model exists in Caseflow to represent EndProducts created in VBMS. End Products are created for Higher Level Reviews and Supplemental Claims that are compensation or pensions and for Board Grant Effectuations that have granted compensation and pension issues on appeals.
In the diagram below you can see that the appeals
, supplemental_claims
, and higher_level_reviews
table's id
will correspond with the request_issues
table's decision_review_id
as well as the end_product_establishments
table's source_id
.
Also note that the request_issues
table's id
is referenced by the end_product_establishments
table. The end_product_establishments
table's source_type
is the same as the request_issues
table's decision_review_type
.
Veterans have the option to have a hearing with a Veterans Law Judge (VLJ) as part of the appeals process. At these hearings, a VLJ meets with a veteran or representative to go over the case. It is not a defense but a chance for a Veteran to provide additional details. After a hearing is conducted, the recordings are sent to the transcription office, and then entered into VBMS.
There are four types of hearings:
- Central Hearing: An in-person hearing at BVA's central office (425 I st.)
- Video Hearing: A hearing over video conference conducted between a regional office or alternate hearing location and central office
- Virtual Hearing: a hearing over video conference conducted between any location (sometimes the representative's office) and central office
- Travel Board: An in person hearing where the VLJ travels to the regional office. These are not currently supported by Caseflow and are handled in VACOLS. If Caseflow serves Travel Board hearings it will be only through converting them to video or virtual hearings.
A HearingDay
organizes Hearings
and LegacyHearings
by regional office and hearing room.
- A hearing day is assigned to one judge, although hearing coordinators have the ability to override the hearing day's judge on the Hearings table or in VACOLS by editing the hearing details.
- Each room / HearingDay has a maximum number of hearings that can be held (slots) that are determined by the regional office's timezone. If a hearing day's slots are filled, the coordinator will receive a warning when scheduling a Veteran ("You are about to schedule this Veteran on a full docket. Please verify before scheduling") but will still be able to schedule if they so choose.
-
request_type
:R
for virtual,V
for video,C
for central -
regional_office
: If therequest_type
isV
, then theHearingDay
will be associated to a regional office judge_id
scheduled_for
Legacy Hearings are hearings for cases that originated inside of VACOLS. On a judge's Hearing Worksheet, they can edit Legacy hearing issues directly on the workbook page (for AMA cases, they would need to go to the Case Details page).
All appeals on the hearing docket have a series of tasks that can be divided into five groups. Here is a brief summary of what those are, full description can be found here.
- Initial tasks - these include creating a
HearingTask
with a childScheduleHearingTask
. For AMA cases, the initial hearing tasks are created as a children of theDistributionTask
after intake. For Legacy cases, a geomatching job finds all appeals in VACOLS that are ready to be scheduled and creates a hearing task tree as a child of theRootTask
. - Schedule Veteran tasks - schedule hearing tasks are shown on the assign hearings page (see this page. A coordinator can block scheduling by adding a
HearingAdminActionTask
and can also withdraw the hearing. After scheduling, aAssignHearingDispositionTask
and a new hearing is created and that hearing is associated to theHearingTask
with anHearingTaskAssociation
. - Assign a Disposition - Postponing cancels the current hearing task and recreates the initial hearing task tree. If a coordinator or judge changes the hearing's disposition on the daily docket, the
HearingDispositionChangeJob
finds all appeals with hearings in the last 24 hours and creates aAssignHearingDispositionTask
and completes the task based on the disposition. No-show hearings are given aNoShowHearingTask
. - Transcription/Evidence submission - After a disposition is assigned, AMA appeals must complete a
TranscriptionTask
and anEvidenceSubmissionWindowTask
. The evidence task gives the Veteran an additional 90 days to submit evidence before the case is distributed. - Case Distribution - When all other hearing tasks are completed, a case is ready for distribution to judge because its
DistributionTask
is moved from on_hold to assigned (AMA cases) or the case is in case storage location 81 (legacy cases). See also automatic case distribution.
Once a virtual hearing is scheduled, the associated record in hearing_days
is not changed because a record in the hearing_days
table represents the whole day. In other words, many hearing types are associated with that hearing_days
record, so hearing_days.request_type
should not be changed. This is an artifact of how the virtual hearings feature was introduced into Caseflow, i.e., as a conversion of video hearings into virtual hearings.
virtual_hearings
, virtual_hearing_establishments
, and sent_hearing_email_events
table descriptions
In the diagram below you can see the following relationships between various hearing-related tables:
- The
hearings
andlegacy_hearings
table'sid
corresponds with thehearings_tasks_assocations
andvirtual_hearings
table'shearing_id
. - The
hearings
andlegacy_hearings
table'shearing_day_id
corresponds with thehearing_days
table'sid
. - The
hearings_tasks_assocations
table's hearing_task_id corresponds with thetasks
table'sid
.
- Caseflow Queue
-
Queue tables diagram
- Appeal, Task
- User, OrganizationsUser, Organization, JudgeTeam organizations
Queue is the portion of Caseflow users utilize when an appeal has reached the Decision phase and is ready to be reviewed by judges and attorneys for processing. Queue services both AMA and Legacy appeals, the behavior of each varying slightly. One of the main differences is that AMAs are contained within Caseflow whereas much of the data for Legacy appeals is extracted from VACOLS.
User interaction with specific appeals is dependent on the type of task on the appeal that's been assigned to them. For instance, a JudgeAssignTask
is given to a judge so that they may assign an AttorneyTask
to an attorney on their team to draft a decision.
A more thorough breakdown of Queue tasks can be found in the Decision phase portion of the task tree documentation
Users can be added to organizations so that we can control the types of permissions and task action options alotted to them. For instance, JudgeTeams
are comprised of a judge along with their team of attorneys. This allows the judge to assign cases to these individuals in the same flow mentioned in the Task description.
In the following diagram, you can see that an id
on an AMA or Legacy appeal will correspond with the appeal_id
on a task created on that appeal.
An assigned_by_id
or assigned_to_id
will correspond with the id
of the user who has either assigned or been assigned a task
Finally, organization_users
is representative of a users relationship to a particular type of organization. Therefore the users table's id
will correspond with the user_id
and the organizations table's id
will correspond with the organization_id
.
Caseflow Reader allows users to access all of the documents related to the Veteran for an appeal. Users first interact with a document list page which presents a list of the documents. Upon selection of a particular document, they are redirected to the document view page where they can view and interact with the document. Documents are populated by eFolder, which retrieves them from two upstream dependencies: VBMS & VVA -- see Reader Backend for details.
On the document view page, users have the ability to add comments to documents via the "Add a comment" button. A comment is stored in the annotations
table. Once a comment is created, it can be edited, shared via a link or deleted. In addition, comments can be seen on the document list page under the "Comment" column for the related document and also by selecting the "Comments" button which shows all comments.
Tags can be added by the user to further label and categorize documents based on issues that they identify. On the document view page, users may create a tag within the sidebar under the "Issue tags" dropdown section. Once a tag is created, it is saved (in the tags
table) so that it is available for use on other documents. Tags can also be deleted by the user.
Caseflow keeps track of when a user has viewed a document so the user is aware of which ones they have already opened. To do this, documents in the document list are initially shown in bold text, however once a user has viewed a document, the text will no longer be bold.
When a tag is created for a document, the user can apply it on other documents that may be relevant. The document_tags
table keeps track of which tags apply to which documents. The id
of the tags
table corresponds to the tag_id
, and the id
of the documents table corresponds to the documents_id
.
To track which document a comment/annotation is created for, the id
from the documents
table corresponds with the document_id
on the annotations
table.
To track when a document has been viewed by a user we have the document_views
table, the id
from the documents
table corresponds with the document_id
in the document_views
table, and the user_id
refers to the id
in the users
table.
- Distribution, CaseDistribution, Task
- Case Distribution tables diagram
- RequestIssue, DecisionIssue, RequestDecisionIssue
- SpecialIssuesList
- JudgeCaseReview, AttorneyCaseReview
- JudgeTeam Checkout tables diagram
- A PostDecisionMotion record is created with these possible
dispositions
, thevacated_decision_issue_ids
(which reference DecisionIssue records), and atask_id
(which references a Task record, which is associated to an appeal).
- A DocketSwitch record is created with these possible
dispositions
and list ofgranted_request_issue_ids
(which reference RequestIssue records). - Each DocketSwitch record references the original and new appeals via
old_docket_stream_id
andnew_docket_stream_id
respectively.- Both appeals have the same docket number and appellant.
- The two appeals can have different docket type, request issues, tasks, etc.
- Why create a new appeal? See this Google Doc
- More Google docs
- A CavcRemand record is created with details from CAVC and list of
decision_issue_ids
(which reference DecisionIssue records). - Each CavcRemand record references the source and new appeals via
source_appeal_id
andremand_appeal_id
respectively.- Both appeals have the same docket number and appellant. The new appeal has docket type =
court_remand
. - The two appeals can have different request issues, tasks, etc.
- Both appeals have the same docket number and appellant. The new appeal has docket type =
- CAVC Remand wiki page
- An AppellantSubstitution record is created with details for creating the new appeal.
- Each AppellantSubstitution record references the source and new appeals via
source_appeal_id
andtarget_appeal_id
respectively.- Both appeals have the same docket type, docket number, and request issues, but different appellant.
- The request issues on the source appeal has associated decision issues with
dismissed_death
dispositions. - The two appeals can have different tasks, etc.
(TBD)
(TBD)
Trace of POA lookup for LegacyAppeal
- First set
RequestStore.store[:application] == "queue"
because POA lookup is different for different Caseflow apps - Calling
LegacyAppeal#representative_name
callsLegacyAppealRepresentative#representative_name
, which callsPowerOfAttorney#bgs_representative_name
, which first looks in Caseflow and if needed queries BGS by usingBgsPowerOfAttorney
as follows:-
fetch_bgs_power_of_attorney || BgsPowerOfAttorney.new(file_number: file_number)
-
fetch_bgs_power_of_attorney
callsfetch_bgs_power_of_attorney_by_file_number || fetch_bgs_power_of_attorney_by_claimant_participant_id
-
file_number
is the Veteran's file number --#veteran_file_number
- calls
sanitized_vbms_id
but ifveteran ||= VeteranFinder.find_best_match(sanitized_vbms_id)
, then usesveteran.file_number
-
sanitized_vbms_id
callsLegacyAppeal.veteran_file_number_from_bfcorlid(vbms_id)
- calls
-
claimant_participant_id
comes fromLegacyAppeal#claimant_participant_id
, which- checks
appellant_ssn
(from VACOLScase_record.correspondent.ssn
), then looks up PersonPerson.find_or_create_by_ssn(appellant_ssn)
for theirparticipant_id
.
- checks
-
-
- Home
- Acronyms and Glossary
- Caseflow products
- Caseflow Intake
- Caseflow Queue
- Appeals Consumer
- Caseflow Reader
- Caseflow eFolder
- Caseflow Hearings
- Caseflow Certification
- Caseflow APIs
- Appeal Status API
- Caseflow Dispatch
-
CSUM Roles
- System Admin
- VHA Team Management
- Active Record Queries Resource
- External Integrations
- Caseflow Demo
- Caseflow ProdTest
- Background
- Stuck Jobs
- VA Notify
-
Caseflow-Team
- Tier 4
- Bat Team
- Technical Documentation
- Backend Code Patterns
- Backend Working Group
- FACOLS, VACOLS DB Schema
- Asyncable Models
- External Data: where and why
- Data Fetching Scripts
- Caseflow Data Model and Dictionary
- User Access Permissions
- Controller Schemas
- Constants
- Frontend Best Practices
- Accessibility
- How-To
- Debugging Tips
- Adding a Feature Flag with FeatureToggle
- Editing AMA issues
- Editing a decision review
- Fixing task trees
- Investigating and diagnosing issues
- Data and Metric Request Workflow
- Exporting and Importing Appeals
- Explain page for Appeals
- Record associations and Foreign Keys
- Upgrading Ruby
- Stuck Appeals
- Testing Action Mailer Messages Locally
- Re-running Seed Files
- Rake Generator for Legacy Appeals
- Manually running Scheduled Jobs
- System Admin UI
- Caseflow Makefile
- Upgrading Postgresql from v11.7 to v14.8 Locally
- VACOLS VM Trigger Fix M1
- Using SlackService to Send a Job Alert
- Technical Talks