you will most certainly have to use case sharing.
I’ve recently developed an app where i wanted to restrict access to the cases based on a number of factors, but still wanted to share them across the teams for regular every day tasks such as recording attendance.
I was able to accomplish this through leveraging organizational levels and locations. We assign one of the case types to a location/case sharing group (https://confluence.dimagi.com/display/commcarepublic/Assigning+cases+to+one+of+multiple+groups)
which doesn’t look as nice as using locations, but for my use-case i had to use sharing groups.
then, i used caselist filters to make sure that the user only saw the relevant cases. This allowed me to actually reassign cases using a form in the application.
here’s something that can maybe work for you
cases start with attribute called (current_state) that’s defaulted to “pending_followup_1”.
in a followup form, you update that property to “pending_followup_2”
you then have two separate caselists, one that filters for pending_followup_1 status for that case type, and one that filters for the other one.
if you have user-properties set up, you can hide the forms to show only for users with a specific property.
Alternatively, you can use that same user property “state access” and set that value to the same as the cases “pending_followup_1”, and filter the cases to show only if their state matches the user property.
I guess that’s a really long answer.
short answer: Look at using organizational levels/locations, case filters, display conditions, and last but not least, custom-user-data (found here https://confluence.dimagi.com/display/commcarepublic/Custom+User+Data)
there are a number of combinations using these features to achieve your objective. just, design it on a piece of paper first before you try to deploy. it will make your life a lot easier.