diff --git a/ccd-definition/AuthorisationCaseField/CareSupervision/gatekeeper.json b/ccd-definition/AuthorisationCaseField/CareSupervision/gatekeeper.json index c61caf0da0e..d614a6abc5f 100644 --- a/ccd-definition/AuthorisationCaseField/CareSupervision/gatekeeper.json +++ b/ccd-definition/AuthorisationCaseField/CareSupervision/gatekeeper.json @@ -4150,6 +4150,153 @@ "UserRole": "caseworker-publiclaw-gatekeeper", "CRUD": "CRU" }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewOrderLabel", + "UserRole": "caseworker-publiclaw-gatekeeper", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrderTitle1", + "UserRole": "caseworker-publiclaw-gatekeeper", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrderTitle2", + "UserRole": "caseworker-publiclaw-gatekeeper", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrderTitle3", + "UserRole": "caseworker-publiclaw-gatekeeper", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrderTitle4", + "UserRole": "caseworker-publiclaw-gatekeeper", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrderTitle5", + "UserRole": "caseworker-publiclaw-gatekeeper", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrderTitle6", + "UserRole": "caseworker-publiclaw-gatekeeper", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrderTitle7", + "UserRole": "caseworker-publiclaw-gatekeeper", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrderTitle8", + "UserRole": "caseworker-publiclaw-gatekeeper", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrderTitle9", + "UserRole": "caseworker-publiclaw-gatekeeper", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrderTitle10", + "UserRole": "caseworker-publiclaw-gatekeeper", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrder1", + "UserRole": "caseworker-publiclaw-gatekeeper", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrder2", + "UserRole": "caseworker-publiclaw-gatekeeper", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrder3", + "UserRole": "caseworker-publiclaw-gatekeeper", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrder4", + "UserRole": "caseworker-publiclaw-gatekeeper", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrder5", + "UserRole": "caseworker-publiclaw-gatekeeper", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrder6", + "UserRole": "caseworker-publiclaw-gatekeeper", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrder7", + "UserRole": "caseworker-publiclaw-gatekeeper", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrder8", + "UserRole": "caseworker-publiclaw-gatekeeper", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrder9", + "UserRole": "caseworker-publiclaw-gatekeeper", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrder10", + "UserRole": "caseworker-publiclaw-gatekeeper", + "CRUD": "CRU" + }, { "LiveFrom": "01/01/2017", "CaseTypeID": "CARE_SUPERVISION_EPO", diff --git a/ccd-definition/AuthorisationCaseField/CareSupervision/judiciary.json b/ccd-definition/AuthorisationCaseField/CareSupervision/judiciary.json index d360dedd2a4..33627a2dcd3 100644 --- a/ccd-definition/AuthorisationCaseField/CareSupervision/judiciary.json +++ b/ccd-definition/AuthorisationCaseField/CareSupervision/judiciary.json @@ -4367,6 +4367,153 @@ "UserRole": "caseworker-publiclaw-judiciary", "CRUD": "CRU" }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewOrderLabel", + "UserRole": "caseworker-publiclaw-judiciary", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrderTitle1", + "UserRole": "caseworker-publiclaw-judiciary", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrderTitle2", + "UserRole": "caseworker-publiclaw-judiciary", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrderTitle3", + "UserRole": "caseworker-publiclaw-judiciary", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrderTitle4", + "UserRole": "caseworker-publiclaw-judiciary", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrderTitle5", + "UserRole": "caseworker-publiclaw-judiciary", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrderTitle6", + "UserRole": "caseworker-publiclaw-judiciary", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrderTitle7", + "UserRole": "caseworker-publiclaw-judiciary", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrderTitle8", + "UserRole": "caseworker-publiclaw-judiciary", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrderTitle9", + "UserRole": "caseworker-publiclaw-judiciary", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrderTitle10", + "UserRole": "caseworker-publiclaw-judiciary", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrder1", + "UserRole": "caseworker-publiclaw-judiciary", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrder2", + "UserRole": "caseworker-publiclaw-judiciary", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrder3", + "UserRole": "caseworker-publiclaw-judiciary", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrder4", + "UserRole": "caseworker-publiclaw-judiciary", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrder5", + "UserRole": "caseworker-publiclaw-judiciary", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrder6", + "UserRole": "caseworker-publiclaw-judiciary", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrder7", + "UserRole": "caseworker-publiclaw-judiciary", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrder8", + "UserRole": "caseworker-publiclaw-judiciary", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrder9", + "UserRole": "caseworker-publiclaw-judiciary", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrder10", + "UserRole": "caseworker-publiclaw-judiciary", + "CRUD": "CRU" + }, { "LiveFrom": "01/01/2017", "CaseTypeID": "CARE_SUPERVISION_EPO", diff --git a/ccd-definition/AuthorisationCaseField/CareSupervision/superuser.json b/ccd-definition/AuthorisationCaseField/CareSupervision/superuser.json index df8b8c2b2a0..c380940d026 100644 --- a/ccd-definition/AuthorisationCaseField/CareSupervision/superuser.json +++ b/ccd-definition/AuthorisationCaseField/CareSupervision/superuser.json @@ -636,6 +636,153 @@ "UserRole": "caseworker-publiclaw-superuser", "CRUD": "CRU" }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewOrderLabel", + "UserRole": "caseworker-publiclaw-superuser", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrderTitle1", + "UserRole": "caseworker-publiclaw-superuser", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrderTitle2", + "UserRole": "caseworker-publiclaw-superuser", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrderTitle3", + "UserRole": "caseworker-publiclaw-superuser", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrderTitle4", + "UserRole": "caseworker-publiclaw-superuser", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrderTitle5", + "UserRole": "caseworker-publiclaw-superuser", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrderTitle6", + "UserRole": "caseworker-publiclaw-superuser", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrderTitle7", + "UserRole": "caseworker-publiclaw-superuser", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrderTitle8", + "UserRole": "caseworker-publiclaw-superuser", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrderTitle9", + "UserRole": "caseworker-publiclaw-superuser", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrderTitle10", + "UserRole": "caseworker-publiclaw-superuser", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrder1", + "UserRole": "caseworker-publiclaw-superuser", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrder2", + "UserRole": "caseworker-publiclaw-superuser", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrder3", + "UserRole": "caseworker-publiclaw-superuser", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrder4", + "UserRole": "caseworker-publiclaw-superuser", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrder5", + "UserRole": "caseworker-publiclaw-superuser", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrder6", + "UserRole": "caseworker-publiclaw-superuser", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrder7", + "UserRole": "caseworker-publiclaw-superuser", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrder8", + "UserRole": "caseworker-publiclaw-superuser", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrder9", + "UserRole": "caseworker-publiclaw-superuser", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrder10", + "UserRole": "caseworker-publiclaw-superuser", + "CRUD": "CRU" + }, { "LiveFrom": "01/01/2017", "CaseTypeID": "CARE_SUPERVISION_EPO", diff --git a/ccd-definition/CaseEventToFields/CareSupervision/reviewCMO.json b/ccd-definition/CaseEventToFields/CareSupervision/reviewCMO.json index 0df33262674..e50848972dc 100644 --- a/ccd-definition/CaseEventToFields/CareSupervision/reviewCMO.json +++ b/ccd-definition/CaseEventToFields/CareSupervision/reviewCMO.json @@ -683,6 +683,283 @@ "PageColumnNumber": 1, "PageShowCondition": "numDraftCMOs=\"NONE\"" }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseEventID": "reviewCMO", + "CaseFieldID": "judgeType", + "DisplayContext": "READONLY", + "PageID": "FeePaidJudge", + "PageDisplayOrder": 4, + "PageColumnNumber": 1, + "PageFieldDisplayOrder": 1, + "FieldShowCondition": "feePaidJudgeTitle=\"DO_NOT_SHOW\"", + "PageShowCondition": "judgeType=\"FEE_PAID_JUDGE\"", + "CallBackURLMidEvent": "${CCD_DEF_CASE_SERVICE_BASE_URL}/callback/approve-draft-orders/preview-orders/mid-event", + "Comment": "This page is only shown when a fee paid judge approving and cover sheet is required" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseEventID": "reviewCMO", + "CaseFieldID": "feePaidJudgeTitle", + "CaseEventFieldLabel": "Please select your title", + "DisplayContext": "MANDATORY", + "PageID": "FeePaidJudge", + "PageDisplayOrder": 4, + "PageColumnNumber": 1, + "PageFieldDisplayOrder": 2 + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseEventID": "reviewCMO", + "CaseFieldID": "previewOrderLabel", + "DisplayContext": "READONLY", + "PageID": "PreviewApprovedOrders", + "PageDisplayOrder": 5, + "PageColumnNumber": 1, + "PageFieldDisplayOrder": 1, + "PageShowCondition": "previewApprovedOrder1=\"*\"" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseEventID": "reviewCMO", + "CaseFieldID": "previewApprovedOrderTitle1", + "DisplayContext": "READONLY", + "PageID": "PreviewApprovedOrders", + "PageDisplayOrder": 5, + "PageColumnNumber": 1, + "PageFieldDisplayOrder": 2 + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseEventID": "reviewCMO", + "CaseFieldID": "previewApprovedOrder1", + "DisplayContext": "READONLY", + "PageID": "PreviewApprovedOrders", + "PageDisplayOrder": 5, + "PageColumnNumber": 1, + "PageFieldDisplayOrder": 3 + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseEventID": "reviewCMO", + "CaseFieldID": "previewApprovedOrderTitle2", + "DisplayContext": "READONLY", + "PageID": "PreviewApprovedOrders", + "PageDisplayOrder": 5, + "PageColumnNumber": 1, + "PageFieldDisplayOrder": 4, + "FieldShowCondition": "previewApprovedOrder2=\"*\"" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseEventID": "reviewCMO", + "CaseFieldID": "previewApprovedOrder2", + "DisplayContext": "READONLY", + "PageID": "PreviewApprovedOrders", + "PageDisplayOrder": 5, + "PageColumnNumber": 1, + "PageFieldDisplayOrder": 5, + "FieldShowCondition": "previewApprovedOrderTitle2=\"*\"" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseEventID": "reviewCMO", + "CaseFieldID": "previewApprovedOrderTitle3", + "DisplayContext": "READONLY", + "PageID": "PreviewApprovedOrders", + "PageDisplayOrder": 5, + "PageColumnNumber": 1, + "PageFieldDisplayOrder": 3, + "FieldShowCondition": "previewApprovedOrder3=\"*\"" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseEventID": "reviewCMO", + "CaseFieldID": "previewApprovedOrder3", + "DisplayContext": "READONLY", + "PageID": "PreviewApprovedOrders", + "PageDisplayOrder": 5, + "PageColumnNumber": 1, + "PageFieldDisplayOrder": 4, + "FieldShowCondition": "previewApprovedOrderTitle3=\"*\"" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseEventID": "reviewCMO", + "CaseFieldID": "previewApprovedOrderTitle4", + "DisplayContext": "READONLY", + "PageID": "PreviewApprovedOrders", + "PageDisplayOrder": 5, + "PageColumnNumber": 1, + "PageFieldDisplayOrder": 5, + "FieldShowCondition": "previewApprovedOrder4=\"*\"" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseEventID": "reviewCMO", + "CaseFieldID": "previewApprovedOrder4", + "DisplayContext": "READONLY", + "PageID": "PreviewApprovedOrders", + "PageDisplayOrder": 5, + "PageColumnNumber": 1, + "PageFieldDisplayOrder": 6, + "FieldShowCondition": "previewApprovedOrderTitle4=\"*\"" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseEventID": "reviewCMO", + "CaseFieldID": "previewApprovedOrderTitle5", + "DisplayContext": "READONLY", + "PageID": "PreviewApprovedOrders", + "PageDisplayOrder": 5, + "PageColumnNumber": 1, + "PageFieldDisplayOrder": 7, + "FieldShowCondition": "previewApprovedOrder5=\"*\"" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseEventID": "reviewCMO", + "CaseFieldID": "previewApprovedOrder5", + "DisplayContext": "READONLY", + "PageID": "PreviewApprovedOrders", + "PageDisplayOrder": 5, + "PageColumnNumber": 1, + "PageFieldDisplayOrder": 8, + "FieldShowCondition": "previewApprovedOrderTitle5=\"*\"" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseEventID": "reviewCMO", + "CaseFieldID": "previewApprovedOrderTitle6", + "DisplayContext": "READONLY", + "PageID": "PreviewApprovedOrders", + "PageDisplayOrder": 5, + "PageColumnNumber": 1, + "PageFieldDisplayOrder": 9, + "FieldShowCondition": "previewApprovedOrder6=\"*\"" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseEventID": "reviewCMO", + "CaseFieldID": "previewApprovedOrder6", + "DisplayContext": "READONLY", + "PageID": "PreviewApprovedOrders", + "PageDisplayOrder": 5, + "PageColumnNumber": 1, + "PageFieldDisplayOrder": 10, + "FieldShowCondition": "previewApprovedOrderTitle6=\"*\"" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseEventID": "reviewCMO", + "CaseFieldID": "previewApprovedOrderTitle7", + "DisplayContext": "READONLY", + "PageID": "PreviewApprovedOrders", + "PageDisplayOrder": 5, + "PageColumnNumber": 1, + "PageFieldDisplayOrder": 11, + "FieldShowCondition": "previewApprovedOrder7=\"*\"" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseEventID": "reviewCMO", + "CaseFieldID": "previewApprovedOrder7", + "DisplayContext": "READONLY", + "PageID": "PreviewApprovedOrders", + "PageDisplayOrder": 5, + "PageColumnNumber": 1, + "PageFieldDisplayOrder": 12, + "FieldShowCondition": "previewApprovedOrderTitle7=\"*\"" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseEventID": "reviewCMO", + "CaseFieldID": "previewApprovedOrderTitle8", + "DisplayContext": "READONLY", + "PageID": "PreviewApprovedOrders", + "PageDisplayOrder": 5, + "PageColumnNumber": 1, + "PageFieldDisplayOrder": 13, + "FieldShowCondition": "previewApprovedOrder8=\"*\"" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseEventID": "reviewCMO", + "CaseFieldID": "previewApprovedOrder8", + "DisplayContext": "READONLY", + "PageID": "PreviewApprovedOrders", + "PageDisplayOrder": 5, + "PageColumnNumber": 1, + "PageFieldDisplayOrder": 14, + "FieldShowCondition": "previewApprovedOrderTitle8=\"*\"" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseEventID": "reviewCMO", + "CaseFieldID": "previewApprovedOrderTitle9", + "DisplayContext": "READONLY", + "PageID": "PreviewApprovedOrders", + "PageDisplayOrder": 5, + "PageColumnNumber": 1, + "PageFieldDisplayOrder": 15, + "FieldShowCondition": "previewApprovedOrder9=\"*\"" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseEventID": "reviewCMO", + "CaseFieldID": "previewApprovedOrder9", + "DisplayContext": "READONLY", + "PageID": "PreviewApprovedOrders", + "PageDisplayOrder": 5, + "PageColumnNumber": 1, + "PageFieldDisplayOrder": 16, + "FieldShowCondition": "previewApprovedOrderTitle9=\"*\"" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseEventID": "reviewCMO", + "CaseFieldID": "previewApprovedOrderTitle10", + "DisplayContext": "READONLY", + "PageID": "PreviewApprovedOrders", + "PageDisplayOrder": 5, + "PageColumnNumber": 1, + "PageFieldDisplayOrder": 17, + "FieldShowCondition": "previewApprovedOrder10=\"*\"" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseEventID": "reviewCMO", + "CaseFieldID": "previewApprovedOrder10", + "DisplayContext": "READONLY", + "PageID": "PreviewApprovedOrders", + "PageDisplayOrder": 5, + "PageColumnNumber": 1, + "PageFieldDisplayOrder": 18, + "FieldShowCondition": "previewApprovedOrderTitle10=\"*\"" + }, { "LiveFrom": "01/01/2017", "CaseTypeID": "CARE_SUPERVISION_EPO", @@ -691,7 +968,7 @@ "DisplayContext": "COMPLEX", "PageID": "UrgencyCheck", "PageFieldDisplayOrder": 1, - "PageDisplayOrder": 4, + "PageDisplayOrder": 6, "PageColumnNumber": 1, "ShowSummaryChangeOption": "Y", "PageShowCondition": "draftOrdersApproved=\"Yes\"" diff --git a/ccd-definition/CaseField/CareSupervision/hearingOrders.json b/ccd-definition/CaseField/CareSupervision/hearingOrders.json index 464abf49c83..a754bb3590c 100644 --- a/ccd-definition/CaseField/CareSupervision/hearingOrders.json +++ b/ccd-definition/CaseField/CareSupervision/hearingOrders.json @@ -1224,5 +1224,224 @@ "FieldType": "DraftOrderUrgencyOption", "SecurityClassification": "Public", "Searchable": "N" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "ID": "judgeTitleAndName", + "Label": "Title and name of the judge who approved the order", + "FieldType": "Text", + "SecurityClassification": "Public", + "FieldShownCondition": "judgeTitleAndName=\"DO_NOT_SHOW\"", + "Searchable": "N" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "ID": "previewOrderLabel", + "Label": "If you click 'Continue', the draft order will be approved without any changes. A coversheet will be added showing your name and the date of approval, and a court seal will also be applied to the final version.

Please note that the preview shown below will not display the court seal, but it reflects the content that will be issued.

If you wish to make any amendments, please return to the previous screen and select either 'No, I need to make changes' or 'No, the applicant needs to make changes'.", + "FieldType": "Label", + "SecurityClassification": "Public", + "Searchable": "N" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "ID": "previewApprovedOrderTitle1", + "Label": " ", + "FieldType": "Text", + "SecurityClassification": "Public", + "Searchable": "N", + "Comment": "Temporary field for previewing the approved order" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "ID": "previewApprovedOrderTitle2", + "Label": " ", + "FieldType": "Text", + "SecurityClassification": "Public", + "Searchable": "N", + "Comment": "Temporary field for previewing the approved order" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "ID": "previewApprovedOrderTitle3", + "Label": " ", + "FieldType": "Text", + "SecurityClassification": "Public", + "Searchable": "N", + "Comment": "Temporary field for previewing the approved order" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "ID": "previewApprovedOrderTitle4", + "Label": " ", + "FieldType": "Text", + "SecurityClassification": "Public", + "Searchable": "N", + "Comment": "Temporary field for previewing the approved order" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "ID": "previewApprovedOrderTitle5", + "Label": " ", + "FieldType": "Text", + "SecurityClassification": "Public", + "Searchable": "N", + "Comment": "Temporary field for previewing the approved order" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "ID": "previewApprovedOrderTitle6", + "Label": " ", + "FieldType": "Text", + "SecurityClassification": "Public", + "Searchable": "N", + "Comment": "Temporary field for previewing the approved order" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "ID": "previewApprovedOrderTitle7", + "Label": " ", + "FieldType": "Text", + "SecurityClassification": "Public", + "Searchable": "N", + "Comment": "Temporary field for previewing the approved order" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "ID": "previewApprovedOrderTitle8", + "Label": " ", + "FieldType": "Text", + "SecurityClassification": "Public", + "Searchable": "N", + "Comment": "Temporary field for previewing the approved order" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "ID": "previewApprovedOrderTitle9", + "Label": " ", + "FieldType": "Text", + "SecurityClassification": "Public", + "Searchable": "N", + "Comment": "Temporary field for previewing the approved order" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "ID": "previewApprovedOrderTitle10", + "Label": " ", + "FieldType": "Text", + "SecurityClassification": "Public", + "Searchable": "N", + "Comment": "Temporary field for previewing the approved order" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "ID": "previewApprovedOrder1", + "Label": " ", + "FieldType": "Document", + "SecurityClassification": "Public", + "Searchable": "N", + "Comment": "Temporary field for previewing the approved order" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "ID": "previewApprovedOrder2", + "Label": " ", + "FieldType": "Document", + "SecurityClassification": "Public", + "Searchable": "N", + "Comment": "Temporary field for previewing the approved order" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "ID": "previewApprovedOrder3", + "Label": " ", + "FieldType": "Document", + "SecurityClassification": "Public", + "Searchable": "N", + "Comment": "Temporary field for previewing the approved order" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "ID": "previewApprovedOrder4", + "Label": " ", + "FieldType": "Document", + "SecurityClassification": "Public", + "Searchable": "N", + "Comment": "Temporary field for previewing the approved order" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "ID": "previewApprovedOrder5", + "Label": " ", + "FieldType": "Document", + "SecurityClassification": "Public", + "Searchable": "N", + "Comment": "Temporary field for previewing the approved order" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "ID": "previewApprovedOrder6", + "Label": " ", + "FieldType": "Document", + "SecurityClassification": "Public", + "Searchable": "N", + "Comment": "Temporary field for previewing the approved order" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "ID": "previewApprovedOrder7", + "Label": " ", + "FieldType": "Document", + "SecurityClassification": "Public", + "Searchable": "N", + "Comment": "Temporary field for previewing the approved order" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "ID": "previewApprovedOrder8", + "Label": " ", + "FieldType": "Document", + "SecurityClassification": "Public", + "Searchable": "N", + "Comment": "Temporary field for previewing the approved order" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "ID": "previewApprovedOrder9", + "Label": " ", + "FieldType": "Document", + "SecurityClassification": "Public", + "Searchable": "N", + "Comment": "Temporary field for previewing the approved order" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "ID": "previewApprovedOrder10", + "Label": " ", + "FieldType": "Document", + "SecurityClassification": "Public", + "Searchable": "N", + "Comment": "Temporary field for previewing the approved order" } ] diff --git a/service/src/integrationTest/java/uk/gov/hmcts/reform/fpl/controllers/ApproveDraftOrdersControllerAbooutToSubmitTest.java b/service/src/integrationTest/java/uk/gov/hmcts/reform/fpl/controllers/ApproveDraftOrdersControllerAbooutToSubmitTest.java new file mode 100644 index 00000000000..3894d36f657 --- /dev/null +++ b/service/src/integrationTest/java/uk/gov/hmcts/reform/fpl/controllers/ApproveDraftOrdersControllerAbooutToSubmitTest.java @@ -0,0 +1,33 @@ +package uk.gov.hmcts.reform.fpl.controllers; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.autoconfigure.OverrideAutoConfiguration; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import uk.gov.hmcts.reform.fpl.controllers.orders.ApproveDraftOrdersController; +import uk.gov.hmcts.reform.fpl.model.CaseData; +import uk.gov.hmcts.reform.fpl.service.JudicialService; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.when; + +@WebMvcTest(ApproveDraftOrdersController.class) +@OverrideAutoConfiguration(enabled = true) +class ApproveDraftOrdersControllerAbooutToSubmitTest extends AbstractCallbackTest { + + @MockBean + private JudicialService judicialService; + + ApproveDraftOrdersControllerAbooutToSubmitTest() { + super("approve-draft-orders"); + } + + @Test + void shouldCaptureJudgeTitleAndName() { + when(judicialService.getJudgeTitleAndNameOfCurrentUser(null)).thenReturn("Judge Name"); + + CaseData returnedCaseData = extractCaseData(postAboutToSubmitEvent(CaseData.builder().build())); + assertThat(returnedCaseData.getReviewDraftOrdersData().getJudgeTitleAndName()) + .isEqualTo("Judge Name"); + } +} diff --git a/service/src/integrationTest/java/uk/gov/hmcts/reform/fpl/controllers/ApproveDraftOrdersControllerPostAboutToSubmitTest.java b/service/src/integrationTest/java/uk/gov/hmcts/reform/fpl/controllers/ApproveDraftOrdersControllerPostAboutToSubmitTest.java index ecd15f6b79e..c6bfa75b1ee 100644 --- a/service/src/integrationTest/java/uk/gov/hmcts/reform/fpl/controllers/ApproveDraftOrdersControllerPostAboutToSubmitTest.java +++ b/service/src/integrationTest/java/uk/gov/hmcts/reform/fpl/controllers/ApproveDraftOrdersControllerPostAboutToSubmitTest.java @@ -80,6 +80,8 @@ class ApproveDraftOrdersControllerPostAboutToSubmitTest extends AbstractCallback private final String hearing = "Test hearing 21st August 2020"; private final DocumentReference convertedDocument = DocumentReference.builder().filename("converted").build(); private final DocumentReference sealedDocument = DocumentReference.builder().filename("sealed").build(); + private final DocumentReference sealedDocumentWithCoverSheet = + DocumentReference.builder().filename("sealed").build(); ApproveDraftOrdersControllerPostAboutToSubmitTest() { super("approve-draft-orders/post-submit-callback"); @@ -240,6 +242,8 @@ void shouldSealPDFAndCreateBlankOrderWhenJudgeApprovesBlankOrders(CMOReviewOutco if (SEND_TO_ALL_PARTIES.equals(reviewOutcome)) { given(documentSealingService.sealDocument(order, court, SealType.ENGLISH)) .willReturn(sealedDocument); + given(documentSealingService.sealDocument(sealedDocument, court, SealType.ENGLISH)) + .willReturn(sealedDocumentWithCoverSheet); } else { given(documentSealingService.sealDocument(convertedDocument, court, SealType.ENGLISH)) .willReturn(sealedDocument); diff --git a/service/src/integrationTest/java/uk/gov/hmcts/reform/fpl/controllers/ApproveDraftOrdersControllerValidateReviewDecisionMidEventTest.java b/service/src/integrationTest/java/uk/gov/hmcts/reform/fpl/controllers/ApproveDraftOrdersControllerValidateReviewDecisionMidEventTest.java index 6377e94a1ab..8b24a10d983 100644 --- a/service/src/integrationTest/java/uk/gov/hmcts/reform/fpl/controllers/ApproveDraftOrdersControllerValidateReviewDecisionMidEventTest.java +++ b/service/src/integrationTest/java/uk/gov/hmcts/reform/fpl/controllers/ApproveDraftOrdersControllerValidateReviewDecisionMidEventTest.java @@ -3,6 +3,7 @@ import org.junit.jupiter.api.Test; import org.springframework.boot.test.autoconfigure.OverrideAutoConfiguration; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.test.mock.mockito.MockBean; import uk.gov.hmcts.reform.ccd.client.model.AboutToStartOrSubmitCallbackResponse; import uk.gov.hmcts.reform.fpl.controllers.orders.ApproveDraftOrdersController; import uk.gov.hmcts.reform.fpl.enums.CMOStatus; @@ -16,12 +17,16 @@ import uk.gov.hmcts.reform.fpl.model.event.ReviewDraftOrdersData; import uk.gov.hmcts.reform.fpl.model.order.HearingOrder; import uk.gov.hmcts.reform.fpl.model.order.HearingOrdersBundle; +import uk.gov.hmcts.reform.fpl.service.JudicialService; +import uk.gov.hmcts.reform.fpl.service.cmo.HearingOrderGenerator; import java.util.List; import java.util.UUID; import static com.google.common.collect.Lists.newArrayList; import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.BDDMockito.given; +import static org.mockito.Mockito.when; import static uk.gov.hmcts.reform.fpl.enums.CMOReviewOutcome.JUDGE_AMENDS_DRAFT; import static uk.gov.hmcts.reform.fpl.enums.CMOReviewOutcome.JUDGE_REQUESTED_CHANGES; import static uk.gov.hmcts.reform.fpl.enums.CMOReviewOutcome.SEND_TO_ALL_PARTIES; @@ -40,11 +45,18 @@ class ApproveDraftOrdersControllerValidateReviewDecisionMidEventTest extends Abs private final String validateDecisionEventPath = "validate-review-decision"; private final String hearing = "Test hearing 21st August 2020"; private final DocumentReference order = testDocumentReference(); + private final DocumentReference orderWithCoverSheet = testDocumentReference(); private final Element agreedCMO = element(buildDraftOrder(AGREED_CMO)); private final Element draftOrder1 = element(buildDraftOrder(C21)); private final Element draftOrder2 = element(buildDraftOrder(C21)); + @MockBean + private JudicialService judicialService; + + @MockBean + private HearingOrderGenerator hearingOrderGenerator; + ApproveDraftOrdersControllerValidateReviewDecisionMidEventTest() { super("approve-draft-orders"); } @@ -90,6 +102,7 @@ void shouldReturnErrorsWhenReviewDecisionIsJudgeRequestsChangesAndRequestedChang .cmoToReviewList(hearingOrdersBundleId.toString()) .reviewDraftOrdersData(reviewDraftOrdersData).build(); + given(judicialService.isCurrentUserFeePaidJudge()).willReturn(Boolean.FALSE); AboutToStartOrSubmitCallbackResponse callbackResponse = postMidEvent(caseData, validateDecisionEventPath); assertThat(callbackResponse.getErrors()).containsOnly("Add what the LA needs to change on the draft order 2"); @@ -114,6 +127,7 @@ void shouldReturnErrorsForAllReviewedOrdersWhenJudgeReviewIsInvalidForMoreThanOn .cmoToReviewList(hearingOrdersBundleId.toString()) .reviewDraftOrdersData(reviewDraftOrdersData).build(); + given(judicialService.isCurrentUserFeePaidJudge()).willReturn(Boolean.FALSE); AboutToStartOrSubmitCallbackResponse callbackResponse = postMidEvent(caseData, validateDecisionEventPath); assertThat(callbackResponse.getErrors()) @@ -128,7 +142,7 @@ void shouldNotReturnErrorsWhenJudgeDoesNotReviewOneOfTheDraftOrdersInTheBundle() hearingOrdersBundleId, newArrayList(draftOrder1, draftOrder2)); ReviewDraftOrdersData reviewDraftOrdersData = ReviewDraftOrdersData.builder() - .reviewDecision2(ReviewDecision.builder().decision(SEND_TO_ALL_PARTIES).build()) + .reviewDecision1(ReviewDecision.builder().decision(SEND_TO_ALL_PARTIES).build()) .build(); CaseData caseData = CaseData.builder() @@ -141,9 +155,13 @@ void shouldNotReturnErrorsWhenJudgeDoesNotReviewOneOfTheDraftOrdersInTheBundle() .cmoToReviewList(hearingOrdersBundleId.toString()) .reviewDraftOrdersData(reviewDraftOrdersData).build(); + when(judicialService.isCurrentUserFeePaidJudge()).thenReturn(Boolean.FALSE); + when(hearingOrderGenerator.addCoverSheet(caseData, order)).thenReturn(orderWithCoverSheet); AboutToStartOrSubmitCallbackResponse callbackResponse = postMidEvent(caseData, validateDecisionEventPath); assertThat(callbackResponse.getErrors()).isEmpty(); + assertThat(callbackResponse.getData().get("previewApprovedOrder1")).isNotNull(); + assertThat(callbackResponse.getData().get("previewApprovedOrderTitle1")).isNotNull(); } @Test @@ -159,9 +177,38 @@ void shouldNotReturnErrorsWhenReviewDecisionForTheDraftOrdersIsValid() { .cmoToReviewList(hearingOrdersBundleId.toString()) .reviewCMODecision(ReviewDecision.builder().decision(SEND_TO_ALL_PARTIES).build()).build(); + given(judicialService.isCurrentUserFeePaidJudge()).willReturn(Boolean.FALSE); + AboutToStartOrSubmitCallbackResponse callbackResponse = postMidEvent(caseData, validateDecisionEventPath); + + assertThat(callbackResponse.getErrors()).isEmpty(); + } + + @Test + void shouldSetFeePaidJudgeTypeIfFeePaidJudgeApproving() { + UUID hearingOrdersBundleId = UUID.randomUUID(); + + Element hearingOrdersBundle = buildHearingOrdersBundle( + hearingOrdersBundleId, newArrayList(draftOrder1, draftOrder2)); + + ReviewDraftOrdersData reviewDraftOrdersData = ReviewDraftOrdersData.builder() + .reviewDecision1(ReviewDecision.builder().decision(SEND_TO_ALL_PARTIES).build()) + .build(); + + CaseData caseData = CaseData.builder() + .others(Others.builder() + .firstOther(Other.builder().name("test1").build()) + .additionalOthers(wrapElements(Other.builder().name("test2").build())) + .build()) + .draftUploadedCMOs(newArrayList(agreedCMO)) + .hearingOrdersBundlesDrafts(List.of(hearingOrdersBundle)) + .cmoToReviewList(hearingOrdersBundleId.toString()) + .reviewDraftOrdersData(reviewDraftOrdersData).build(); + + when(judicialService.isCurrentUserFeePaidJudge()).thenReturn(Boolean.TRUE); AboutToStartOrSubmitCallbackResponse callbackResponse = postMidEvent(caseData, validateDecisionEventPath); assertThat(callbackResponse.getErrors()).isEmpty(); + assertThat(callbackResponse.getData().get("judgeType")).isEqualTo("FEE_PAID_JUDGE"); } private Element buildHearingOrdersBundle( diff --git a/service/src/main/java/uk/gov/hmcts/reform/fpl/controllers/orders/ApproveDraftOrdersController.java b/service/src/main/java/uk/gov/hmcts/reform/fpl/controllers/orders/ApproveDraftOrdersController.java index a727c75e726..16d3b59b10a 100644 --- a/service/src/main/java/uk/gov/hmcts/reform/fpl/controllers/orders/ApproveDraftOrdersController.java +++ b/service/src/main/java/uk/gov/hmcts/reform/fpl/controllers/orders/ApproveDraftOrdersController.java @@ -15,6 +15,7 @@ import uk.gov.hmcts.reform.fpl.model.common.Element; import uk.gov.hmcts.reform.fpl.model.common.dynamic.DynamicList; import uk.gov.hmcts.reform.fpl.model.order.HearingOrdersBundle; +import uk.gov.hmcts.reform.fpl.service.JudicialService; import uk.gov.hmcts.reform.fpl.service.ccd.CoreCaseDataService; import uk.gov.hmcts.reform.fpl.service.cmo.ApproveDraftOrdersService; import uk.gov.hmcts.reform.fpl.service.cmo.DraftOrdersEventNotificationBuilder; @@ -25,6 +26,8 @@ import static org.apache.commons.lang3.ObjectUtils.isEmpty; import static org.apache.commons.lang3.ObjectUtils.isNotEmpty; +import static uk.gov.hmcts.reform.fpl.enums.JudgeType.FEE_PAID_JUDGE; +import static uk.gov.hmcts.reform.fpl.model.event.ReviewDraftOrdersData.previewApprovedOrderFields; import static uk.gov.hmcts.reform.fpl.model.event.ReviewDraftOrdersData.reviewDecisionFields; import static uk.gov.hmcts.reform.fpl.model.event.ReviewDraftOrdersData.transientFields; @@ -35,6 +38,7 @@ public class ApproveDraftOrdersController extends CallbackController { private final ApproveDraftOrdersService approveDraftOrdersService; private final DraftOrdersEventNotificationBuilder draftOrdersEventNotificationBuilder; private final CoreCaseDataService coreCaseDataService; + private final JudicialService judicialService; private static final String DRAFT_ORDERS_APPROVED = "draftOrdersApproved"; @@ -44,7 +48,8 @@ public AboutToStartOrSubmitCallbackResponse handleAboutToStart(@RequestBody Call CaseData caseData = getCaseData(caseDetails); CaseDetailsHelper.removeTemporaryFields(caseDetails, reviewDecisionFields()); - CaseDetailsHelper.removeTemporaryFields(caseDetails, "orderReviewUrgency", DRAFT_ORDERS_APPROVED); + CaseDetailsHelper.removeTemporaryFields(caseDetails, "orderReviewUrgency", DRAFT_ORDERS_APPROVED, + "feePaidJudgeTitle"); caseDetails.getData().putAll(approveDraftOrdersService.getPageDisplayControls(caseData)); @@ -84,12 +89,52 @@ public AboutToStartOrSubmitCallbackResponse validateReviewDecision(@RequestBody data.put(DRAFT_ORDERS_APPROVED, "No"); } + if (errors.isEmpty()) { + data.remove("judgeType"); + CaseDetailsHelper.removeTemporaryFields(caseDetails, previewApprovedOrderFields()); + if ((caseData.getReviewDraftOrdersData() != null + && caseData.getReviewDraftOrdersData().hasADraftBeenApprovedWithoutChanges())) { + if (judicialService.isCurrentUserFeePaidJudge()) { + data.put("judgeType", FEE_PAID_JUDGE); + } else { + data.putAll(approveDraftOrdersService.previewOrderWithCoverSheet(caseData.toBuilder() + .reviewDraftOrdersData(caseData.getReviewDraftOrdersData().toBuilder() + .judgeTitleAndName(approveDraftOrdersService.getJudgeTitleAndNameOfCurrentUser(caseData)) + .build()) + .build())); + } + } + } + return respond(caseDetails, errors); } + @PostMapping("/preview-orders/mid-event") + public AboutToStartOrSubmitCallbackResponse previewOrders(@RequestBody CallbackRequest callbackRequest) { + CaseDetails caseDetails = callbackRequest.getCaseDetails(); + CaseData caseData = getCaseData(caseDetails); + + caseData = caseData.toBuilder() + .reviewDraftOrdersData(caseData.getReviewDraftOrdersData().toBuilder() + .judgeTitleAndName(approveDraftOrdersService.getJudgeTitleAndNameOfCurrentUser(caseData)) + .build()) + .build(); + + // Generate the preview of the orders with cover sheet + CaseDetailsHelper.removeTemporaryFields(caseDetails, previewApprovedOrderFields()); + caseDetails.getData().putAll(approveDraftOrdersService.previewOrderWithCoverSheet(caseData)); + + return respond(caseDetails); + } + @PostMapping("/about-to-submit") public AboutToStartOrSubmitCallbackResponse handleAboutToSubmit(@RequestBody CallbackRequest callbackRequest) { CaseDetails caseDetails = callbackRequest.getCaseDetails(); + CaseData caseData = getCaseData(caseDetails); + + caseDetails.getData().put("judgeTitleAndName", + approveDraftOrdersService.getJudgeTitleAndNameOfCurrentUser(caseData)); + CaseDetailsHelper.removeTemporaryFields(caseDetails, previewApprovedOrderFields()); // DFPL-1171 move all document processing step to post-about-to-submitted stage diff --git a/service/src/main/java/uk/gov/hmcts/reform/fpl/enums/DocmosisTemplates.java b/service/src/main/java/uk/gov/hmcts/reform/fpl/enums/DocmosisTemplates.java index 58c791b48ca..d2081e667ad 100644 --- a/service/src/main/java/uk/gov/hmcts/reform/fpl/enums/DocmosisTemplates.java +++ b/service/src/main/java/uk/gov/hmcts/reform/fpl/enums/DocmosisTemplates.java @@ -26,6 +26,8 @@ public enum DocmosisTemplates { EPO("FL-PLW-GOR-ENG-00228.doc", null, "emergency_protection_order"), EPO_V2("FL-PLW-GOR-ENG-00744.doc", null, "emergency_protection_order"), COVER_DOCS("FL-PLW-LET-ENG-COVER-SHEET.doc", "FL-PLW-LET-WEL-COVER-SHEET.doc", "cover_documents"), + APPROVED_ORDER_COVER("FL-PLW-GOR-ENG-APPROVED-ORDER-COVER-SHEET.docx", + "FL-PLW-GOR-WEL-APPROVED-ORDER-COVER-SHEET.docx", "approved-order-cover"), TRANSLATION_REQUEST("FL-PLW-LET-ENG-00748.doc", null, "translation_request"), A70("FL-PLW-GOR-ENG-00763V2.doc", null, "placement_order_a70"), A81("FL-PLW-GOR-ENG-00728.doc", null, "placement_order_a81"), diff --git a/service/src/main/java/uk/gov/hmcts/reform/fpl/model/docmosis/DocmosisApprovedOrderCoverSheet.java b/service/src/main/java/uk/gov/hmcts/reform/fpl/model/docmosis/DocmosisApprovedOrderCoverSheet.java new file mode 100644 index 00000000000..485130821c5 --- /dev/null +++ b/service/src/main/java/uk/gov/hmcts/reform/fpl/model/docmosis/DocmosisApprovedOrderCoverSheet.java @@ -0,0 +1,19 @@ +package uk.gov.hmcts.reform.fpl.model.docmosis; + +import lombok.Builder; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.List; + +@Data +@EqualsAndHashCode() +@Builder +public class DocmosisApprovedOrderCoverSheet implements DocmosisData { + private final String familyManCaseNumber; + private final String courtName; + private final List children; + private final String judgeTitleAndName; + private final String dateOfApproval; + private final String crest; +} diff --git a/service/src/main/java/uk/gov/hmcts/reform/fpl/model/event/AllocateJudgeEventData.java b/service/src/main/java/uk/gov/hmcts/reform/fpl/model/event/AllocateJudgeEventData.java index 2de232c28a5..8a5f4458b93 100644 --- a/service/src/main/java/uk/gov/hmcts/reform/fpl/model/event/AllocateJudgeEventData.java +++ b/service/src/main/java/uk/gov/hmcts/reform/fpl/model/event/AllocateJudgeEventData.java @@ -10,6 +10,8 @@ import uk.gov.hmcts.reform.fpl.model.JudicialUser; import uk.gov.hmcts.reform.fpl.model.Temp; +import static uk.gov.hmcts.reform.fpl.enums.JudgeType.FEE_PAID_JUDGE; + @Data @JsonInclude(JsonInclude.Include.NON_NULL) @AllArgsConstructor @@ -23,4 +25,8 @@ public class AllocateJudgeEventData { private final JudicialUser judicialUser; @Temp private final Judge manualJudgeDetails; + + public JudgeOrMagistrateTitle getFeePaidJudgeTitle() { + return (FEE_PAID_JUDGE.equals(judgeType)) ? feePaidJudgeTitle : null; + } } diff --git a/service/src/main/java/uk/gov/hmcts/reform/fpl/model/event/ReviewDraftOrdersData.java b/service/src/main/java/uk/gov/hmcts/reform/fpl/model/event/ReviewDraftOrdersData.java index 4df75ff5946..b24b361612c 100644 --- a/service/src/main/java/uk/gov/hmcts/reform/fpl/model/event/ReviewDraftOrdersData.java +++ b/service/src/main/java/uk/gov/hmcts/reform/fpl/model/event/ReviewDraftOrdersData.java @@ -5,14 +5,19 @@ import lombok.Builder; import lombok.Value; import uk.gov.hmcts.reform.fpl.model.ReviewDecision; +import uk.gov.hmcts.reform.fpl.model.Temp; import uk.gov.hmcts.reform.fpl.model.common.DocumentReference; import static org.springframework.util.ObjectUtils.isEmpty; +import static uk.gov.hmcts.reform.fpl.enums.CMOReviewOutcome.SEND_TO_ALL_PARTIES; @Value @Builder(toBuilder = true) @JsonInclude(JsonInclude.Include.NON_EMPTY) public class ReviewDraftOrdersData { + @Temp + String judgeTitleAndName; + String draftCMOExists; String draftBlankOrdersCount; @@ -59,7 +64,7 @@ public static String[] transientFields() { "cmoDraftOrderDocument", "draftOrder1Document", "draftOrder2Document", "draftOrder3Document", "draftOrder4Document", "draftOrder5Document", "draftOrder6Document", "draftOrder7Document", "draftOrder8Document", "draftOrder9Document", "draftOrder10Document", "reviewDraftOrdersTitles", - "draftOrdersTitlesInBundle", "draftOrdersApproved" + "draftOrdersTitlesInBundle", "draftOrdersApproved", "judgeTitleAndName", "feePaidJudgeTitle", "judgeType" }; } @@ -71,6 +76,21 @@ public static String[] reviewDecisionFields() { }; } + public static String[] previewApprovedOrderFields() { + return new String[]{ + "previewApprovedOrder1", "previewApprovedOrderTitle1", + "previewApprovedOrder2", "previewApprovedOrderTitle2", + "previewApprovedOrder3", "previewApprovedOrderTitle3", + "previewApprovedOrder4", "previewApprovedOrderTitle4", + "previewApprovedOrder5", "previewApprovedOrderTitle5", + "previewApprovedOrder6", "previewApprovedOrderTitle6", + "previewApprovedOrder7", "previewApprovedOrderTitle7", + "previewApprovedOrder8", "previewApprovedOrderTitle8", + "previewApprovedOrder9", "previewApprovedOrderTitle9", + "previewApprovedOrder10", "previewApprovedOrderTitle10" + }; + } + @JsonIgnore public boolean hasADraftBeenApproved() { return (!isEmpty(reviewDecision1) && reviewDecision1.hasBeenApproved()) @@ -85,4 +105,33 @@ public boolean hasADraftBeenApproved() { || (!isEmpty(reviewDecision10) && reviewDecision10.hasBeenApproved()); } + @JsonIgnore + public boolean hasADraftBeenApprovedWithoutChanges() { + return (!isEmpty(reviewDecision1) && reviewDecision1.hasReviewOutcomeOf(SEND_TO_ALL_PARTIES)) + || (!isEmpty(reviewDecision2) && reviewDecision2.hasReviewOutcomeOf(SEND_TO_ALL_PARTIES)) + || (!isEmpty(reviewDecision3) && reviewDecision3.hasReviewOutcomeOf(SEND_TO_ALL_PARTIES)) + || (!isEmpty(reviewDecision4) && reviewDecision4.hasReviewOutcomeOf(SEND_TO_ALL_PARTIES)) + || (!isEmpty(reviewDecision5) && reviewDecision5.hasReviewOutcomeOf(SEND_TO_ALL_PARTIES)) + || (!isEmpty(reviewDecision6) && reviewDecision6.hasReviewOutcomeOf(SEND_TO_ALL_PARTIES)) + || (!isEmpty(reviewDecision7) && reviewDecision7.hasReviewOutcomeOf(SEND_TO_ALL_PARTIES)) + || (!isEmpty(reviewDecision8) && reviewDecision8.hasReviewOutcomeOf(SEND_TO_ALL_PARTIES)) + || (!isEmpty(reviewDecision9) && reviewDecision9.hasReviewOutcomeOf(SEND_TO_ALL_PARTIES)) + || (!isEmpty(reviewDecision10) && reviewDecision10.hasReviewOutcomeOf(SEND_TO_ALL_PARTIES)); + } + + public ReviewDecision getReviewDecision(int counter) { + return switch (counter) { + case 1 -> reviewDecision1; + case 2 -> reviewDecision2; + case 3 -> reviewDecision3; + case 4 -> reviewDecision4; + case 5 -> reviewDecision5; + case 6 -> reviewDecision6; + case 7 -> reviewDecision7; + case 8 -> reviewDecision8; + case 9 -> reviewDecision9; + case 10 -> reviewDecision10; + default -> null; + }; + } } diff --git a/service/src/main/java/uk/gov/hmcts/reform/fpl/model/order/HearingOrdersBundle.java b/service/src/main/java/uk/gov/hmcts/reform/fpl/model/order/HearingOrdersBundle.java index b4e6c714452..2e5132de4d4 100644 --- a/service/src/main/java/uk/gov/hmcts/reform/fpl/model/order/HearingOrdersBundle.java +++ b/service/src/main/java/uk/gov/hmcts/reform/fpl/model/order/HearingOrdersBundle.java @@ -15,6 +15,7 @@ import java.util.Optional; import java.util.UUID; import java.util.stream.Collectors; +import java.util.stream.Stream; import static com.google.common.collect.Lists.newArrayList; import static java.util.Comparator.comparingInt; @@ -128,6 +129,11 @@ public List> getAllConfidentialOrdersByStatus(CMOStatus st .collect(Collectors.toList()); } + @JsonIgnore + public List> getAllOrdersAndConfidentialOrders() { + return Stream.of(getOrders(), getAllConfidentialOrders()).flatMap(List::stream).toList(); + } + @JsonIgnore public List> getCaseManagementOrders() { if (isNotEmpty(orders)) { diff --git a/service/src/main/java/uk/gov/hmcts/reform/fpl/service/JudicialService.java b/service/src/main/java/uk/gov/hmcts/reform/fpl/service/JudicialService.java index ebf9384bee7..d0eb9cad2ee 100644 --- a/service/src/main/java/uk/gov/hmcts/reform/fpl/service/JudicialService.java +++ b/service/src/main/java/uk/gov/hmcts/reform/fpl/service/JudicialService.java @@ -24,12 +24,15 @@ import uk.gov.hmcts.reform.fpl.model.common.JudgeAndLegalAdvisor; import uk.gov.hmcts.reform.fpl.model.event.AllocateJudgeEventData; import uk.gov.hmcts.reform.fpl.model.migration.HearingJudgeTime; +import uk.gov.hmcts.reform.fpl.service.time.Time; import uk.gov.hmcts.reform.fpl.utils.RoleAssignmentUtils; +import uk.gov.hmcts.reform.idam.client.models.UserDetails; import uk.gov.hmcts.reform.rd.client.JudicialApi; -import uk.gov.hmcts.reform.rd.client.StaffApi; +import uk.gov.hmcts.reform.rd.model.JudicialUserAppointment; import uk.gov.hmcts.reform.rd.model.JudicialUserProfile; import uk.gov.hmcts.reform.rd.model.JudicialUserRequest; +import java.time.LocalDate; import java.time.LocalDateTime; import java.time.ZonedDateTime; import java.util.ArrayList; @@ -42,8 +45,10 @@ import java.util.Set; import java.util.stream.Collectors; +import static org.apache.commons.lang3.ObjectUtils.isNotEmpty; import static org.springframework.util.ObjectUtils.isEmpty; import static uk.gov.hmcts.reform.fpl.config.TimeConfiguration.LONDON_TIMEZONE; +import static uk.gov.hmcts.reform.fpl.config.rd.LegalAdviserUsersConfiguration.SERVICE_CODE; import static uk.gov.hmcts.reform.fpl.enums.JudgeCaseRole.ALLOCATED_JUDGE; import static uk.gov.hmcts.reform.fpl.enums.JudgeCaseRole.HEARING_JUDGE; import static uk.gov.hmcts.reform.fpl.enums.JudgeOrMagistrateTitle.DEPUTY_DISTRICT_JUDGE; @@ -55,7 +60,10 @@ import static uk.gov.hmcts.reform.fpl.enums.JudgeType.LEGAL_ADVISOR; import static uk.gov.hmcts.reform.fpl.enums.LegalAdviserRole.ALLOCATED_LEGAL_ADVISER; import static uk.gov.hmcts.reform.fpl.enums.LegalAdviserRole.HEARING_LEGAL_ADVISER; +import static uk.gov.hmcts.reform.fpl.utils.ElementUtils.nullSafeCollection; +import static uk.gov.hmcts.reform.fpl.utils.JudgeAndLegalAdvisorHelper.formatJudgeTitleAndName; import static uk.gov.hmcts.reform.fpl.utils.RoleAssignmentUtils.buildRoleAssignment; +import static uk.gov.hmcts.reform.rd.model.JudicialUserAppointment.APPOINTMENT_TYPE_FEE_PAID; @Slf4j @Service @@ -82,12 +90,13 @@ public class JudicialService { private final SystemUserService systemUserService; private final AuthTokenGenerator authTokenGenerator; private final JudicialApi judicialApi; - private final StaffApi staffApi; private final RoleAssignmentService roleAssignmentService; private final ValidateEmailService validateEmailService; private final JudicialUsersConfiguration judicialUsersConfiguration; private final LegalAdviserUsersConfiguration legalAdviserUsersConfiguration; private final ElinksService elinksService; + private final UserService userService; + private final Time time; /** * Delete a set of allocated-[users] on a specific case. @@ -236,11 +245,7 @@ public boolean checkJudgeExists(String personalCode) { return false; } String systemUserToken = systemUserService.getSysUserToken(); - List judges = judicialApi.findUsers(systemUserToken, - authTokenGenerator.generate(), - JUDICIAL_PAGE_SIZE, - elinksService.getElinksAcceptHeader(), - JudicialUserRequest.fromPersonalCode(personalCode)); + List judges = getJudicialUserProfiles(JudicialUserRequest.fromPersonalCode(personalCode)); return !judges.isEmpty(); } @@ -275,11 +280,7 @@ public Optional getJudge(String personalCode) { return Optional.empty(); } String systemUserToken = systemUserService.getSysUserToken(); - List judges = judicialApi.findUsers(systemUserToken, - authTokenGenerator.generate(), - JUDICIAL_PAGE_SIZE, - elinksService.getElinksAcceptHeader(), - JudicialUserRequest.fromPersonalCode(personalCode)); + List judges = getJudicialUserProfiles(JudicialUserRequest.fromPersonalCode(personalCode)); if (judges.isEmpty()) { return Optional.empty(); @@ -549,4 +550,65 @@ private List getAllocatedJudgeAndLegalAdvisorRoleAssignments(Lon private List getHearingJudgeAndLegalAdviserRoleAssignments(Long caseId, ZonedDateTime endTime) { return roleAssignmentService.getCaseRolesAtTime(caseId, HEARING_ROLES, endTime); } + + public List getJudicialUserProfiles(JudicialUserRequest request) { + String systemUserToken = systemUserService.getSysUserToken(); + return judicialApi.findUsers(systemUserToken, + authTokenGenerator.generate(), + JUDICIAL_PAGE_SIZE, + elinksService.getElinksAcceptHeader(), + request); + } + + @Retryable(value = {FeignException.class}, label = "Search JRD for a judge by idam id") + public List getJudicialUserProfilesByIdamId(String idamId) { + return getJudicialUserProfiles(JudicialUserRequest.builder() + .idamId(List.of(idamId)).build()); + } + + public String getJudgeTitleAndNameOfCurrentUser(JudgeOrMagistrateTitle judgeTitle) { + UserDetails userDetails = userService.getUserDetails(); + List judicialUserProfiles = getJudicialUserProfilesByIdamId(userDetails.getId()); + + return judicialUserProfiles.stream().map(judicialUserProfile -> + formatJudgeTitleAndName(JudgeAndLegalAdvisor.fromJudicialUserProfile(judicialUserProfile, + judgeTitle))) + .findFirst() + .orElse(userDetails.getFullName()); + } + + public boolean isCurrentUserFeePaidJudge() { + UserDetails userDetails = userService.getUserDetails(); + List judicialUserProfiles = getJudicialUserProfilesByIdamId(userDetails.getId()); + + return !judicialUserProfiles.isEmpty() && isFeePaidJudge(judicialUserProfiles.get(0)); + } + + private boolean isFeePaidJudge(JudicialUserProfile judicialUserProfile) { + LocalDate todayDate = time.now().toLocalDate(); + + List feePaidAppointments = + nullSafeCollection(judicialUserProfile.getAppointments()).stream() + .filter(appointment -> + APPOINTMENT_TYPE_FEE_PAID.equals(appointment.getAppointmentType()) + && isWithinDateRange(todayDate, appointment.getStartDate(), appointment.getEndDate())) + .map(JudicialUserAppointment::getAppointmentId) + .toList(); + + if (!feePaidAppointments.isEmpty()) { + return nullSafeCollection(judicialUserProfile.getAuthorisations()).stream() + .anyMatch(authorisation -> + nullSafeCollection(authorisation.getServiceCodes()).contains(SERVICE_CODE) + && isWithinDateRange(todayDate, authorisation.getStartDate(), authorisation.getEndDate()) + && feePaidAppointments.contains(authorisation.getAppointmentId()) + ); + } + + return false; + } + + private boolean isWithinDateRange(LocalDate todayDate, LocalDate startDate, LocalDate endDate) { + return isNotEmpty(startDate) && todayDate.isAfter(startDate) + && (isEmpty(endDate) || todayDate.isBefore(endDate)); + } } diff --git a/service/src/main/java/uk/gov/hmcts/reform/fpl/service/cmo/ApproveDraftOrdersService.java b/service/src/main/java/uk/gov/hmcts/reform/fpl/service/cmo/ApproveDraftOrdersService.java index 5e13fb15593..e92f9620b36 100644 --- a/service/src/main/java/uk/gov/hmcts/reform/fpl/service/cmo/ApproveDraftOrdersService.java +++ b/service/src/main/java/uk/gov/hmcts/reform/fpl/service/cmo/ApproveDraftOrdersService.java @@ -4,6 +4,7 @@ import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import uk.gov.hmcts.reform.fpl.enums.CMOReviewOutcome; import uk.gov.hmcts.reform.fpl.enums.HearingType; import uk.gov.hmcts.reform.fpl.enums.State; import uk.gov.hmcts.reform.fpl.exceptions.CMONotFoundException; @@ -14,10 +15,12 @@ import uk.gov.hmcts.reform.fpl.model.ReviewDecision; import uk.gov.hmcts.reform.fpl.model.common.Element; import uk.gov.hmcts.reform.fpl.model.common.dynamic.DynamicList; +import uk.gov.hmcts.reform.fpl.model.event.ReviewDraftOrdersData; import uk.gov.hmcts.reform.fpl.model.order.HearingOrder; import uk.gov.hmcts.reform.fpl.model.order.HearingOrdersBundle; import uk.gov.hmcts.reform.fpl.model.order.HearingOrdersBundles; import uk.gov.hmcts.reform.fpl.model.order.generated.GeneratedOrder; +import uk.gov.hmcts.reform.fpl.service.JudicialService; import uk.gov.hmcts.reform.fpl.service.OthersService; import uk.gov.hmcts.reform.fpl.utils.ElementUtils; @@ -28,7 +31,6 @@ import java.util.Optional; import java.util.UUID; import java.util.stream.Collectors; -import java.util.stream.Stream; import static com.google.common.collect.Lists.newArrayList; import static java.util.stream.Collectors.toList; @@ -38,6 +40,7 @@ import static uk.gov.hmcts.reform.fpl.enums.CMOReviewOutcome.REVIEW_LATER; import static uk.gov.hmcts.reform.fpl.enums.CMOReviewOutcome.SEND_TO_ALL_PARTIES; import static uk.gov.hmcts.reform.fpl.enums.CMOStatus.SEND_TO_JUDGE; +import static uk.gov.hmcts.reform.fpl.enums.JudgeType.FEE_PAID_JUDGE; import static uk.gov.hmcts.reform.fpl.enums.YesNo.NO; import static uk.gov.hmcts.reform.fpl.utils.ElementUtils.asDynamicList; import static uk.gov.hmcts.reform.fpl.utils.ElementUtils.unwrapElements; @@ -54,6 +57,7 @@ public class ApproveDraftOrdersService { private final BlankOrderGenerator blankOrderGenerator; private final HearingOrderGenerator hearingOrderGenerator; private final OthersService othersService; + private final JudicialService judicialService; private static final String ORDER_BUNDLES_DRAFT = "hearingOrdersBundlesDrafts"; private static final String REVIEW_DECISION = "reviewDecision"; @@ -191,10 +195,8 @@ public Map reviewCMO(CaseData caseData, Element> sealedCMOs = caseData.getSealedCMOs(); sealedCMOs.add(reviewedOrder); @@ -242,9 +244,9 @@ public HearingOrder getLatestSealedCMO(CaseData caseData) { @SuppressWarnings("unchecked") public void reviewC21Orders(CaseData caseData, Map data, Element selectedOrdersBundle) { - List> draftOrders = Stream.of(selectedOrdersBundle.getValue().getOrders(), - selectedOrdersBundle.getValue().getAllConfidentialOrders()).flatMap(List::stream) - .filter(order -> !order.getValue().getType().isCmo()).collect(toList()); + List> draftOrders = selectedOrdersBundle.getValue() + .getAllOrdersAndConfidentialOrders().stream() + .filter(order -> !order.getValue().getType().isCmo()).toList(); List> ordersToBeSent = defaultIfNull(( List>) data.get(ORDERS_TO_BE_SENT), newArrayList()); @@ -253,8 +255,7 @@ public void reviewC21Orders(CaseData caseData, Map data, List> orderCollection = caseData.getOrderCollection(); for (Element orderElement : draftOrders) { - Map reviewDecisionMap = (Map) data.get(REVIEW_DECISION + counter); - ReviewDecision reviewDecision = mapper.convertValue(reviewDecisionMap, ReviewDecision.class); + ReviewDecision reviewDecision = caseData.getReviewDraftOrdersData().getReviewDecision(counter); if (reviewDecision != null && reviewDecision.getDecision() != null && !REVIEW_LATER.equals(reviewDecision.getDecision())) { @@ -265,9 +266,8 @@ public void reviewC21Orders(CaseData caseData, Map data, caseData.getOthersSelector(), NO.getValue()); reviewedOrder = hearingOrderGenerator.buildSealedHearingOrder( - reviewDecision, orderElement, selectedOthers, getOthersNotified(selectedOthers), - caseData.getSealType(), - caseData.getCourt()); + caseData, reviewDecision, orderElement, selectedOthers, getOthersNotified(selectedOthers), + SEND_TO_ALL_PARTIES.equals(reviewDecision.getDecision())); Element generatedBlankOrder = blankOrderGenerator.buildBlankOrder(caseData, selectedOrdersBundle, reviewedOrder, selectedOthers, getOthersNotified(selectedOthers)); @@ -398,4 +398,38 @@ private String getOthersNotified(List> selectedOthers) { .map(other -> other.getValue().getName()).collect(Collectors.joining(", ")) ).orElse(null); } + + public String getJudgeTitleAndNameOfCurrentUser(CaseData caseData) { + return judicialService.getJudgeTitleAndNameOfCurrentUser( + (FEE_PAID_JUDGE.equals(caseData.getAllocateJudgeEventData().getJudgeType())) + ? caseData.getAllocateJudgeEventData().getFeePaidJudgeTitle() : null); + } + + public Map previewOrderWithCoverSheet(CaseData caseData) { + final List> draftOrders = getSelectedHearingDraftOrdersBundle(caseData) + .getValue().getAllOrdersAndConfidentialOrders().stream() + .filter(order -> !order.getValue().getType().isCmo()) + .toList(); + + final ReviewDraftOrdersData reviewDraftOrdersData = caseData.getReviewDraftOrdersData(); + + Map data = new HashMap<>(); + // Filter out the orders that have been approved by Judge without amendments + int labelCounter = 1; + for (int i = 0; i < draftOrders.size(); i++) { + ReviewDecision reviewDecision = reviewDraftOrdersData.getReviewDecision(i + 1); + if (reviewDecision != null && CMOReviewOutcome.SEND_TO_ALL_PARTIES.equals(reviewDecision.getDecision())) { + Element orderElement = draftOrders.get(i); + HearingOrder approvedOrder = draftOrders.get(i).getValue(); + + data.put("previewApprovedOrder" + labelCounter, + hearingOrderGenerator.addCoverSheet(caseData, (approvedOrder.isConfidentialOrder() + ? approvedOrder.getOrderConfidential() : approvedOrder.getOrder()))); + data.put("previewApprovedOrderTitle" + labelCounter, + String.format("Order %d %s", (i + 1), approvedOrder.getTitle())); + labelCounter++; + } + } + return data; + } } diff --git a/service/src/main/java/uk/gov/hmcts/reform/fpl/service/cmo/HearingOrderGenerator.java b/service/src/main/java/uk/gov/hmcts/reform/fpl/service/cmo/HearingOrderGenerator.java index b433324696a..ac79e2e4e07 100644 --- a/service/src/main/java/uk/gov/hmcts/reform/fpl/service/cmo/HearingOrderGenerator.java +++ b/service/src/main/java/uk/gov/hmcts/reform/fpl/service/cmo/HearingOrderGenerator.java @@ -1,37 +1,44 @@ package uk.gov.hmcts.reform.fpl.service.cmo; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import uk.gov.hmcts.reform.fpl.enums.CMOStatus; -import uk.gov.hmcts.reform.fpl.model.Court; +import uk.gov.hmcts.reform.fpl.model.CaseData; import uk.gov.hmcts.reform.fpl.model.Other; import uk.gov.hmcts.reform.fpl.model.ReviewDecision; +import uk.gov.hmcts.reform.fpl.model.common.DocmosisDocument; import uk.gov.hmcts.reform.fpl.model.common.DocumentReference; import uk.gov.hmcts.reform.fpl.model.common.Element; -import uk.gov.hmcts.reform.fpl.model.document.SealType; import uk.gov.hmcts.reform.fpl.model.order.HearingOrder; import uk.gov.hmcts.reform.fpl.service.DocumentSealingService; +import uk.gov.hmcts.reform.fpl.service.UploadDocumentService; +import uk.gov.hmcts.reform.fpl.service.docmosis.DocmosisApprovedOrderCoverSheetService; import uk.gov.hmcts.reform.fpl.service.time.Time; import java.util.List; import static uk.gov.hmcts.reform.fpl.enums.CMOReviewOutcome.JUDGE_AMENDS_DRAFT; +import static uk.gov.hmcts.reform.fpl.model.common.DocumentReference.buildFromDocument; import static uk.gov.hmcts.reform.fpl.utils.ElementUtils.element; +@Slf4j @Component @RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class HearingOrderGenerator { private final DocumentSealingService documentSealingService; private final Time time; + private final DocmosisApprovedOrderCoverSheetService docmosisApprovedOrderCoverSheetService; + private final UploadDocumentService uploadDocumentService; - public Element buildSealedHearingOrder(ReviewDecision reviewDecision, + public Element buildSealedHearingOrder(CaseData caseData, + ReviewDecision reviewDecision, Element hearingOrderElement, List> selectedOthers, String othersNotified, - SealType sealType, - Court court) { + boolean addCoverSheet) { DocumentReference order; boolean isConfidentialOrder = hearingOrderElement.getValue().isConfidentialOrder(); @@ -50,9 +57,18 @@ public Element buildSealedHearingOrder(ReviewDecision reviewDecisi .others(selectedOthers) .othersNotified(othersNotified); + DocumentReference sealedOrder = documentSealingService.sealDocument(order, caseData.getCourt(), + caseData.getSealType()); + + if (addCoverSheet) { + // add a sealed cover sheet to the order + sealedOrder = documentSealingService.sealDocument(addCoverSheet(caseData, sealedOrder), + caseData.getCourt(), caseData.getSealType()); + } + builder = (isConfidentialOrder) - ? builder.orderConfidential(documentSealingService.sealDocument(order, court, sealType)) - : builder.order(documentSealingService.sealDocument(order, court, sealType)); + ? builder.orderConfidential(sealedOrder) + : builder.order(sealedOrder); return element(hearingOrderElement.getId(), builder.build()); } @@ -64,4 +80,17 @@ public Element buildRejectedHearingOrder( .requestedChanges(changesRequested) .build()); } + + public DocumentReference addCoverSheet(CaseData caseData, DocumentReference orderDoc) { + try { + DocmosisDocument orderWithCoverSheet = docmosisApprovedOrderCoverSheetService + .addCoverSheetToApprovedOrder(caseData, orderDoc); + + return buildFromDocument(uploadDocumentService + .uploadPDF(orderWithCoverSheet.getBytes(), orderDoc.getFilename())); + } catch (Exception e) { + log.error("Error adding cover sheet to order", e); + return orderDoc; + } + } } diff --git a/service/src/main/java/uk/gov/hmcts/reform/fpl/service/docmosis/DocmosisApprovedOrderCoverSheetService.java b/service/src/main/java/uk/gov/hmcts/reform/fpl/service/docmosis/DocmosisApprovedOrderCoverSheetService.java new file mode 100644 index 00000000000..5db5ebecd64 --- /dev/null +++ b/service/src/main/java/uk/gov/hmcts/reform/fpl/service/docmosis/DocmosisApprovedOrderCoverSheetService.java @@ -0,0 +1,115 @@ +package uk.gov.hmcts.reform.fpl.service.docmosis; + +import lombok.RequiredArgsConstructor; +import org.apache.pdfbox.pdmodel.PDDocument; +import org.apache.pdfbox.pdmodel.PDPage; +import org.apache.pdfbox.pdmodel.PDPageContentStream; +import org.apache.pdfbox.pdmodel.common.PDRectangle; +import org.apache.pdfbox.pdmodel.font.PDType1Font; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import uk.gov.hmcts.reform.fpl.enums.docmosis.RenderFormat; +import uk.gov.hmcts.reform.fpl.model.CaseData; +import uk.gov.hmcts.reform.fpl.model.common.DocmosisDocument; +import uk.gov.hmcts.reform.fpl.model.common.DocumentReference; +import uk.gov.hmcts.reform.fpl.model.configuration.Language; +import uk.gov.hmcts.reform.fpl.model.docmosis.DocmosisApprovedOrderCoverSheet; +import uk.gov.hmcts.reform.fpl.service.CaseDataExtractionService; +import uk.gov.hmcts.reform.fpl.service.orders.generator.DocumentMerger; +import uk.gov.hmcts.reform.fpl.service.time.Time; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.util.List; +import java.util.Optional; + +import static uk.gov.hmcts.reform.fpl.enums.DocmosisImages.CREST; +import static uk.gov.hmcts.reform.fpl.enums.DocmosisTemplates.APPROVED_ORDER_COVER; +import static uk.gov.hmcts.reform.fpl.model.configuration.Language.WELSH; +import static uk.gov.hmcts.reform.fpl.utils.DateFormatterHelper.DATE; +import static uk.gov.hmcts.reform.fpl.utils.DateFormatterHelper.formatLocalDateToString; + +@Service +@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +public class DocmosisApprovedOrderCoverSheetService { + private static final String ANNEX_A = "ANNEX A:"; + private static final String ANNEX_A_WEL = "Atodiad A:"; + + private final DocmosisDocumentGeneratorService docmosisDocumentGeneratorService; + private final CaseDataExtractionService caseDataExtractionService; + private final DocumentMerger documentMerger; + private final Time time; + + public DocmosisDocument addCoverSheetToApprovedOrder(CaseData caseData, + DocumentReference order) throws IOException { + // Create + DocmosisDocument coverSheet = createCoverSheet(caseData); + + // Add cover sheet to the order + DocmosisDocument orderWithCoverSheet = documentMerger.mergeDocuments(coverSheet, List.of(order)); + + // Add the ANNEX keyword to the second page top of the merged file + try (PDDocument document = PDDocument.load(orderWithCoverSheet.getBytes())) { + if (document.getNumberOfPages() < 2) { + throw new IllegalArgumentException("The order cover sheet must have at least 2 pages."); + } + + PDPage secondPage = document.getPage(1); // Index 1 is the second page + PDRectangle pageSize = secondPage.getMediaBox(); + try (PDPageContentStream contentStream = new PDPageContentStream(document, secondPage, + PDPageContentStream.AppendMode.APPEND, true, true)) { + + contentStream.beginText(); + contentStream.setFont(PDType1Font.TIMES_BOLD, 12); + + float textX = 50; + float textY = pageSize.getHeight() - 45; + contentStream.newLineAtOffset(textX, textY); // Adjust position + contentStream.showText(getAnnexText(caseData)); + contentStream.endText(); + + // Calculate underline position and length, font size is 12 + float textWidth = PDType1Font.TIMES_BOLD.getStringWidth(getAnnexText(caseData)) / 1000 * 12; + float underlineY = textY - 2; // Slightly below the text + + // Draw underline + contentStream.moveTo(textX, underlineY); + contentStream.lineTo(textX + textWidth, underlineY); + contentStream.setLineWidth(0.5f); // Adjust thickness + contentStream.stroke(); + } + + try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) { + document.save(outputStream); + return new DocmosisDocument(orderWithCoverSheet.getDocumentTitle(), outputStream.toByteArray()); + } + } + } + + public DocmosisDocument createCoverSheet(CaseData caseData) { + DocmosisApprovedOrderCoverSheet coverDocumentData = buildCoverDocumentsData(caseData); + return docmosisDocumentGeneratorService.generateDocmosisDocument(coverDocumentData, + APPROVED_ORDER_COVER, + RenderFormat.PDF, + getCaseLanguage(caseData)); + } + + public DocmosisApprovedOrderCoverSheet buildCoverDocumentsData(CaseData caseData) { + return DocmosisApprovedOrderCoverSheet.builder() + .familyManCaseNumber(caseData.getFamilyManCaseNumber()) + .courtName(caseDataExtractionService.getCourtName(caseData)) + .children(caseDataExtractionService.getChildrenDetails(caseData.getAllChildren())) + .judgeTitleAndName(caseData.getReviewDraftOrdersData().getJudgeTitleAndName()) + .dateOfApproval(formatLocalDateToString(time.now().toLocalDate(), DATE, getCaseLanguage(caseData))) + .crest(CREST.getValue()) + .build(); + } + + private String getAnnexText(CaseData caseData) { + return WELSH.equals(getCaseLanguage(caseData)) ? ANNEX_A_WEL : ANNEX_A; + } + + private Language getCaseLanguage(CaseData caseData) { + return Optional.ofNullable(caseData.getC110A().getLanguageRequirementApplication()).orElse(Language.ENGLISH); + } +} diff --git a/service/src/main/java/uk/gov/hmcts/reform/rd/model/JudicialUserAppointment.java b/service/src/main/java/uk/gov/hmcts/reform/rd/model/JudicialUserAppointment.java new file mode 100644 index 00000000000..52b7dab5cb6 --- /dev/null +++ b/service/src/main/java/uk/gov/hmcts/reform/rd/model/JudicialUserAppointment.java @@ -0,0 +1,62 @@ +package uk.gov.hmcts.reform.rd.model; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.extern.jackson.Jacksonized; + +import java.time.LocalDate; +import java.util.List; + +@Data +@Builder +@NoArgsConstructor +@Jacksonized +@AllArgsConstructor +public class JudicialUserAppointment { + @JsonIgnore + public static final String APPOINTMENT_TYPE_FEE_PAID = "Fee-paid"; + + private String appointment; + + @JsonProperty("appointment_id") + private String appointmentId; + + @JsonProperty("appointment_type") + private String appointmentType; + + @JsonProperty("base_location_id") + private String baseLocationId; + + @JsonProperty("cft_region") + private String cftRegion; + + @JsonProperty("cft_region_id") + private String cftRegionId; + + @JsonProperty("contract_type_id") + private String contractTypeId; + + @JsonProperty("start_date") + private LocalDate startDate; + + @JsonProperty("end_date") + private LocalDate endDate; + + @JsonProperty("epimms_id") + private String epimmsId; + + @JsonProperty("is_principal_appointment") + private String isPrincipalAppointment; + + @JsonProperty("role_name_id") + private String roleNameId; + + @JsonProperty("service_codes") + private List serviceCodes; + + private String type; +} diff --git a/service/src/main/java/uk/gov/hmcts/reform/rd/model/JudicialUserAuthorisations.java b/service/src/main/java/uk/gov/hmcts/reform/rd/model/JudicialUserAuthorisations.java new file mode 100644 index 00000000000..2881b07144c --- /dev/null +++ b/service/src/main/java/uk/gov/hmcts/reform/rd/model/JudicialUserAuthorisations.java @@ -0,0 +1,45 @@ +package uk.gov.hmcts.reform.rd.model; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.extern.jackson.Jacksonized; + +import java.time.LocalDate; +import java.util.List; + +@Data +@Builder +@NoArgsConstructor +@Jacksonized +@AllArgsConstructor +public class JudicialUserAuthorisations { + + @JsonProperty("appointment_id") + private String appointmentId; + + @JsonProperty("authorisation_id") + private String authorisationId; + + @JsonProperty("end_date") + private LocalDate endDate; + + private String jurisdiction; + + @JsonProperty("jurisdiction_id") + private String jurisdictionId; + + @JsonProperty("service_codes") + private List serviceCodes; + + @JsonProperty("start_date") + private LocalDate startDate; + + @JsonProperty("ticket_code") + private String ticketCode; + + @JsonProperty("ticket_description") + private String ticketDescription; +} diff --git a/service/src/main/java/uk/gov/hmcts/reform/rd/model/JudicialUserProfile.java b/service/src/main/java/uk/gov/hmcts/reform/rd/model/JudicialUserProfile.java index bab02d16bd2..b5a4252614a 100644 --- a/service/src/main/java/uk/gov/hmcts/reform/rd/model/JudicialUserProfile.java +++ b/service/src/main/java/uk/gov/hmcts/reform/rd/model/JudicialUserProfile.java @@ -77,6 +77,10 @@ public class JudicialUserProfile { private String personalCode; + private List appointments; + + private List authorisations; + public String getTitle() { if (isEmpty(this.title) || this.title.equalsIgnoreCase("Unknown")) { // if no title from JRD - pattern match it from the known list of titles in JRD full name fields diff --git a/service/src/main/java/uk/gov/hmcts/reform/rd/model/JudicialUserRequest.java b/service/src/main/java/uk/gov/hmcts/reform/rd/model/JudicialUserRequest.java index 466e84d8d0c..d7d6e63a364 100644 --- a/service/src/main/java/uk/gov/hmcts/reform/rd/model/JudicialUserRequest.java +++ b/service/src/main/java/uk/gov/hmcts/reform/rd/model/JudicialUserRequest.java @@ -22,6 +22,9 @@ public class JudicialUserRequest { @JsonProperty("ccdServiceName") private String ccdServiceName; + @JsonProperty("sidam_ids") + private List idamId; + public static JudicialUserRequest fromPersonalCode(String personalCode) { return JudicialUserRequest.builder() .personalCode(List.of(personalCode)) diff --git a/service/src/test/java/uk/gov/hmcts/reform/fpl/service/JudicialServiceTest.java b/service/src/test/java/uk/gov/hmcts/reform/fpl/service/JudicialServiceTest.java index ed330b0edb9..d823bd317e3 100644 --- a/service/src/test/java/uk/gov/hmcts/reform/fpl/service/JudicialServiceTest.java +++ b/service/src/test/java/uk/gov/hmcts/reform/fpl/service/JudicialServiceTest.java @@ -25,10 +25,15 @@ import uk.gov.hmcts.reform.fpl.model.Judge; import uk.gov.hmcts.reform.fpl.model.JudicialUser; import uk.gov.hmcts.reform.fpl.model.common.JudgeAndLegalAdvisor; +import uk.gov.hmcts.reform.fpl.service.time.Time; +import uk.gov.hmcts.reform.idam.client.models.UserDetails; import uk.gov.hmcts.reform.rd.client.JudicialApi; +import uk.gov.hmcts.reform.rd.model.JudicialUserAppointment; +import uk.gov.hmcts.reform.rd.model.JudicialUserAuthorisations; import uk.gov.hmcts.reform.rd.model.JudicialUserProfile; import uk.gov.hmcts.reform.rd.model.JudicialUserRequest; +import java.time.LocalDate; import java.time.LocalDateTime; import java.time.ZonedDateTime; import java.util.List; @@ -50,8 +55,13 @@ import static org.mockito.Mockito.when; import static org.mockito.quality.Strictness.LENIENT; import static uk.gov.hmcts.reform.fpl.config.TimeConfiguration.LONDON_TIMEZONE; +import static uk.gov.hmcts.reform.fpl.config.rd.LegalAdviserUsersConfiguration.SERVICE_CODE; +import static uk.gov.hmcts.reform.fpl.enums.JudgeCaseRole.ALLOCATED_JUDGE; import static uk.gov.hmcts.reform.fpl.enums.JudgeType.LEGAL_ADVISOR; +import static uk.gov.hmcts.reform.fpl.enums.LegalAdviserRole.ALLOCATED_LEGAL_ADVISER; import static uk.gov.hmcts.reform.fpl.utils.ElementUtils.wrapElements; +import static uk.gov.hmcts.reform.fpl.utils.JudgeAndLegalAdvisorHelper.formatJudgeTitleAndName; +import static uk.gov.hmcts.reform.rd.model.JudicialUserAppointment.APPOINTMENT_TYPE_FEE_PAID; @ExtendWith(MockitoExtension.class) @MockitoSettings(strictness = LENIENT) @@ -84,6 +94,12 @@ class JudicialServiceTest { @Mock private ElinksService elinksService; + @Mock + private UserService userService; + + @Mock + private Time time; + @Captor private ArgumentCaptor> rolesCaptor; @@ -287,6 +303,93 @@ void shouldRemoveAndRecreateExistingHearingJudges() { verifyNoMoreInteractions(roleAssignmentService); } + + @Test + void shouldAssignAllocatedJudgeIfLegalAdvisor() { + List existing = Stream.of("12345", "67890") + .map(id -> RoleAssignment.builder() + .actorId(id) + .id(id) + .roleName("allocated-judge") + .roleCategory(RoleCategory.JUDICIAL) + .build()) + .toList(); + + when(roleAssignmentService.getCaseRolesAtTime(any(), any(), any())) + .thenReturn(existing); + + underTest.assignAllocatedJudge(12345L, "mock-userId", true); + + verify(roleAssignmentService).getCaseRolesAtTime(any(), any(), any()); + verify(roleAssignmentService, times(2)).deleteRoleAssignment(roleAssignmentCaptor.capture()); + + assertThat(roleAssignmentCaptor.getAllValues()) + .extracting("id") + .containsExactlyInAnyOrder("12345", "67890"); + + verify(roleAssignmentService) + .assignLegalAdvisersRole(eq(12345L), eq(List.of("mock-userId")), eq(ALLOCATED_LEGAL_ADVISER), + any(), eq(null)); + + verifyNoMoreInteractions(roleAssignmentService); + } + + @Test + void shouldAssignAllocatedJudgeIfNotLegalAdvisor() { + List existing = Stream.of("12345", "67890") + .map(id -> RoleAssignment.builder() + .actorId(id) + .id(id) + .roleName("allocated-judge") + .roleCategory(RoleCategory.JUDICIAL) + .build()) + .toList(); + + when(roleAssignmentService.getCaseRolesAtTime(any(), any(), any())) + .thenReturn(existing); + + underTest.assignAllocatedJudge(12345L, "mock-userId", false); + + verify(roleAssignmentService).getCaseRolesAtTime(any(), any(), any()); + verify(roleAssignmentService, times(2)).deleteRoleAssignment(roleAssignmentCaptor.capture()); + + assertThat(roleAssignmentCaptor.getAllValues()) + .extracting("id") + .containsExactlyInAnyOrder("12345", "67890"); + + verify(roleAssignmentService) + .assignJudgesRole(eq(12345L), eq(List.of("mock-userId")), eq(ALLOCATED_JUDGE), + any(), eq(null)); + + verifyNoMoreInteractions(roleAssignmentService); + } + } + + @Nested + class GetJudge { + @Test + void shouldGetJudicialUserProfilesByPersonalCode() { + final String personalCode = "12345"; + JudicialUserProfile jup = mock(JudicialUserProfile.class); + when(judicialApi.findUsers(any(), any(), anyInt(), any(), + eq(JudicialUserRequest.fromPersonalCode(personalCode)))) + .thenReturn(List.of(jup)); + + assertThat(underTest.getJudge(personalCode)).isEqualTo(Optional.of(jup)); + } + + @Test + void shouldReturnEmptyIfJudicialUserProfileNotFound() { + final String personalCode = "12345"; + when(judicialApi.findUsers(any(), any(), anyInt(), any(), any())).thenReturn(List.of()); + assertThat(underTest.getJudge(personalCode)).isEqualTo(Optional.empty()); + } + + @Test + void shouldReturnEmptyIfPersonalCodeIsEmpty() { + assertThat(underTest.getJudge(null)).isEqualTo(Optional.empty()); + assertThat(underTest.getJudge("")).isEqualTo(Optional.empty()); + } } @Test @@ -369,6 +472,12 @@ void shouldCheckJudgeDoesntExistWhenNotPresentInJrd() { assertThat(exists).isFalse(); } + @Test + void shouldReturnFalseIfPersonalCodeIsEmpty() { + assertThat(underTest.checkJudgeExists("")).isFalse(); + assertThat(underTest.checkJudgeExists(null)).isFalse(); + } + @Test void shouldGetAllocatedJudgeDetailsOffCase() { CaseData caseData = CaseData.builder() @@ -731,4 +840,166 @@ void shouldReturnEmptyMapIfJudgeNotExist() { } } + @Nested + class GetJudgeTitleAndName { + private static final JudicialUserProfile JUDICIAL_USER_PROFILE = JudicialUserProfile.builder() + .title("Judge") + .fullName("John Smith") + .build(); + + @Test + void shouldReturnJudgeTitleAndNameFromJRD() { + when(userService.getUserDetails()).thenReturn(UserDetails.builder().id("testId").build()); + when(judicialApi + .findUsers(any(), any(), anyInt(), any(), + eq(JudicialUserRequest.builder().idamId(List.of("testId")).build()))) + .thenReturn(List.of(JUDICIAL_USER_PROFILE)); + + assertThat(underTest.getJudgeTitleAndNameOfCurrentUser(null)) + .isEqualTo(formatJudgeTitleAndName(JudgeAndLegalAdvisor + .fromJudicialUserProfile(JUDICIAL_USER_PROFILE, null))); + } + + @Test + void shouldReturnIdamUserFullNameIfJRDNotFound() { + when(userService.getUserDetails()).thenReturn(UserDetails.builder() + .id("testId") + .forename("John") + .surname("Smith") + .build()); + when(judicialApi.findUsers(any(), any(), anyInt(), any(), any())).thenReturn(List.of()); + + assertThat(underTest.getJudgeTitleAndNameOfCurrentUser(null)).isEqualTo("John Smith"); + } + } + + @Nested + class IsFeePaidJudge { + @Test + void returnsTrueWhenCurrentUserHasActiveFeePaidAppointment() { + final LocalDateTime today = LocalDateTime.now(); + when(time.now()).thenReturn(today); + + final LocalDate starDate = today.toLocalDate().minusDays(1); + final LocalDate endDate = today.toLocalDate().plusDays(1); + + UserDetails userDetails = UserDetails.builder().id("idamId").build(); + when(userService.getUserDetails()).thenReturn(userDetails); + + JudicialUserProfile profile = JudicialUserProfile.builder() + .appointments(List.of( + JudicialUserAppointment.builder() + .appointmentId("feePaidAppointmentId") + .appointmentType(APPOINTMENT_TYPE_FEE_PAID) + .startDate(starDate) + .endDate(endDate) + .build(), + JudicialUserAppointment.builder() + .appointmentId("otherAppointmentId") + .appointmentType("Other Appointment Type") + .startDate(starDate) + .endDate(endDate) + .build())) + .authorisations(List.of( + JudicialUserAuthorisations.builder() + .appointmentId("feePaidAppointmentId") + .serviceCodes(List.of(SERVICE_CODE)) + .startDate(starDate) + .endDate(endDate) + .build() + )) + .build(); + when(underTest.getJudicialUserProfilesByIdamId("idamId")).thenReturn(List.of(profile)); + + assertThat(underTest.isCurrentUserFeePaidJudge()).isTrue(); + } + + @Test + void returnsFalseWhenNoFeePaidAppointment() { + final LocalDateTime today = LocalDateTime.now(); + when(time.now()).thenReturn(today); + + final LocalDate starDate = today.toLocalDate().minusDays(1); + final LocalDate endDate = today.toLocalDate().plusDays(1); + + UserDetails userDetails = UserDetails.builder().id("idamId").build(); + when(userService.getUserDetails()).thenReturn(userDetails); + + JudicialUserProfile profile = JudicialUserProfile.builder() + .appointments(List.of( + JudicialUserAppointment.builder() + .appointmentId("otherAppointmentId") + .appointmentType("Other Appointment Type") + .startDate(starDate) + .endDate(endDate) + .build())) + .authorisations(List.of( + JudicialUserAuthorisations.builder() + .appointmentId("otherAppointmentId") + .serviceCodes(List.of(SERVICE_CODE)) + .startDate(starDate) + .endDate(endDate) + .build() + )) + .build(); + when(underTest.getJudicialUserProfilesByIdamId("idamId")).thenReturn(List.of(profile)); + + assertThat(underTest.isCurrentUserFeePaidJudge()).isFalse(); + } + + @Test + void returnsFalseWhenFeePaidAppointmentExpiredOrNotAppointedToFPL() { + final LocalDateTime today = LocalDateTime.now(); + when(time.now()).thenReturn(today); + + final LocalDate starDate = today.toLocalDate().minusDays(1); + final LocalDate endDate = today.toLocalDate().plusDays(1); + + UserDetails userDetails = UserDetails.builder().id("idamId").build(); + when(userService.getUserDetails()).thenReturn(userDetails); + + JudicialUserProfile profile = JudicialUserProfile.builder() + .appointments(List.of( + JudicialUserAppointment.builder() + .appointmentId("feePaidAppointmentId_expired") + .appointmentType(APPOINTMENT_TYPE_FEE_PAID) + .startDate(starDate.minusDays(10)) + .endDate(endDate.minusDays(10)) + .build(), + JudicialUserAppointment.builder() + .appointmentId("feePaidAppointmentId_otherService") + .appointmentType(APPOINTMENT_TYPE_FEE_PAID) + .startDate(starDate) + .endDate(endDate) + .build())) + .authorisations(List.of( + JudicialUserAuthorisations.builder() + .appointmentId("feePaidAppointmentId_expired") + .serviceCodes(List.of(SERVICE_CODE)) + .startDate(starDate) + .endDate(endDate) + .build(), + JudicialUserAuthorisations.builder() + .appointmentId("feePaidAppointmentId_otherService") + .serviceCodes(List.of("Other_service")) + .startDate(starDate) + .endDate(endDate) + .build() + )) + .build(); + when(underTest.getJudicialUserProfilesByIdamId("idamId")).thenReturn(List.of(profile)); + + assertThat(underTest.isCurrentUserFeePaidJudge()).isFalse(); + } + + @Test + void returnsFalseWhenNoJudicialUserProfilesFound() { + UserDetails userDetails = UserDetails.builder().id("idamId").build(); + + when(userService.getUserDetails()).thenReturn(userDetails); + when(underTest.getJudicialUserProfilesByIdamId("idamId")).thenReturn(List.of()); + + assertThat(underTest.isCurrentUserFeePaidJudge()).isFalse(); + } + } } diff --git a/service/src/test/java/uk/gov/hmcts/reform/fpl/service/cmo/ApproveDraftOrdersServiceTest.java b/service/src/test/java/uk/gov/hmcts/reform/fpl/service/cmo/ApproveDraftOrdersServiceTest.java index ae074ae454b..8052380c8ef 100644 --- a/service/src/test/java/uk/gov/hmcts/reform/fpl/service/cmo/ApproveDraftOrdersServiceTest.java +++ b/service/src/test/java/uk/gov/hmcts/reform/fpl/service/cmo/ApproveDraftOrdersServiceTest.java @@ -30,12 +30,12 @@ import uk.gov.hmcts.reform.fpl.model.common.Element; import uk.gov.hmcts.reform.fpl.model.common.dynamic.DynamicList; import uk.gov.hmcts.reform.fpl.model.common.dynamic.DynamicListElement; -import uk.gov.hmcts.reform.fpl.model.document.SealType; import uk.gov.hmcts.reform.fpl.model.event.ReviewDraftOrdersData; import uk.gov.hmcts.reform.fpl.model.order.HearingOrder; import uk.gov.hmcts.reform.fpl.model.order.HearingOrdersBundle; import uk.gov.hmcts.reform.fpl.model.order.HearingOrdersBundles; import uk.gov.hmcts.reform.fpl.model.order.generated.GeneratedOrder; +import uk.gov.hmcts.reform.fpl.service.JudicialService; import uk.gov.hmcts.reform.fpl.service.OthersService; import uk.gov.hmcts.reform.fpl.service.time.Time; import uk.gov.hmcts.reform.fpl.utils.ElementUtils; @@ -124,6 +124,9 @@ class ApproveDraftOrdersServiceTest { @Mock private OthersService othersService; + @Mock + private JudicialService judicialService; + @InjectMocks private ApproveDraftOrdersService underTest; @@ -137,7 +140,8 @@ void setUp() { draftOrdersBundleHearingSelector, blankOrderGenerator, hearingOrderGenerator, - othersService + othersService, + judicialService ); } @@ -433,8 +437,8 @@ void shouldReturnCMOToSealAndSetCaseStateWhenJudgeApprovesCMOAndServingOthersIsE .draftCmos(emptyList()) .build() ); - given(hearingOrderGenerator.buildSealedHearingOrder(reviewDecision, agreedCMO, others, othersNotified, - SealType.ENGLISH, caseData.getCourt())) + given(hearingOrderGenerator.buildSealedHearingOrder(caseData, reviewDecision, agreedCMO, others, + othersNotified, false)) .willReturn(element(agreedCMO.getId(), expectedCmo)); Map actualData = underTest.reviewCMO(caseData, ordersBundleElement); @@ -518,7 +522,6 @@ void shouldSealTheDraftOrderAndCreateBlankOrderWhenJudgeApproves() { ReviewDecision reviewDecision = ReviewDecision.builder().decision(SEND_TO_ALL_PARTIES).build(); Map data = new HashMap<>(); - data.put("reviewDecision1", Map.of("decision", reviewDecision)); CaseData caseData = CaseData.builder() .court(Court.builder() @@ -529,18 +532,17 @@ void shouldSealTheDraftOrderAndCreateBlankOrderWhenJudgeApproves() { .hearingOrdersBundlesDrafts(newArrayList(ordersBundleElement)) .reviewCMODecision(reviewDecision) .orderCollection(newArrayList()) + .reviewDraftOrdersData(ReviewDraftOrdersData.builder().reviewDecision1(reviewDecision).build()) .build(); - given(mapper.convertValue(anyMap(), eq(ReviewDecision.class))).willReturn(reviewDecision); - Element expectedSealedOrder = element( draftOrder1.getId(), draftOrder1.getValue().toBuilder().status(APPROVED).build()); Element expectedBlankOrder = element(UUID.randomUUID(), GeneratedOrder.builder().type(String.valueOf(C21)).build()); - given(hearingOrderGenerator.buildSealedHearingOrder(reviewDecision, draftOrder1, emptyList(), "", - SealType.ENGLISH, caseData.getCourt())) + given(hearingOrderGenerator.buildSealedHearingOrder(caseData, reviewDecision, draftOrder1, emptyList(), "", + true)) .willReturn(expectedSealedOrder); given(blankOrderGenerator.buildBlankOrder( caseData, ordersBundleElement, expectedSealedOrder, emptyList(), "")) @@ -567,7 +569,6 @@ void shouldNotCreateBlankOrderWhenJudgeRequestsChanges() { .changesRequestedByJudge("some change").build(); Map data = new HashMap<>(); - data.put("reviewDecision1", Map.of("decision", JUDGE_REQUESTED_CHANGES)); CaseData caseData = CaseData.builder() .state(State.CASE_MANAGEMENT) @@ -577,8 +578,6 @@ void shouldNotCreateBlankOrderWhenJudgeRequestsChanges() { .orderCollection(newArrayList()) .build(); - given(mapper.convertValue(anyMap(), eq(ReviewDecision.class))).willReturn(reviewDecision); - Element rejectedOrderToReturn = element(draftOrder1.getId(), draftOrder1.getValue().toBuilder().status(RETURNED).requestedChanges("some change").build()); @@ -661,8 +660,8 @@ void shouldThrowAnExceptionWhenNoUpcomingHearingsAreAvailable() { .hearingDetails(emptyList()) .build(); - given(hearingOrderGenerator.buildSealedHearingOrder(any(), eq(agreedCMO), eq(emptyList()), eq(""), - eq(SealType.ENGLISH), eq(caseData.getCourt()))) + given(hearingOrderGenerator.buildSealedHearingOrder(eq(caseData), any(), eq(agreedCMO), eq(emptyList()), + eq(""), eq(false))) .willReturn(element(agreedCMO.getId(), agreedCMO.getValue().toBuilder().status(APPROVED).build())); IllegalArgumentException exception = assertThrows(IllegalArgumentException.class, @@ -740,7 +739,6 @@ void shouldSealTheConfidentialDraftOrderAndCreateBlankOrderWhenJudgeApproves() { ReviewDecision reviewDecision = ReviewDecision.builder().decision(SEND_TO_ALL_PARTIES).build(); Map data = new HashMap<>(); - data.put("reviewDecision1", Map.of("decision", reviewDecision)); CaseData caseData = CaseData.builder() .court(Court.builder() @@ -749,20 +747,18 @@ void shouldSealTheConfidentialDraftOrderAndCreateBlankOrderWhenJudgeApproves() { .state(State.CASE_MANAGEMENT) .draftUploadedCMOs(newArrayList(draftOrder1)) .hearingOrdersBundlesDrafts(newArrayList(ordersBundleElement)) - .reviewCMODecision(reviewDecision) + .reviewDraftOrdersData(ReviewDraftOrdersData.builder().reviewDecision1(reviewDecision).build()) .orderCollection(newArrayList()) .build(); - given(mapper.convertValue(anyMap(), eq(ReviewDecision.class))).willReturn(reviewDecision); - Element expectedSealedOrder = element( draftOrder1.getId(), draftOrder1.getValue().toBuilder().status(APPROVED).build()); Element expectedBlankOrder = element(UUID.randomUUID(), GeneratedOrder.builder().type(String.valueOf(C21)).build()); - given(hearingOrderGenerator.buildSealedHearingOrder(reviewDecision, draftOrder1, emptyList(), "", - SealType.ENGLISH, caseData.getCourt())) + given(hearingOrderGenerator.buildSealedHearingOrder(caseData, reviewDecision, draftOrder1, emptyList(), + "", true)) .willReturn(expectedSealedOrder); given(blankOrderGenerator.buildBlankOrder( caseData, ordersBundleElement, expectedSealedOrder, emptyList(), "")) @@ -790,7 +786,6 @@ void shouldNotCreateBlankOrderWhenJudgeRequestsChangesOnConfidentialOrder() { .changesRequestedByJudge("some change").build(); Map data = new HashMap<>(); - data.put("reviewDecision1", Map.of("decision", JUDGE_REQUESTED_CHANGES)); CaseData caseData = CaseData.builder() .state(State.CASE_MANAGEMENT) @@ -800,8 +795,6 @@ void shouldNotCreateBlankOrderWhenJudgeRequestsChangesOnConfidentialOrder() { .orderCollection(newArrayList()) .build(); - given(mapper.convertValue(anyMap(), eq(ReviewDecision.class))).willReturn(reviewDecision); - Element rejectedOrderToReturn = element(draftOrder1.getId(), draftOrder1.getValue().toBuilder().status(RETURNED).requestedChanges("some change").build()); diff --git a/service/src/test/java/uk/gov/hmcts/reform/fpl/service/cmo/HearingOrderGeneratorTest.java b/service/src/test/java/uk/gov/hmcts/reform/fpl/service/cmo/HearingOrderGeneratorTest.java index 2d235c81edb..2174392dfe0 100644 --- a/service/src/test/java/uk/gov/hmcts/reform/fpl/service/cmo/HearingOrderGeneratorTest.java +++ b/service/src/test/java/uk/gov/hmcts/reform/fpl/service/cmo/HearingOrderGeneratorTest.java @@ -6,26 +6,35 @@ import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; +import uk.gov.hmcts.reform.ccd.document.am.model.Document; import uk.gov.hmcts.reform.fpl.enums.CMOStatus; +import uk.gov.hmcts.reform.fpl.model.CaseData; import uk.gov.hmcts.reform.fpl.model.Court; import uk.gov.hmcts.reform.fpl.model.Other; import uk.gov.hmcts.reform.fpl.model.ReviewDecision; +import uk.gov.hmcts.reform.fpl.model.common.DocmosisDocument; import uk.gov.hmcts.reform.fpl.model.common.DocumentReference; import uk.gov.hmcts.reform.fpl.model.common.Element; import uk.gov.hmcts.reform.fpl.model.document.SealType; import uk.gov.hmcts.reform.fpl.model.order.HearingOrder; import uk.gov.hmcts.reform.fpl.service.DocumentSealingService; +import uk.gov.hmcts.reform.fpl.service.UploadDocumentService; +import uk.gov.hmcts.reform.fpl.service.docmosis.DocmosisApprovedOrderCoverSheetService; import uk.gov.hmcts.reform.fpl.service.time.Time; import uk.gov.hmcts.reform.fpl.utils.FixedTimeConfiguration; +import java.io.IOException; import java.util.List; import java.util.UUID; import static org.assertj.core.api.AssertionsForClassTypes.assertThat; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.when; import static uk.gov.hmcts.reform.fpl.enums.CMOReviewOutcome.JUDGE_AMENDS_DRAFT; import static uk.gov.hmcts.reform.fpl.enums.CMOReviewOutcome.SEND_TO_ALL_PARTIES; import static uk.gov.hmcts.reform.fpl.utils.ElementUtils.element; +import static uk.gov.hmcts.reform.fpl.utils.TestDataHelper.testDocument; import static uk.gov.hmcts.reform.fpl.utils.TestDataHelper.testDocumentReference; @ExtendWith(MockitoExtension.class) @@ -33,6 +42,14 @@ class HearingOrderGeneratorTest { private static final DocumentReference order = testDocumentReference(); private static final DocumentReference sealedOrder = testDocumentReference(); + private static final byte[] ORDER_WITH_COVER_SHEET_BYTES = new byte[]{1,2,3}; + private static final DocmosisDocument DOCMOSIS_DOCUMENT_ORDER_WITH_COVER_SHEET = DocmosisDocument.builder() + .bytes(ORDER_WITH_COVER_SHEET_BYTES) + .build(); + private static final Document ORDER_WITH_COVER_SHEET_DOCUMENT = testDocument(); + private static final DocumentReference ORDER_WITH_COVER_SHEET = DocumentReference + .buildFromDocument(ORDER_WITH_COVER_SHEET_DOCUMENT); + private static final DocumentReference ORDER_WITH_SEALED_COVERSHEET = testDocumentReference(); private static final DocumentReference amendedOrder = testDocumentReference(); private static final Time time = new FixedTimeConfiguration().stoppedTime(); @@ -41,57 +58,118 @@ class HearingOrderGeneratorTest { @Mock private DocumentSealingService documentSealingService; + @Mock + private DocmosisApprovedOrderCoverSheetService docmosisApprovedOrderCoverSheetService; + @Mock + private UploadDocumentService uploadDocumentService; @InjectMocks private HearingOrderGenerator underTest; @BeforeEach void setUp() { - underTest = new HearingOrderGenerator(documentSealingService, time); + underTest = new HearingOrderGenerator(documentSealingService, time, docmosisApprovedOrderCoverSheetService, + uploadDocumentService); } @Test - void shouldBuildSealedHearingOrderWhenReviewDecisionIsApproved() { + void shouldBuildSealedHearingOrderWhenReviewDecisionIsApproved() throws IOException { HearingOrder hearingOrder = HearingOrder.builder().hearing("hearing1").order(order).build(); String othersNotified = "John Smith"; List> selectedOthers = List.of(element(Other.builder().name(othersNotified).build())); Court court = Court.builder().build(); + ReviewDecision reviewDecision = ReviewDecision.builder().decision(SEND_TO_ALL_PARTIES).build(); + + CaseData caseData = CaseData.builder() + .court(court) + .reviewCMODecision(reviewDecision) + .build(); + when(documentSealingService.sealDocument(order, court, SealType.ENGLISH)).thenReturn(sealedOrder); + when(docmosisApprovedOrderCoverSheetService.addCoverSheetToApprovedOrder(caseData, sealedOrder)) + .thenReturn(DOCMOSIS_DOCUMENT_ORDER_WITH_COVER_SHEET); + when(uploadDocumentService.uploadPDF(eq(ORDER_WITH_COVER_SHEET_BYTES), any())) + .thenReturn(ORDER_WITH_COVER_SHEET_DOCUMENT); + when(documentSealingService.sealDocument(ORDER_WITH_COVER_SHEET, court, SealType.ENGLISH)) + .thenReturn(ORDER_WITH_SEALED_COVERSHEET); Element expectedOrder = element(ORDER_ID, hearingOrder.toBuilder() .dateIssued(time.now().toLocalDate()).status(CMOStatus.APPROVED) .othersNotified(othersNotified) .others(selectedOthers) - .order(sealedOrder).lastUploadedOrder(order).build()); + .order(ORDER_WITH_SEALED_COVERSHEET).lastUploadedOrder(order).build()); Element actual = underTest.buildSealedHearingOrder( - ReviewDecision.builder().decision(SEND_TO_ALL_PARTIES).build(), + caseData, + reviewDecision, element(ORDER_ID, hearingOrder), selectedOthers, othersNotified, - SealType.ENGLISH, - court); + true); assertThat(actual).isEqualTo(expectedOrder); } @Test - void shouldBuildSealedHearingOrderWhenJudgeAmendsTheDocument() { + void shouldBuildSealedHearingOrderWhenJudgeAmendsTheDocument() throws IOException { HearingOrder hearingOrder = HearingOrder.builder().hearing("hearing1").order(order).build(); Court court = Court.builder().build(); + ReviewDecision reviewDecision = ReviewDecision.builder().decision(SEND_TO_ALL_PARTIES).build(); + + CaseData caseData = CaseData.builder() + .court(court) + .reviewCMODecision(reviewDecision) + .build(); when(documentSealingService.sealDocument(amendedOrder, court, SealType.ENGLISH)).thenReturn(sealedOrder); + when(docmosisApprovedOrderCoverSheetService.addCoverSheetToApprovedOrder(caseData, sealedOrder)) + .thenReturn(DOCMOSIS_DOCUMENT_ORDER_WITH_COVER_SHEET); + when(uploadDocumentService.uploadPDF(eq(ORDER_WITH_COVER_SHEET_BYTES), any())) + .thenReturn(ORDER_WITH_COVER_SHEET_DOCUMENT); + when(documentSealingService.sealDocument(ORDER_WITH_COVER_SHEET, court, SealType.ENGLISH)) + .thenReturn(ORDER_WITH_SEALED_COVERSHEET); Element expectedOrder = element(ORDER_ID, hearingOrder.toBuilder() .dateIssued(time.now().toLocalDate()).status(CMOStatus.APPROVED) .others(List.of()).othersNotified("") - .order(sealedOrder).lastUploadedOrder(amendedOrder).build()); + .order(ORDER_WITH_SEALED_COVERSHEET).lastUploadedOrder(amendedOrder).build()); Element actual = underTest.buildSealedHearingOrder( + caseData, ReviewDecision.builder().decision(JUDGE_AMENDS_DRAFT).judgeAmendedDocument(amendedOrder).build(), element(ORDER_ID, hearingOrder), - List.of(), "", - SealType.ENGLISH, - court); + List.of(), "", true); + + assertThat(actual).isEqualTo(expectedOrder); + } + + @Test + void shouldBuildSealedHearingOrderWithoutCoverSheetIfNotRequired() { + HearingOrder hearingOrder = HearingOrder.builder().hearing("hearing1").order(order).build(); + String othersNotified = "John Smith"; + List> selectedOthers = List.of(element(Other.builder().name(othersNotified).build())); + Court court = Court.builder().build(); + ReviewDecision reviewDecision = ReviewDecision.builder().decision(SEND_TO_ALL_PARTIES).build(); + + CaseData caseData = CaseData.builder() + .court(court) + .reviewCMODecision(reviewDecision) + .build(); + + when(documentSealingService.sealDocument(order, court, SealType.ENGLISH)).thenReturn(sealedOrder); + + Element expectedOrder = element(ORDER_ID, hearingOrder.toBuilder() + .dateIssued(time.now().toLocalDate()).status(CMOStatus.APPROVED) + .othersNotified(othersNotified) + .others(selectedOthers) + .order(sealedOrder).lastUploadedOrder(order).build()); + + Element actual = underTest.buildSealedHearingOrder( + caseData, + reviewDecision, + element(ORDER_ID, hearingOrder), + selectedOthers, + othersNotified, + false); assertThat(actual).isEqualTo(expectedOrder); } diff --git a/service/src/test/java/uk/gov/hmcts/reform/fpl/service/docmosis/DocmosisApprovedOrderCoverSheetServiceTest.java b/service/src/test/java/uk/gov/hmcts/reform/fpl/service/docmosis/DocmosisApprovedOrderCoverSheetServiceTest.java new file mode 100644 index 00000000000..07e32859e7a --- /dev/null +++ b/service/src/test/java/uk/gov/hmcts/reform/fpl/service/docmosis/DocmosisApprovedOrderCoverSheetServiceTest.java @@ -0,0 +1,180 @@ +package uk.gov.hmcts.reform.fpl.service.docmosis; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; +import uk.gov.hmcts.reform.fpl.docmosis.DocmosisHelper; +import uk.gov.hmcts.reform.fpl.enums.C2ApplicationType; +import uk.gov.hmcts.reform.fpl.enums.docmosis.RenderFormat; +import uk.gov.hmcts.reform.fpl.model.CaseData; +import uk.gov.hmcts.reform.fpl.model.Child; +import uk.gov.hmcts.reform.fpl.model.ChildParty; +import uk.gov.hmcts.reform.fpl.model.Court; +import uk.gov.hmcts.reform.fpl.model.common.AdditionalApplicationsBundle; +import uk.gov.hmcts.reform.fpl.model.common.C2DocumentBundle; +import uk.gov.hmcts.reform.fpl.model.common.DocmosisDocument; +import uk.gov.hmcts.reform.fpl.model.common.Element; +import uk.gov.hmcts.reform.fpl.model.configuration.Language; +import uk.gov.hmcts.reform.fpl.model.docmosis.DocmosisApprovedOrderCoverSheet; +import uk.gov.hmcts.reform.fpl.model.docmosis.DocmosisChild; +import uk.gov.hmcts.reform.fpl.model.event.ReviewDraftOrdersData; +import uk.gov.hmcts.reform.fpl.model.group.C110A; +import uk.gov.hmcts.reform.fpl.model.order.DraftOrder; +import uk.gov.hmcts.reform.fpl.model.order.HearingOrder; +import uk.gov.hmcts.reform.fpl.service.CaseDataExtractionService; +import uk.gov.hmcts.reform.fpl.service.orders.generator.DocumentMerger; +import uk.gov.hmcts.reform.fpl.service.time.Time; +import uk.gov.hmcts.reform.fpl.utils.ResourceReader; + +import java.io.IOException; +import java.time.LocalDateTime; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.BDDMockito.given; +import static uk.gov.hmcts.reform.fpl.enums.DocmosisImages.CREST; +import static uk.gov.hmcts.reform.fpl.enums.DocmosisTemplates.APPROVED_ORDER_COVER; +import static uk.gov.hmcts.reform.fpl.utils.DateFormatterHelper.DATE; +import static uk.gov.hmcts.reform.fpl.utils.DateFormatterHelper.formatLocalDateToString; +import static uk.gov.hmcts.reform.fpl.utils.ElementUtils.element; +import static uk.gov.hmcts.reform.fpl.utils.TestDataHelper.testDocumentReference; + +@ExtendWith(MockitoExtension.class) +class DocmosisApprovedOrderCoverSheetServiceTest { + private static final LocalDateTime TEST_TIME = LocalDateTime.of(2025,3,26,8,0,0,0); + private static final String FAMILY_MAN_NUMBER = "FMN-001"; + private static final Long CASE_ID = 1L; + private static final Language LANGUAGE = Language.ENGLISH; + private static final Court COURT = Court.builder().code("999").build(); + private static final byte[] PDF_BYTES = {10, 20, 30, 40, 50}; + private static final String FILE_NAME = "approved-order-cover.pdf"; + private static final Element CHILD = element(Child.builder().party(ChildParty.builder() + .firstName("Test").lastName("Child").build()).build()); + private static final Element CONFIDENTIAL_CHILD = element(Child.builder().party(ChildParty.builder() + .firstName("Confidential").lastName("Child").build()).build()); + private static final List DOCMOSIS_CHILDREN = List.of( + DocmosisChild.builder().name("Test Child").build(), + DocmosisChild.builder().name("Confidential Child").build() + ); + private static final DocmosisDocument COVER_SHEET = new DocmosisDocument(FILE_NAME, PDF_BYTES); + private static final String COURT_NAME = "Test Court"; + private static final String JUDGE_NAME = "Test Judge"; + + private static final Element DRAFT_ORDER = + element(DraftOrder.builder().document(testDocumentReference()).build()); + private static final Element C2_BUNDLE = + element(AdditionalApplicationsBundle.builder() + .c2DocumentBundle(C2DocumentBundle.builder() + .type(C2ApplicationType.WITH_NOTICE) + .draftOrdersBundle(List.of(DRAFT_ORDER)).build()) + .build()); + private static final Element HEARING_ORDER = + element(DRAFT_ORDER.getId(), HearingOrder.from(DRAFT_ORDER.getValue())); + + private static final Element DRAFT_ORDER_WITH_CONSENT = + element(DraftOrder.builder().document(testDocumentReference()).build()); + private static final Element C2_BUNDLE_WITH_CONSENT = + element(AdditionalApplicationsBundle.builder() + .c2DocumentBundle(C2DocumentBundle.builder() + .type(C2ApplicationType.WITHOUT_NOTICE) + .draftOrdersBundle(List.of(DRAFT_ORDER_WITH_CONSENT)).build()) + .build()); + private static final Element HEARING_ORDER_WITH_CONSENT = + element(DRAFT_ORDER_WITH_CONSENT.getId(), HearingOrder.from(DRAFT_ORDER_WITH_CONSENT.getValue())); + + + @Mock + private DocmosisDocumentGeneratorService docmosisDocumentGeneratorService; + @Mock + private CaseDataExtractionService caseDataExtractionService; + @Mock + private DocumentMerger documentMerger; + @Mock + private Time time; + @InjectMocks + private DocmosisApprovedOrderCoverSheetService underTest; + + @Test + void shouldGenerateApprovedOrderCoverSheet() { + CaseData caseData = CaseData.builder() + .id(CASE_ID) + .familyManCaseNumber(FAMILY_MAN_NUMBER) + .court(COURT) + .c110A(C110A.builder() + .languageRequirementApplication(LANGUAGE) + .build()) + .children1(List.of(CHILD)) + .confidentialChildren(List.of(CONFIDENTIAL_CHILD)) + .reviewDraftOrdersData(ReviewDraftOrdersData.builder().judgeTitleAndName(JUDGE_NAME).build()) + .additionalApplicationsBundle(List.of(C2_BUNDLE)) + .build(); + + given(caseDataExtractionService.getCourtName(caseData)).willReturn(COURT_NAME); + given(caseDataExtractionService.getChildrenDetails(caseData.getAllChildren())).willReturn(DOCMOSIS_CHILDREN); + given(time.now()).willReturn(TEST_TIME); + + DocmosisApprovedOrderCoverSheet expectedDocmosisData = DocmosisApprovedOrderCoverSheet.builder() + .familyManCaseNumber(FAMILY_MAN_NUMBER) + .courtName(COURT_NAME) + .children(DOCMOSIS_CHILDREN) + .judgeTitleAndName(JUDGE_NAME) + .dateOfApproval(formatLocalDateToString(TEST_TIME.toLocalDate(), DATE, Language.ENGLISH)) + .crest(CREST.getValue()) + .build(); + + + given(docmosisDocumentGeneratorService.generateDocmosisDocument(expectedDocmosisData, APPROVED_ORDER_COVER, + RenderFormat.PDF, LANGUAGE)) + .willReturn(COVER_SHEET); + + DocmosisDocument result = underTest.createCoverSheet(caseData); + + assertThat(result).isEqualTo(COVER_SHEET); + } + + @Test + void shouldAddCoverSheetAndAddAnnexAWording() throws IOException { + CaseData caseData = CaseData.builder() + .id(CASE_ID) + .familyManCaseNumber(FAMILY_MAN_NUMBER) + .court(COURT) + .c110A(C110A.builder() + .languageRequirementApplication(LANGUAGE) + .build()) + .children1(List.of(CHILD)) + .confidentialChildren(List.of(CONFIDENTIAL_CHILD)) + .reviewDraftOrdersData(ReviewDraftOrdersData.builder().judgeTitleAndName(JUDGE_NAME).build()) + .build(); + + given(caseDataExtractionService.getCourtName(caseData)).willReturn(COURT_NAME); + given(caseDataExtractionService.getChildrenDetails(caseData.getAllChildren())).willReturn(DOCMOSIS_CHILDREN); + given(time.now()).willReturn(TEST_TIME); + + DocmosisApprovedOrderCoverSheet expectedDocmosisData = DocmosisApprovedOrderCoverSheet.builder() + .familyManCaseNumber(FAMILY_MAN_NUMBER) + .courtName(COURT_NAME) + .children(DOCMOSIS_CHILDREN) + .judgeTitleAndName(JUDGE_NAME) + .dateOfApproval(formatLocalDateToString(TEST_TIME.toLocalDate(), DATE, Language.ENGLISH)) + .crest(CREST.getValue()) + .build(); + + + given(docmosisDocumentGeneratorService.generateDocmosisDocument(expectedDocmosisData, APPROVED_ORDER_COVER, + RenderFormat.PDF, LANGUAGE)) + .willReturn(COVER_SHEET); + + byte[] mergedOrderBytes = ResourceReader.readBytes("documents/document.pdf"); + DocmosisDocument mergedOrder = new DocmosisDocument("merged_order.pdf", mergedOrderBytes); + given(documentMerger.mergeDocuments(any(), any())).willReturn(mergedOrder); + + DocmosisDocument result = underTest.addCoverSheetToApprovedOrder(caseData, testDocumentReference()); + + String resultText = (new DocmosisHelper()).extractPdfContent(result.getBytes()); + + assertThat(resultText).isEqualToNormalizingWhitespace("First page Second page ANNEX A: "); + } +}