This tech spec outlines one path to provide private attorneys with access to an "All cases" queue table view and Case Details. We do not expect Private Attorneys to do any tasks in Caseflow at this time.
This approach will allow us to take advantage of code we have already written for VSO-related organization controls (as well as BGS for access control) in a pattern that we have already established with minimal changes to existing code. One disadvantage to this approach is that creating an organization for a single person to give us the benefit of access controls is a somewhat imprecise model and indirect mapping of concepts into code.
A quick sketch of how this would look:
class PrivateBar < Vso
def self.create_for_user(user, ptcpt_id)
create!(name: user.css_id, url: user.css_id.downcase, participant_id: ptcpt_id).tap do |org|
OrganizationsUser.make_user_admin(user, org)
VsoConfig.create!(organization: org, ihp_dockets: [])
end
end
def user_has_access?(user)
user_is_admin?(user)
end
def can_receive_task?(_task)
false
end
end
And we could create these organizations for private attorneys by running the following commands:
rails c> u = User.find_by(css_id: "PRIVATE_ATTORNEY")
rails c> PrivateBar.create_for_user(u, "1234567")
PrivateBar being a subclass of Vso lets us take advantage of the Appeal.vsos method that we use to create TrackVeteranTasks when we create the RootTask for an appeal. With this design we would not have to change any code in the Appeal or RootTask models in order to start associating TrackVeteranTasks with private attorneys.
One downside to this approach is that private attorneys would have individual queues as well as organization queues when they should probably only have a single queue table view that shows all of the tracking tasks. The ticket to create queue table views for field VSOs will tackle the problem of only showing the "All cases" tab in the organization's queue table view so we should be able to re-use that work for private attorneys. As for the multiple queue table view issue, we may just have to hard code an exception to the list of organizations we send to the front-end (with some type of redirect to the org queue for these folks?).
Thoughts? Are there downsides I'm not thinking of? Alternative approaches that may be even better?
Representative for Vso, FieldVso, and PrivateBar (#10448)appeal.vsos and the like to appeal.representatives (#10453)PrivateBar class with method to create PrivateBar from User record (#10454)PrivateBar organizations in the user interface (#10456)This approach makes a lot of sense to me.
My only real issue is the imprecise language. It'd be confusing to me to use the method Appeal.vsos to get an organization representing an individual private attorney. Maybe we could have a class that both Vso and PrivateBar inherit from that'd let us name things more clearly?
LARGE. Be careful when changing names to be more precise because we are using single table inheritance on the organizations table, and if Vso and PrivateBar inherit from a new common parent class we may need to do that in several different commits.
@lowellrex @laurjpeterson @msj0nes
I received a call from OGC today. They are going to provide new guidance on what access should look like for the private bar. Any tickets around private attorney access should be put on hold for the time being.
Note, had to give OIT a time frame for this. If we get approval for private bar access, I asked for 4 weeks from that date. This date can be pushed out.
The Board has gotten OGC approval for this, so we can consider it for our next sprint again.
Can we use VSO CSEM function? Private bar users can be like field VSO users.
@laurjpeterson Do private attorneys write IHPs for appeals? Or are they like Field VSOs in that they do not write IHPs?
Also, do we have any example appeal where the appellant is represented by a private attorney so we can confirm that the implementation will work? (The URL of the case details page would be PII-safe and sufficient to find that appeal).
No, private attorneys never will write IHPs.
@allyceh @laurjpeterson What should the name of the private attorney's' organizations be? I mocked it up with the CSS ID and with the attorney's full name. Do either of these look good, or should we include some text to indicate that these are tracking tasks for an attorney instead of just the individual (in case the attorney is also staff for a VSO, for example)?
CSS ID | Full name
--- | ---
| 
Interesting. There will be some private attorney organizations - like "Chisholm Chisholm & Kilpatrick LTD" - in addition to individuals. Are you seeing those?
I think converting the CSS ID into the name is our best bet.
Some other options but I don't like them as much:
As for text to explain - are you referring to the text within the tabs, or additional text somewhere else?
Do we have an example of one of these private bar organizations? I have been assuming that the private bar organization and the individual would have the same BGS participant ID, but I'm beginning to think that is a bad assumption.
My understanding is that this is not correct:
Interesting. There will be some private attorney organizations - like "Chisholm Chisholm & Kilpatrick LTD" - in addition to individuals. Are you seeing those?
It should only be individual attorneys, not their organizations.
@lowellrex I am not super familiar with the private bar organizations and why they use Caseflow.
Can you explain more about the statement above and what tracking tasks are?
This will help me understand how any additional text can help orient users when they open their queue.
@allyceh I'll defer to @laurjpeterson here. It appears that we are all still learning what the nature of these folks are (law firms or individual employees) and I think that will determine a lot around implementation.
@nicholasholtz - yep, thanks. I remember us discussing that individuals who work at Chisholm Chisholm & Kilpatrick LTD are not allowed to see all Chisholm Chisholm & Kilpatrick LTD cases, just those that they as an individual represent.
however, i'm sure i've seen Chisholm Chisholm & Kilpatrick LTD as a POA in Case details. Are you saying that it could never be the POA value in CorpDB? (even accidentally) and ONLY the individuals would be listed?
@lowellrex - @nicholasholtz is a more trustworthy source than me on all things private bar. so we'll follow his lead. can move forward assuming they are all individuals instead of law firms right now? if not, let me know how i can help investigate values in CorpDB to be sure.
@allyceh - sometimes Veterans are represented by attorneys who work at private organizations (private bar organizations), rather than being represented by VSOs. they are another vocal Veteran stakeholder, and have been asking about access to Caseflow to see (1) the Veterans they are representing and (2) to view their documents. the chairman approved this access.
our solution for (1) is that they will get access to Queue just like VSOs have. the TrackVeteranTask that lowell is talking about is the same TrackVeteranTask that is added to cases where VSOs are representing Veterans - it's how we ensure these cases show up in a VSO queue. When a case is intake, we can see the Veteran's POA that already lives in CorpDB (which we access through BGS), and create a TrackVeteranTask and assign it to that POA. So, we'll be doing this for private bar folks too.
our solution for (2) is that they will get access to eFolder express, NOT Reader. this work is being handled as a CSEM thing, more than a Caseflow development thing.
more context, if you'd like, here: https://github.com/department-of-veterans-affairs/caseflow/issues/7774
@lowellrex - are you thinking that text to explain what's in the queue for private attorneys would live within the tabs or above the tabs, near their name?
can move forward assuming they are all individuals instead of law firms right now? if not, let me know how i can help investigate values in CorpDB to be sure.
We can definitely continue under the assumption that private bar access will be at the individual attorney level and not the law firm level. The question I am trying to determine the answer to is whether the attorney would have two participant IDs in BGS (one for their private bar practice and one for them as an individual who has access to the private bar firm of one person) or whether they would only have the single participant ID in BGS.
We can determine this easily if we have any of the following:
When this feature goes live we will still (probably) need to manually give attorneys access to this feature through the global team management page so I think we'll need this information soon anyways.
are you thinking that text to explain what's in the queue for private attorneys would live within the tabs or above the tabs, near their name?
Below the tabs for now, but private attorneys will eventually not have any tabs, and will instead just have the single table that shows tracking tasks (since private attorneys will not be able to take any actions on the tasks).
- Any information about an attorney who will get this private bar access (email, CSS ID, name)
We have this!
Below the tabs for now, but private attorneys will eventually not have any tabs, and will instead just have the single table that shows tracking tasks (since private attorneys will not be able to take any actions on the tasks).
Cool. So let's design for below the heading "Lowell Wood's cases" since that's the end state. Thanks for explaining again.
For copy, maybe we could start with:
"This list contains all AMA cases where Veterans have chosen you as their representative"
@laurjpeterson Do we have some other attorneys who will be getting this access?
I tried looking up Hennings and he has a Caseflow account for his VA email but BGS does not recognize the CSS ID associated with that Caseflow account (BVABHENNINGS), and it appears that he hasn't logged in for at least 2 months. Caseflow does not have account for Hennings with the other CSS ID or email address.
rails c> email = "[email protected]"
rails c> u = User.where('lower(email) = lower(?)', email).first
# He has a user account.
rails c> RequestStore[:current_user] = User.where(station_id: 101).first
rails c> repped_ptcpt_ids = u.vsos_user_represents
# Savon::SOAPFault ((S:Server) SecurityWebServiceBean-->findPtcpntId-->findPersonScrtyLogByUserIdLctnId-->User BVABHENNINGS is invalid.)
# When was the last time this fella logged in?
rails c> u.last_login_at
# nil
# last_login_at was added on Feb 25 (#9627), so he hasn't logged in since then.
# Let's look him up by css_id instead
rails c> css_id = "VBAPROHenniB"
rails c> u = User.where('lower(css_id) = lower(?)', css_id).first
# nil
# How about his other email address:
rails c> email = "[email protected]"
rails c> u = User.where('lower(email) = lower(?)', email).first
# nil
Attempted to get BGS information with the Hennings' other CSS ID (and station 101) and the request failed as well.
rails c> bgs_service = ExternalApi::BGSService.new
rails c> bgs_service.client.security.find_participant_id(css_id: "VBAPROHENNIB", station_id: 101)
# Savon::SOAPFault ((S:Server) SecurityWebServiceBean-->findPtcpntId-->findPersonScrtyLogByUserIdLctnId-->User VBAPROHENNIB is invalid.)
@laurjpeterson In order to confirm our assumptions about how to proceed we will need the CSS ID and station IDs of folks who will be using this new private attorney Caseflow access when we roll it out.
i don't think he would be station 101
@lowellrex - can you try station 304 for Bradley Hennings? It looks like this is his station, given this screenshot of CSEM access

@laurjpeterson Do we expect multiple attorneys from a single firm to access Caseflow? For example, Hennings is an attorney at CCK, do we expect that he will be the only attorney from CCK to use Caseflow?
Also, since private attorneys and the firms they belong to have different BSG participant IDs (confirmed with the example above), do we have an example appeal ID for an appeal that has elected to be represented by a private attorney? We need this to determine if the representative happens at the attorney level or at the organization (firm) level.
We expect multiple attorneys that work for CCK to have access to Caseflow.
But, let's say Brad Hennings represents Joe Snuffy, and Anthony Attorney represents Jane Duffy. Both Brad Hennings and Anthony Attorney work for CCK.
Brad Hennings should NOT see Jane Duffy's data.
Anthony Attorney should NOT see Joe Snuffy's data.
Will get back to you on an appeal for this.
Perfect! Thank you @laurjpeterson
So I got an appeal from Brad, but the POA listed in Caseflow looks like Chisolm the organization rather than Brad himself. https://appeals.cf.ds.va.gov/queue/appeals/3880485
I'm following up.
Update: Brad Hennings will be in DC, at BVA, on Wednesday, May 29 or Thursday, May 30. Jennifer would like us to give him a demo of queue functionality (being able to see his AMA cases in Caseflow queue) that day. I think this gives us enough time, but would like @lowellrex to weigh in.
Noting so I don't forget - Geoffrey got a list of 157 Private Attorneys with VBMS access. I'm surprised it's so few - I think there will likely be more than that who eventually use Caseflow.
Update: Brad Hennings will be in DC, at BVA, on Wednesday, May 29 or Thursday, May 30. Jennifer would like us to give him a demo of queue functionality (being able to see his AMA cases in Caseflow queue) that day. I think this gives us enough time, but would like @lowellrex to weigh in.
I think that gives us enough time to build this feature but we still need to figure out if the private bar access will be at the organization (private firm) or individual level (single attorney). It looks like it is happening at the organization level, but I think we wanted to confirm that.
One thing I just thought of. @wturne tested eFolder Express access with Brad. He was able to download documents for the case that I posted (which had CCK the law firm as the representative, not Brad), and he could not access a file number where he was not the representative. So, he was accessing Veterans that his firm represented, not accessing Veterans he himself represented.
Your comment before:
Also, since private attorneys and the firms they belong to have different BSG participant IDs (confirmed with the example above), do we have an example appeal ID for an appeal that has elected to be represented by a private attorney? We need this to determine if the representative happens at the attorney level or at the organization (firm) level.
Is it possible the representative happens at the organization level, but people are mapped to that organization in CorpDB (which we are accessing through BGS)?
Should we ask BGS if both the individual participant ID and the law firm participant ID are attached to a case, but we're just pulling one of the two?
The Board wants individuals to have access just to their individual representatives, not the entire firm's representatives. If BGS isn't storing the individual representatives, I worry there may need to be a change to the underlying way representatives are mapped to Veterans.
Is it possible the representative happens at the organization level, but people are mapped to that organization in CorpDB (which we are accessing through BGS)?
I think that is quite likely.
Should we ask BGS if both the individual participant ID and the law firm participant ID are attached to a case, but we're just pulling one of the two?
Absolutely. Do we have a contact I can reach out to at BGS?
The Board wants individuals to have access just to their individual representatives, not the entire firm's representatives. If BGS isn't storing the individual representatives, I worry there may need to be a change to the underlying way representatives are mapped to Veterans.
I think this is likely to be the situation we are in...
@leikkisa - who are the contacts at BGS that you've been working with? I know one is John Dell.
I talked to Brad and I was unaware that his firm, CCK, was grandfathered in to having one rep (Robert Chisholm) for the entire firm. Thus, he should see all of the cases which his firm represents.
Can you please let me know when he can expect the URL? Do we need to have a discussion about what he will have access to?
Got this email from Jennifer this weekend. It looks like CCK might be an exception to the rule here. I've asked her to send me another individual private attorney so we can be certain about individual vs. group participant IDs working.
Before continuing work on this feature we need a little more information about how BGS models the relationships between private attorneys, firms, and appellants. BGS makes a distinction between organizations and people and with the example case of CCK that can be represented as follows:
+-organization----+ +-------------+
| | | |
| Robert Chisholm +<----------+ Appellant A |
| | | |
+------+------+---+ +-------------+
| |
| |
| +-------------------+
| |
+-person-+------+ +-person?-+--------+
| | | |
| Brad Hennings | | Robert Chisholm? |
| | | |
+---------------- +------------------+
It sounds like CCK is a special case, but we can use it to describe the central question we need to answer before proceeding: Are appellants always represented by organizations? That is, if I am a private attorney will I have an organization object with its a different participant ID? Or will appellants sometimes be represented by individual people?
Given a few more examples of private bar representation we can determine this ourselves.
We can test private attorney access to queue without any changes to the code by doing the following two things:
FieldVso for the organization (we can do this in the Caseflow team management interface or a developer can do it directly in the Rails console)This will not be the way that private attorneys ultimately access Queue, but it seems like an easy way to test whether this fits their needs and BGS permissions are arranged as expected.
Brad can be one pilot user. I asked Jennifer about another one and she's looking into it now. I know Brad already has access to eFolder Express and did submit some forms. I think he was advised to get eFolder and VSO functions for CSEM, but we'd have to double check. Maybe @msj0nes can help us see what CSEM functions he already has.
Created a Field VSO organization for CCK for testing with Bradley Hennings. Steps to finish testing:
UpdateAppellantRepresentationJob to create TrackVeteranTasks for appeals CCK represents (should be done within a day or two, will check back then and see how it's done)appeals.cf.ds.va.gov/organizations/cck-lawAfter we've verified that this works we can proceed with creating a specific "Private Bar" organization type similar to Field VSO possibly with its own CSEM function.
Next tester:
What I emailed. Including in case it's nice to have this copy later:
A few other questions to help us with testing - so we can test remotely, and so we have your login information.
@laurjpeterson I could not find Katrina Eagle in Caseflow's users table (as expected because she's never used Caseflow) nor in BGS using station ID 377 and each of the following CSS IDs: VBA/ATNKEAGL, VBAATNKEAGL, and VBATNKEAGL and she. Can we confirm that the CSS ID and station ID are correct?
But we have great news for the test with Bradley Hennings and CCK:
rails c> FieldVso.find_by(name: "Chisholm Chisholm & Kilpatrick").tasks.count
# 8
CCK has 8 cases assigned to them already in Caseflow, so we'll have some stuff to look at when we test with them at the end of this month!
Emailed Katrina to confirm CSS ID and station ID today.
@lowellrex here is her response:
I know for sure that the station ID is 377. The only other CSS username that it may be is just "ATNKEAGL" which actually makes sense since I am a private attorney, not a VA employee in any way.
If this doesn't work, I will follow up with my ISO tomorrow to see if she can access that information for me. Meanwhile, I located 2 more TMS certificates and hoping that helps the initial process. I'm attaching them, but will also forward them to my ISO.
ATNKEAGL worked! Created a FieldVso for Katrina Eagle (url: katrina-eagle) that should start receiving tracking tasks shortly so we can test with Ms. Eagle shortly as well.
The arrangement of Katrina Eagle is the same as with CCK. BGS has two records for Katrina Eagle--1 person, 1 organization--and they are arranged like so:
+-organization----+ +-------------+
| | | |
| Katrina Eagle +<----------+ Appellant A |
| | | |
+------+----------+ +-------------+
|
|
|
|
+-person-+------+
| |
| Katrina Eagle |
| |
+---------------+
@wturne @lowellrex - FYI, I impersonated Brad just now.
Queue: He has an individual queue and can switch views to see Chisolm, Chisolm & Kilpatrick's cases. Note: they don't have any cases in their queue right now - you might need to make sure that Brad knows that Caseflow Queue for VSOs/private attorneys is _just_ for AMA cases right now (and I'll likely need to remind the Board too).
Hearings: He has "switch product" to go to Caseflow Hearings. I waited a ~2 mins and the schedule didn't load. I think Hearings should load legacy and AMA cases (unlike Queue, which is just AMA). This might be worth looking into prior to meeting with him at 10:30am tomorrow.
eFolder: Seems to be working just fine.
Queue: He has an individual queue and can switch views to see Chisolm, Chisolm & Kilpatrick's cases. Note: they don't have any cases in their queue right now - you might need to make sure that Brad knows that Caseflow Queue for VSOs/private attorneys is just for AMA cases right now (and I'll likely need to remind the Board too).
@wturne and I masqueraded as Brad yesterday and were able to see AMA and legacy cases for Chisolm, Chisolm & Kilpatrick in their queue, so I'm not totally sure what is going on there but I can take a look together later on.
Hearings: He has "switch product" to go to Caseflow Hearings. I waited a ~2 mins and the schedule didn't load. I think Hearings should load legacy and AMA cases (unlike Queue, which is just AMA). This might be worth looking into prior to meeting with him at 10:30am tomorrow.
We were able to get a few hearings to load and so I think this is working as well!
Closing this ticket since work is complete. PrivateBar entities can be created in the Caseflow Team Management interface (#10960) and we changed the two pilot organizations from FieldVsos into PrivateBars.
rails c> cck = FieldVso.find_by(name: "Chisholm Chisholm & Kilpatrick")
rails c> cck.update!(type: PrivateBar.name)
rails c> keagle = FieldVso.find_by(url: "katrina-eagle")
rails c> keagle.update!(type: PrivateBar.name)