Patient Import Flow Chart

This is the flow chart for patient imports are performed, including the new review phases.

---
title: Class Imports
---
flowchart TB

        classDef status_change stroke:#004,fill:#eef
        classDef import_status_change stroke:#400,fill:#fee

        subgraph "Patient Changeset States"
                direction TB

                changeset_statuses_pending[pending]:::status_change
                changeset_statuses_calculating_review[calculating_review]:::status_change
                changeset_statuses_ready_for_review[ready_for_review]:::status_change
                changeset_statuses_committing[committing]:::status_change
                changeset_statuses_needs_re_review[needs_re_review]:::status_change
                changeset_statuses_processed[processed]:::status_change
                changeset_statuses_import_invalid[import_invalid]:::status_change

                changeset_statuses_pending --> changeset_statuses_calculating_review
                changeset_statuses_calculating_review --> changeset_statuses_ready_for_review
                changeset_statuses_calculating_review --> changeset_statuses_import_invalid
                changeset_statuses_ready_for_review --> changeset_statuses_committing
                changeset_statuses_committing --> changeset_statuses_processed
                changeset_statuses_committing --> changeset_statuses_needs_re_review
                changeset_statuses_needs_re_review --> changeset_statuses_calculating_review
                changeset_statuses_processed --> changeset_statuses_calculating_review
        end

    user --> create
    user --> approve

    subgraph ClassImportController
            set_status_to_pending:::status_change
            create_changesets["create changesets"]
        set_status_to_pending["set status to pending"]
        enqueue_pds_cascading_search_jobs["enqueue cascading PDS search jobs"]
        set_import_status_to_committing["set import status to committing"]:::import_status_change
        set_changeset_status_to_committing["set changeset status to committing"]:::status_change
        enqueue_commit_patient_changesets_job["enqueue commit patient changesets job"]
        class_import_controller_set_status_to_calculating_review["set status to calculating review"]:::status_change
        class_import_controller_enqueue_review_patient_changeset_job["enqueue review patient changeset job"]

        create --> create_changesets
        create_changesets --> set_status_to_pending
        set_status_to_pending --"for changesets with postcode"--> enqueue_pds_cascading_search_jobs
        set_status_to_pending --"for changesets without postcode"--> class_import_controller_set_status_to_calculating_review
        class_import_controller_set_status_to_calculating_review -...-> changeset_statuses_calculating_review
        class_import_controller_set_status_to_calculating_review --> class_import_controller_enqueue_review_patient_changeset_job
        set_status_to_pending -...-> changeset_statuses_pending

        approve --> set_import_status_to_committing
            set_import_status_to_committing --> set_changeset_status_to_committing:::status_change
            set_changeset_status_to_committing --> enqueue_commit_patient_changesets_job
            set_changeset_status_to_committing -...-> changeset_statuses_committing
    end
    enqueue_pds_cascading_search_jobs -- "individual changeset" --> start_pds_cascading_search
        enqueue_commit_patient_changesets_job -- "changeset batch" --> start_commit_patient_changesets
        class_import_controller_enqueue_review_patient_changeset_job --"individual changeset"--> start_review_patient_changeset

    subgraph PDSCascadingSearchJob
            start_pds_cascading_search((perform))
            do_pds_search["do PDS search"]
            save_search_result["save search result"]
        start_pds_cascading_search --> do_pds_search
        do_pds_search --> save_search_result
        save_search_result -- "next step" --> do_pds_search
    end
    save_search_result -- "perform for each changeset" --> start_process_patient_changeset

    subgraph ProcessPatientChangesetJob
        start_process_patient_changeset((perform))
            check_no_changesets_pending{No changesets pending?}
            check_import{Is import ok?}
            set_status_to_calculating_review["set status to calculating review"]:::status_change
            set_nhs_number_if_unique["set nhs number if unique"]
            set_status_to_import_invalid["set status to import invalid"]:::status_change

            start_process_patient_changeset --> set_nhs_number_if_unique
            set_nhs_number_if_unique --> set_status_to_calculating_review
            set_status_to_calculating_review --> check_no_changesets_pending
            set_status_to_calculating_review -..-> changeset_statuses_calculating_review
            check_no_changesets_pending -- yes --> check_import
            check_import -- no --> set_status_to_import_invalid
            set_status_to_import_invalid --> return
            set_status_to_import_invalid -..-> changeset_statuses_import_invalid
            return((return))
        end
    check_no_changesets_pending -- no --> start_review_patient_changeset
        check_import -- yes --> start_review_patient_changeset

    subgraph ReviewPatientChangesetJob
            start_review_patient_changeset((perform))
            check_ready_for_review{check changesets are ready_for_review}
            check_none_pending{check no changesets are pending}
            set_status_to_ready_for_review["set status to ready for review"]:::status_change
        enqueue_review_class_import_school_move["enqueue review class import school move"]

            start_review_patient_changeset --> check_ready_for_review
            check_ready_for_review -- yes --> finish_review_patient_changeset_job((finish))
            check_ready_for_review -- no --> set_status_to_ready_for_review
            set_status_to_ready_for_review --> check_none_pending
            set_status_to_ready_for_review -..-> changeset_statuses_ready_for_review
            check_none_pending -- no --> finish_review_patient_changeset_job
            check_none_pending -- yes --> enqueue_review_class_import_school_move
    end

        subgraph ReviewClassImportSchoolMoveJob
                start_review_class_import_school_move((perform))
            create_school_moves_for_unknown_patients["create school moves for unknown patients"]

                start_review_class_import_school_move --> create_school_moves_for_unknown_patients
                create_school_moves_for_unknown_patients --> finish((finish))
        end
        enqueue_review_class_import_school_move -- "individual changeset" --> start_review_class_import_school_move

        subgraph CommitPatientChangesetsJob
                start_commit_patient_changesets((perform))
                set_status_to_processed["set status to processed"]:::status_change
                if_finished_commiting_changesets{if finished commiting changesets for import}
                set_status_to_calculating_review_2[set status to calculating review]:::status_change
        commit_consistent_changesets["commit consistent changesets"]
        set_status_to_calculating_review_2["set status to calculating_review"]
        enqueue_review_patient_changeset_job["enqueue review patient changeset job"]
        set_import_status_to_calculating_re_review["set import status to calculating_re_review"]
        enqueue_sync_patient_team_job["enqueue sync patient team job"]
        commit_patient_changeset_job_finish((finish))
        set_status_to_needs_re_review[set status to needs_re_review]:::status_change
        for_each_changeset_needing_re_review@{ shape: notch-pent, label: "for each changeset needing re-review" }

                start_commit_patient_changesets -- "for all consistent changesets in batch" --> commit_consistent_changesets
                start_commit_patient_changesets -- "for all inconsistent changesets in batch" --> set_status_to_needs_re_review
                set_status_to_needs_re_review -..-> changeset_statuses_needs_re_review
                commit_consistent_changesets --> set_status_to_processed
                set_status_to_processed ---> if_finished_commiting_changesets
                set_status_to_needs_re_review --> if_finished_commiting_changesets
                set_status_to_processed -..-> changeset_statuses_processed
                if_finished_commiting_changesets -- no --> enqueue_sync_patient_team_job
                if_finished_commiting_changesets -- yes --> set_import_status_to_calculating_re_review:::import_status_change
                set_import_status_to_calculating_re_review --> for_each_changeset_needing_re_review
                for_each_changeset_needing_re_review --> set_status_to_calculating_review_2
                enqueue_review_patient_changeset_job --> for_each_changeset_needing_re_review
                set_status_to_calculating_review_2 --> enqueue_review_patient_changeset_job
                set_status_to_calculating_review_2 -..-> changeset_statuses_calculating_review
                enqueue_review_patient_changeset_job --> enqueue_sync_patient_team_job
                enqueue_sync_patient_team_job --> commit_patient_changeset_job_finish
        end
        enqueue_review_patient_changeset_job --"individual changeset"--> start_review_patient_changeset