Search in sources :

Example 1 with CaseImportSimilarityResult

use of de.symeda.sormas.ui.importer.CaseImportSimilarityResult in project SORMAS-Project by hzi-braunschweig.

the class CaseImporterTest method testImportAllCases.

@Test
public void testImportAllCases() throws IOException, InvalidColumnException, InterruptedException, CsvValidationException, URISyntaxException {
    TestDataCreator creator = new TestDataCreator();
    TestDataCreator.RDCF rdcf = creator.createRDCF("Abia", "Umuahia North", "Urban Ward 2", "Anelechi Hospital");
    UserDto user = creator.createUser(rdcf.region.getUuid(), rdcf.district.getUuid(), rdcf.facility.getUuid(), "Surv", "Sup", UserRole.SURVEILLANCE_SUPERVISOR);
    // Successful import of 5 cases
    File csvFile = new File(getClass().getClassLoader().getResource("sormas_import_test_success.csv").toURI());
    CaseImporterExtension caseImporter = new CaseImporterExtension(csvFile, true, user);
    ImportResultStatus importResult = caseImporter.runImport();
    assertEquals(caseImporter.stringBuilder.toString(), ImportResultStatus.COMPLETED, importResult);
    assertEquals(5, getCaseFacade().count(null));
    // Failed import of 5 cases because of errors
    csvFile = new File(getClass().getClassLoader().getResource("sormas_import_test_errors.csv").toURI());
    caseImporter = new CaseImporterExtension(csvFile, true, user);
    importResult = caseImporter.runImport();
    assertEquals(ImportResultStatus.COMPLETED_WITH_ERRORS, importResult);
    assertEquals(5, getCaseFacade().count(null));
    // Similarity: skip
    csvFile = new File(getClass().getClassLoader().getResource("sormas_import_test_similarities.csv").toURI());
    caseImporter = new CaseImporterExtension(csvFile, true, user) {

        @Override
        protected <T extends PersonImportSimilarityResult> void handlePersonSimilarity(PersonDto newPerson, Consumer<T> resultConsumer, BiFunction<SimilarPersonDto, ImportSimilarityResultOption, T> createSimilarityResult, String infoText, UI currentUI) {
            resultConsumer.accept((T) new CaseImportSimilarityResult(null, null, ImportSimilarityResultOption.SKIP));
        }
    };
    importResult = caseImporter.runImport();
    assertEquals(ImportResultStatus.COMPLETED, importResult);
    assertEquals(5, getCaseFacade().count(null));
    assertEquals("ABC-DEF-GHI-19-5", getCaseFacade().getAllActiveCasesAfter(null).get(4).getEpidNumber());
    // Similarity: pick
    List<SimilarPersonDto> persons = FacadeProvider.getPersonFacade().getSimilarPersonDtos(new PersonSimilarityCriteria());
    csvFile = new File(getClass().getClassLoader().getResource("sormas_import_test_similarities.csv").toURI());
    caseImporter = new CaseImporterExtension(csvFile, true, user) {

        @Override
        protected <T extends PersonImportSimilarityResult> void handlePersonSimilarity(PersonDto newPerson, Consumer<T> resultConsumer, BiFunction<SimilarPersonDto, ImportSimilarityResultOption, T> createSimilarityResult, String infoText, UI currentUI) {
            List<SimilarPersonDto> entries = new ArrayList<>();
            for (SimilarPersonDto person : persons) {
                if (PersonHelper.areNamesSimilar(newPerson.getFirstName(), newPerson.getLastName(), person.getFirstName(), person.getLastName(), null)) {
                    entries.add(person);
                }
            }
            resultConsumer.accept((T) new CaseImportSimilarityResult(entries.get(0), null, ImportSimilarityResultOption.PICK));
        }

        @Override
        protected void handleCaseSimilarity(CaseImportSimilarityInput input, Consumer<CaseImportSimilarityResult> resultConsumer) {
            resultConsumer.accept(new CaseImportSimilarityResult(null, input.getSimilarCases().get(0), ImportSimilarityResultOption.PICK));
        }
    };
    importResult = caseImporter.runImport();
    assertEquals(ImportResultStatus.COMPLETED, importResult);
    assertEquals(5, getCaseFacade().count(null));
    assertEquals("ABC-DEF-GHI-19-5", getCaseFacade().getAllActiveCasesAfter(null).get(4).getEpidNumber());
    // Similarity: cancel
    csvFile = new File(getClass().getClassLoader().getResource("sormas_import_test_similarities.csv").toURI());
    caseImporter = new CaseImporterExtension(csvFile, true, user) {

        @Override
        protected <T extends PersonImportSimilarityResult> void handlePersonSimilarity(PersonDto newPerson, Consumer<T> resultConsumer, BiFunction<SimilarPersonDto, ImportSimilarityResultOption, T> createSimilarityResult, String infoText, UI currentUI) {
            resultConsumer.accept((T) new CaseImportSimilarityResult(null, null, ImportSimilarityResultOption.CANCEL));
        }
    };
    importResult = caseImporter.runImport();
    assertEquals(ImportResultStatus.CANCELED, importResult);
    assertEquals(5, getCaseFacade().count(null));
    assertEquals("ABC-DEF-GHI-19-5", getCaseFacade().getAllActiveCasesAfter(null).get(4).getEpidNumber());
    // Similarity: override
    csvFile = new File(getClass().getClassLoader().getResource("sormas_import_test_similarities.csv").toURI());
    caseImporter = new CaseImporterExtension(csvFile, true, user) {

        @Override
        protected <T extends PersonImportSimilarityResult> void handlePersonSimilarity(PersonDto newPerson, Consumer<T> resultConsumer, BiFunction<SimilarPersonDto, ImportSimilarityResultOption, T> createSimilarityResult, String infoText, UI currentUI) {
            List<SimilarPersonDto> entries = new ArrayList<>();
            for (SimilarPersonDto person : persons) {
                if (PersonHelper.areNamesSimilar(newPerson.getFirstName(), newPerson.getLastName(), person.getFirstName(), person.getLastName(), null)) {
                    entries.add(person);
                }
            }
            resultConsumer.accept((T) new CaseImportSimilarityResult(entries.get(0), null, ImportSimilarityResultOption.PICK));
        }

        @Override
        protected void handleCaseSimilarity(CaseImportSimilarityInput input, Consumer<CaseImportSimilarityResult> resultConsumer) {
            resultConsumer.accept(new CaseImportSimilarityResult(null, input.getSimilarCases().get(0), ImportSimilarityResultOption.OVERRIDE));
        }
    };
    importResult = caseImporter.runImport();
    assertEquals(ImportResultStatus.COMPLETED, importResult);
    assertEquals(5, getCaseFacade().count(null));
    assertEquals("ABC-DEF-GHI-19-10", getCaseFacade().getAllActiveCasesAfter(null).get(4).getEpidNumber());
    // Similarity: create -> fail because of duplicate epid number
    csvFile = new File(getClass().getClassLoader().getResource("sormas_import_test_similarities.csv").toURI());
    caseImporter = new CaseImporterExtension(csvFile, true, user) {

        @Override
        protected <T extends PersonImportSimilarityResult> void handlePersonSimilarity(PersonDto newPerson, Consumer<T> resultConsumer, BiFunction<SimilarPersonDto, ImportSimilarityResultOption, T> createSimilarityResult, String infoText, UI currentUI) {
            List<SimilarPersonDto> entries = new ArrayList<>();
            for (SimilarPersonDto person : persons) {
                if (PersonHelper.areNamesSimilar(newPerson.getFirstName(), newPerson.getLastName(), person.getFirstName(), person.getLastName(), null)) {
                    entries.add(person);
                }
            }
            resultConsumer.accept((T) new CaseImportSimilarityResult(entries.get(0), null, ImportSimilarityResultOption.PICK));
        }

        @Override
        protected void handleCaseSimilarity(CaseImportSimilarityInput input, Consumer<CaseImportSimilarityResult> resultConsumer) {
            resultConsumer.accept(new CaseImportSimilarityResult(null, null, ImportSimilarityResultOption.CREATE));
        }
    };
    importResult = caseImporter.runImport();
    assertEquals(ImportResultStatus.COMPLETED_WITH_ERRORS, importResult);
    assertEquals(5, getCaseFacade().count(null));
    assertEquals("ABC-DEF-GHI-19-10", getCaseFacade().getAllActiveCasesAfter(null).get(4).getEpidNumber());
    // Change epid number of the case in database to pass creation test
    CaseDataDto caze = getCaseFacade().getAllActiveCasesAfter(null).get(4);
    caze.setEpidNumber("ABC-DEF-GHI-19-99");
    getCaseFacade().save(caze);
    assertEquals("ABC-DEF-GHI-19-99", getCaseFacade().getAllActiveCasesAfter(null).get(4).getEpidNumber());
    // Similarity: create -> pass
    csvFile = new File(getClass().getClassLoader().getResource("sormas_import_test_similarities.csv").toURI());
    caseImporter = new CaseImporterExtension(csvFile, true, user);
    importResult = caseImporter.runImport();
    assertEquals(ImportResultStatus.COMPLETED, importResult);
    assertEquals(6, getCaseFacade().count(null));
    assertEquals("ABC-DEF-GHI-19-10", getCaseFacade().getAllActiveCasesAfter(null).get(5).getEpidNumber());
    // Successful import of a case with different infrastructure combinations
    creator.createRDCF("R1", "D1", "C1", "F1");
    creator.createRDCF("R2", "D2", "C2", "F2");
    creator.createRDCF("R3", "D3", "C3", "F3");
    csvFile = new File(getClass().getClassLoader().getResource("sormas_case_import_test_different_infrastructure.csv").toURI());
    caseImporter = new CaseImporterExtension(csvFile, true, user);
    importResult = caseImporter.runImport();
    assertEquals(ImportResultStatus.COMPLETED, importResult);
    assertEquals(7, getCaseFacade().count(null));
    // Successful import of 5 cases from a commented CSV file
    csvFile = new File(getClass().getClassLoader().getResource("sormas_import_test_comment_success.csv").toURI());
    caseImporter = new CaseImporterExtension(csvFile, true, user);
    importResult = caseImporter.runImport();
    assertEquals(caseImporter.stringBuilder.toString(), ImportResultStatus.COMPLETED, importResult);
    assertEquals(12, getCaseFacade().count(null));
}
Also used : CaseImportSimilarityResult(de.symeda.sormas.ui.importer.CaseImportSimilarityResult) CaseDataDto(de.symeda.sormas.api.caze.CaseDataDto) PersonDto(de.symeda.sormas.api.person.PersonDto) SimilarPersonDto(de.symeda.sormas.api.person.SimilarPersonDto) UserDto(de.symeda.sormas.api.user.UserDto) PersonSimilarityCriteria(de.symeda.sormas.api.person.PersonSimilarityCriteria) SimilarPersonDto(de.symeda.sormas.api.person.SimilarPersonDto) CaseImportSimilarityInput(de.symeda.sormas.ui.importer.CaseImportSimilarityInput) UI(com.vaadin.ui.UI) TestDataCreator(de.symeda.sormas.ui.TestDataCreator) ImportSimilarityResultOption(de.symeda.sormas.ui.importer.ImportSimilarityResultOption) ImportResultStatus(de.symeda.sormas.ui.importer.ImportResultStatus) List(java.util.List) ArrayList(java.util.ArrayList) File(java.io.File) AbstractBeanTest(de.symeda.sormas.ui.AbstractBeanTest) Test(org.junit.Test)

Example 2 with CaseImportSimilarityResult

use of de.symeda.sormas.ui.importer.CaseImportSimilarityResult in project SORMAS-Project by hzi-braunschweig.

the class CaseImporter method handleCaseSimilarity.

/**
 * Presents a popup window to the user that allows them to deal with detected potentially duplicate cases.
 * By passing the desired result to the resultConsumer, the importer decided how to proceed with the import process.
 */
protected void handleCaseSimilarity(CaseImportSimilarityInput input, Consumer<CaseImportSimilarityResult> resultConsumer) {
    currentUI.accessSynchronously(() -> {
        CasePickOrImportField pickOrImportField = new CasePickOrImportField(input.getCaze(), input.getPerson(), input.getSimilarCases());
        pickOrImportField.setWidth(1024, Unit.PIXELS);
        final CommitDiscardWrapperComponent<CasePickOrImportField> component = new CommitDiscardWrapperComponent<>(pickOrImportField);
        component.addCommitListener(() -> {
            CaseSelectionDto pickedCase = pickOrImportField.getValue();
            if (pickedCase != null) {
                if (pickOrImportField.isOverrideCase()) {
                    resultConsumer.accept(new CaseImportSimilarityResult(null, pickedCase, ImportSimilarityResultOption.OVERRIDE));
                } else {
                    resultConsumer.accept(new CaseImportSimilarityResult(null, pickedCase, ImportSimilarityResultOption.PICK));
                }
            } else {
                resultConsumer.accept(new CaseImportSimilarityResult(null, null, ImportSimilarityResultOption.CREATE));
            }
        });
        DiscardListener discardListener = () -> resultConsumer.accept(new CaseImportSimilarityResult(null, null, ImportSimilarityResultOption.CANCEL));
        component.addDiscardListener(discardListener);
        component.getDiscardButton().setCaption(I18nProperties.getCaption(Captions.actionCancel));
        component.getCommitButton().setCaption(I18nProperties.getCaption(Captions.actionConfirm));
        component.getCommitButton().setEnabled(false);
        Button skipButton = ButtonHelper.createButton(Captions.actionSkip, e -> {
            component.removeDiscardListener(discardListener);
            component.discard();
            resultConsumer.accept(new CaseImportSimilarityResult(null, null, ImportSimilarityResultOption.SKIP));
        });
        component.getButtonsPanel().addComponentAsFirst(skipButton);
        pickOrImportField.setSelectionChangeCallback((commitAllowed) -> component.getCommitButton().setEnabled(commitAllowed));
        VaadinUiUtil.showModalPopupWindow(component, I18nProperties.getString(Strings.headingPickOrCreateCase));
    });
}
Also used : CaseImportSimilarityResult(de.symeda.sormas.ui.importer.CaseImportSimilarityResult) Button(com.vaadin.ui.Button) CaseSelectionDto(de.symeda.sormas.api.caze.CaseSelectionDto) CommitDiscardWrapperComponent(de.symeda.sormas.ui.utils.CommitDiscardWrapperComponent) DiscardListener(de.symeda.sormas.ui.utils.CommitDiscardWrapperComponent.DiscardListener)

Aggregations

CaseImportSimilarityResult (de.symeda.sormas.ui.importer.CaseImportSimilarityResult)2 Button (com.vaadin.ui.Button)1 UI (com.vaadin.ui.UI)1 CaseDataDto (de.symeda.sormas.api.caze.CaseDataDto)1 CaseSelectionDto (de.symeda.sormas.api.caze.CaseSelectionDto)1 PersonDto (de.symeda.sormas.api.person.PersonDto)1 PersonSimilarityCriteria (de.symeda.sormas.api.person.PersonSimilarityCriteria)1 SimilarPersonDto (de.symeda.sormas.api.person.SimilarPersonDto)1 UserDto (de.symeda.sormas.api.user.UserDto)1 AbstractBeanTest (de.symeda.sormas.ui.AbstractBeanTest)1 TestDataCreator (de.symeda.sormas.ui.TestDataCreator)1 CaseImportSimilarityInput (de.symeda.sormas.ui.importer.CaseImportSimilarityInput)1 ImportResultStatus (de.symeda.sormas.ui.importer.ImportResultStatus)1 ImportSimilarityResultOption (de.symeda.sormas.ui.importer.ImportSimilarityResultOption)1 CommitDiscardWrapperComponent (de.symeda.sormas.ui.utils.CommitDiscardWrapperComponent)1 DiscardListener (de.symeda.sormas.ui.utils.CommitDiscardWrapperComponent.DiscardListener)1 File (java.io.File)1 ArrayList (java.util.ArrayList)1 List (java.util.List)1 Test (org.junit.Test)1