From 947a700a191c2634fe186a986a8c06a0a07fb0d0 Mon Sep 17 00:00:00 2001 From: alfayo-dev Date: Tue, 19 Feb 2013 13:06:02 +0300 Subject: [PATCH 01/12] Made partial changes to include provider and location details on the error view --- .../MobileFormEntryErrorModel.java | 22 +++++++++++++++++-- .../controller/ResolveErrorsController.java | 11 ++++++++++ omod/src/main/webapp/resolveErrors.jsp | 16 +++++++++----- 3 files changed, 41 insertions(+), 8 deletions(-) diff --git a/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormEntryErrorModel.java b/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormEntryErrorModel.java index 06aed27..3fb8c6e 100755 --- a/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormEntryErrorModel.java +++ b/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormEntryErrorModel.java @@ -28,6 +28,7 @@ public class MobileFormEntryErrorModel extends MobileFormEntryError { private String identifier = ""; // data from the formData encounter section + private String provider = ""; private String location = ""; private String encounterDate = ""; private String formModelName = ""; @@ -72,7 +73,9 @@ public MobileFormEntryErrorModel(MobileFormEntryError error, String errorType) { // parse the encounter info from the form data String location = xp.evaluate("/form/encounter/encounter.location_id", formDataDoc); - setLocation(location.substring(location.indexOf("^") + 1)); + String formProvider=xp.evaluate("/form/encounter/encounter.provider_id", formDataDoc); + setLocation(location.substring(location.indexOf("^") + 1)); + setProvider(formProvider); setEncounterDate(xp.evaluate("/form/encounter/encounter.encounter_datetime", formDataDoc)); setFormModelName(xp.evaluate("/form/@name", formDataDoc)); setFormId(xp.evaluate("/form/@version", formDataDoc)); @@ -175,7 +178,22 @@ public String getFormModelName() { return formModelName; } - /** + + /** + * @return the provider + */ + public String getProvider() { + return provider; + } + + /** + * @param provider to set + */ + public void setProvider(String provider) { + this.provider = provider; + } + + /** * @param formModelName the formModelName to set */ public void setFormModelName(String formModelName) { diff --git a/omod/src/main/java/org/openmrs/module/amrsmobileforms/web/controller/ResolveErrorsController.java b/omod/src/main/java/org/openmrs/module/amrsmobileforms/web/controller/ResolveErrorsController.java index ee57766..109b8a5 100644 --- a/omod/src/main/java/org/openmrs/module/amrsmobileforms/web/controller/ResolveErrorsController.java +++ b/omod/src/main/java/org/openmrs/module/amrsmobileforms/web/controller/ResolveErrorsController.java @@ -472,8 +472,19 @@ Map getErrorBatchAsJson( private Map generateObjectMap(MobileFormEntryError error) { // try to stick to basic types; String, Integer, etc (not Date) // JSP expects: [id, error, details, form name, comment] + + // + MobileFormEntryService mfs = (MobileFormEntryService) Context.getService(MobileFormEntryService.class); + String formName = error.getFormName(); + String filePath = getAbsoluteFilePath(formName, mfs); + error.setFormName(createFormData(error.getFormName(), mfs)); + MobileFormEntryErrorModel errorModel = new MobileFormEntryErrorModel(error, getFormType(formName)); + errorModel.setFormPath(filePath); + // Map result = new HashMap(); result.put("id", error.getId()); + result.put("location", errorModel.getLocation()); + result.put("provider", errorModel.getProvider()); result.put("error", error.getError()); result.put("errorDetails", error.getErrorDetails()); result.put("formName", error.getFormName()); diff --git a/omod/src/main/webapp/resolveErrors.jsp b/omod/src/main/webapp/resolveErrors.jsp index 90c25eb..1dfb2d1 100755 --- a/omod/src/main/webapp/resolveErrors.jsp +++ b/omod/src/main/webapp/resolveErrors.jsp @@ -72,11 +72,13 @@ return out; } }, - { aTargets: [2], mData: "id" }, - { aTargets: [3], mData: "error" }, - { aTargets: [4], mData: "errorDetails" }, - { aTargets: [5], mData: "formName" }, - { aTargets: [6], mData: "comment", sClass: "centered" } + { aTargets: [2], mData: "id" }, + { aTargets: [3], mData: "location"}, + { aTargets: [4], mData: "provider"}, + { aTargets: [5], mData: "error" }, + { aTargets: [6], mData: "errorDetails" }, + { aTargets: [7], mData: "formName" }, + { aTargets: [8], mData: "comment", sClass: "centered" } ], bProcessing: true, bServerSide: true, @@ -162,8 +164,10 @@ Select Action ID + Location + Provider Error - Error Details + Error Details Form Name Comment From 0016470b8cfddd8f5ae67e04144db7c4ae8cd4d7 Mon Sep 17 00:00:00 2001 From: alfayo-dev Date: Tue, 19 Feb 2013 13:06:02 +0300 Subject: [PATCH 02/12] Made partial changes to include provider and location details on the error view --- .../MobileFormEntryErrorModel.java | 23 +++++++++++++++---- .../controller/ResolveErrorsController.java | 11 +++++++++ omod/src/main/webapp/resolveErrors.jsp | 16 ++++++++----- 3 files changed, 40 insertions(+), 10 deletions(-) diff --git a/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormEntryErrorModel.java b/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormEntryErrorModel.java index 2144aa7..336ab80 100755 --- a/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormEntryErrorModel.java +++ b/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormEntryErrorModel.java @@ -27,6 +27,7 @@ public class MobileFormEntryErrorModel extends MobileFormEntryError { private String identifier = ""; // data from the formData encounter section + private String provider = ""; private String location = ""; private String encounterDate = ""; private String formModelName = ""; @@ -60,14 +61,15 @@ public MobileFormEntryErrorModel(MobileFormEntryError error, String errorType) { try { Document formDataDoc = getDocumentForErrorQueueItem(getFormName()); XPath xp = getXPathFactory().newXPath(); - - if ("household".equals(errorType)) { + if ("household".equals(errorType)) { setName("Household"); setBirthdate("N/A"); setIdentifier(xp.evaluate("/form/household/meta_data/household_id", formDataDoc)); setGender("N/A"); setLocation(xp.evaluate("/form/household/meta_data/catchment_area", formDataDoc)); setEncounterDate(xp.evaluate("/form/meta/start_time", formDataDoc)); + String householdProvider=xp.evaluate("/form/household/meta_data/provider_id", formDataDoc); + setProvider(householdProvider); } else { setName(xp.evaluate("/form/patient/patient.given_name", formDataDoc) + " " + xp.evaluate("/form/patient/patient.middle_name", formDataDoc) + " " + @@ -80,9 +82,10 @@ public MobileFormEntryErrorModel(MobileFormEntryError error, String errorType) { // parse the encounter info from the form data String location = xp.evaluate("/form/encounter/encounter.location_id", formDataDoc); setLocation(location.substring(location.indexOf("^") + 1)); + String formProvider=xp.evaluate("/form/encounter/encounter.provider_id", formDataDoc); + setProvider(formProvider); setEncounterDate(xp.evaluate("/form/encounter/encounter.encounter_datetime", formDataDoc)); } - setFormModelName(xp.evaluate("/form/@name", formDataDoc)); setFormId(xp.evaluate("/form/@version", formDataDoc)); @@ -182,7 +185,6 @@ public void setLocation(String location) { public String getFormModelName() { return formModelName; } - /** * @param formModelName the formModelName to set */ @@ -190,6 +192,19 @@ public void setFormModelName(String formModelName) { this.formModelName = formModelName; } + /** + * @return the provider + */ + public String getProvider() { + return provider; + } + + /** + * @param provider to set + */ + public void setProvider(String provider) { + this.provider = provider; + } /** * @return the formId */ diff --git a/omod/src/main/java/org/openmrs/module/amrsmobileforms/web/controller/ResolveErrorsController.java b/omod/src/main/java/org/openmrs/module/amrsmobileforms/web/controller/ResolveErrorsController.java index ee57766..109b8a5 100644 --- a/omod/src/main/java/org/openmrs/module/amrsmobileforms/web/controller/ResolveErrorsController.java +++ b/omod/src/main/java/org/openmrs/module/amrsmobileforms/web/controller/ResolveErrorsController.java @@ -472,8 +472,19 @@ Map getErrorBatchAsJson( private Map generateObjectMap(MobileFormEntryError error) { // try to stick to basic types; String, Integer, etc (not Date) // JSP expects: [id, error, details, form name, comment] + + // + MobileFormEntryService mfs = (MobileFormEntryService) Context.getService(MobileFormEntryService.class); + String formName = error.getFormName(); + String filePath = getAbsoluteFilePath(formName, mfs); + error.setFormName(createFormData(error.getFormName(), mfs)); + MobileFormEntryErrorModel errorModel = new MobileFormEntryErrorModel(error, getFormType(formName)); + errorModel.setFormPath(filePath); + // Map result = new HashMap(); result.put("id", error.getId()); + result.put("location", errorModel.getLocation()); + result.put("provider", errorModel.getProvider()); result.put("error", error.getError()); result.put("errorDetails", error.getErrorDetails()); result.put("formName", error.getFormName()); diff --git a/omod/src/main/webapp/resolveErrors.jsp b/omod/src/main/webapp/resolveErrors.jsp index 90c25eb..1dfb2d1 100755 --- a/omod/src/main/webapp/resolveErrors.jsp +++ b/omod/src/main/webapp/resolveErrors.jsp @@ -72,11 +72,13 @@ return out; } }, - { aTargets: [2], mData: "id" }, - { aTargets: [3], mData: "error" }, - { aTargets: [4], mData: "errorDetails" }, - { aTargets: [5], mData: "formName" }, - { aTargets: [6], mData: "comment", sClass: "centered" } + { aTargets: [2], mData: "id" }, + { aTargets: [3], mData: "location"}, + { aTargets: [4], mData: "provider"}, + { aTargets: [5], mData: "error" }, + { aTargets: [6], mData: "errorDetails" }, + { aTargets: [7], mData: "formName" }, + { aTargets: [8], mData: "comment", sClass: "centered" } ], bProcessing: true, bServerSide: true, @@ -162,8 +164,10 @@ Select Action ID + Location + Provider Error - Error Details + Error Details Form Name Comment From 108684baf3d6d132a69051b357d1fdbae69ec501 Mon Sep 17 00:00:00 2001 From: alfayo-dev Date: Wed, 20 Feb 2013 15:41:04 +0300 Subject: [PATCH 03/12] Changes to allow saving of provider Id of MobileFormEntryError --- .../amrsmobileforms/MobileFormEntryError.java | 15 +++++++++++ .../MobileFormEntryErrorModel.java | 4 +-- .../MobileFormHouseholdLinksProcessor.java | 26 ++++++++++--------- .../MobileFormQueueProcessor.java | 10 +++---- .../MobileFormSplitProcessor.java | 3 ++- .../MobileFormUploadProcessor.java | 25 ++++++++++-------- .../util/MobileFormEntryUtil.java | 3 ++- .../resources/MobileFormEntryError.hbm.xml | 5 +++- api/src/main/resources/sqldiff.xml | 3 ++- .../controller/ResolveErrorsController.java | 12 ++++----- 10 files changed, 65 insertions(+), 41 deletions(-) diff --git a/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormEntryError.java b/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormEntryError.java index fd0e6d0..b4f332d 100644 --- a/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormEntryError.java +++ b/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormEntryError.java @@ -14,6 +14,7 @@ public class MobileFormEntryError extends BaseOpenmrsObject implements Auditable{ private Integer mobileFormEntryErrorId; + private String providerId; private String formName; private String error; private String errorDetails; @@ -98,6 +99,20 @@ public void setFormName(String formName) { this.formName = formName; } + /** + * @return Returns the Provider Id + */ + public String getProviderId() { + return providerId; + } + + /** + * @param Provider Id + * The formData to set. + */ + public void setProviderId(String providerId) { + this.providerId = providerId; + } /** * @return Returns the mobileFormEntryErrorId. */ diff --git a/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormEntryErrorModel.java b/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormEntryErrorModel.java index 336ab80..8748774 100755 --- a/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormEntryErrorModel.java +++ b/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormEntryErrorModel.java @@ -68,8 +68,8 @@ public MobileFormEntryErrorModel(MobileFormEntryError error, String errorType) { setGender("N/A"); setLocation(xp.evaluate("/form/household/meta_data/catchment_area", formDataDoc)); setEncounterDate(xp.evaluate("/form/meta/start_time", formDataDoc)); - String householdProvider=xp.evaluate("/form/household/meta_data/provider_id", formDataDoc); - setProvider(householdProvider); + String householdProvider=xp.evaluate("/form/survey/provider_id", formDataDoc); + setProvider(householdProvider); } else { setName(xp.evaluate("/form/patient/patient.given_name", formDataDoc) + " " + xp.evaluate("/form/patient/patient.middle_name", formDataDoc) + " " + diff --git a/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormHouseholdLinksProcessor.java b/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormHouseholdLinksProcessor.java index 37b730b..428cc09 100644 --- a/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormHouseholdLinksProcessor.java +++ b/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormHouseholdLinksProcessor.java @@ -56,6 +56,7 @@ public MobileFormHouseholdLinksProcessor() { */ private void processPendingLinkForm(String filePath, MobileFormQueue queue) throws APIException { log.debug("Linking Patient to household"); + String providerId=null; try { String formData = queue.getFormData(); docBuilder = docBuilderFactory.newDocumentBuilder(); @@ -63,23 +64,24 @@ private void processPendingLinkForm(String filePath, MobileFormQueue queue) thro XPath xp = xpf.newXPath(); Document doc = docBuilder.parse(IOUtils.toInputStream(formData)); - // First Ensure there is at least a patient identifier in the form - if (!StringUtils.hasText(MobileFormEntryUtil.getPatientIdentifier(doc))) { - // form has no patient identifier : move to error - saveFormInError(filePath); - mobileService.saveErrorInDatabase(MobileFormEntryUtil.createError(getFormName(filePath), "Error linking patient", - "Patient has no identifier, or the identifier provided is invalid")); - return; - } - - Node curNode = (Node) xp.evaluate("/form/patient", doc, XPathConstants.NODE); + Node curNode = (Node) xp.evaluate("/form/patient", doc, XPathConstants.NODE); String patientIdentifier = xp.evaluate(MobileFormEntryConstants.PATIENT_IDENTIFIER, curNode); String householdId = xp.evaluate(MobileFormEntryConstants.PATIENT_HOUSEHOLD_IDENTIFIER, curNode); + providerId = Integer.toString(MobileFormEntryUtil.getProviderId(xp.evaluate(MobileFormEntryConstants.ENCOUNTER_PROVIDER, curNode))); + //String providerId=Integer.toString(intProviderId); + // First Ensure there is at least a patient identifier in the form + if (!StringUtils.hasText(MobileFormEntryUtil.getPatientIdentifier(doc))) { + // form has no patient identifier : move to error + saveFormInError(filePath); + mobileService.saveErrorInDatabase(MobileFormEntryUtil.createError(getFormName(filePath), "Error linking patient", + "Patient has no identifier, or the identifier provided is invalid",providerId)); + return; + } if (!StringUtils.hasText(householdId) || MobileFormEntryUtil.isNewHousehold(householdId)) { saveFormInError(filePath); mobileService.saveErrorInDatabase(MobileFormEntryUtil.createError(getFormName(filePath), "Error linking patient", - "Patient is not linked to household or household Id provided is invalid")); + "Patient is not linked to household or household Id provided is invalid",providerId)); } else { Patient pat = MobileFormEntryUtil.getPatient(patientIdentifier); MobileFormHousehold household = mobileService.getHousehold(householdId); @@ -100,7 +102,7 @@ private void processPendingLinkForm(String filePath, MobileFormQueue queue) thro log.error("Error while linking patient to household", t); //put file in error queue saveFormInError(filePath); - mobileService.saveErrorInDatabase(MobileFormEntryUtil.createError(getFormName(filePath), "Error while linking patient to house hold", t.getMessage())); + mobileService.saveErrorInDatabase(MobileFormEntryUtil.createError(getFormName(filePath), "Error while linking patient to house hold", t.getMessage(),providerId)); } } diff --git a/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormQueueProcessor.java b/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormQueueProcessor.java index 7f8a453..88f046f 100755 --- a/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormQueueProcessor.java +++ b/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormQueueProcessor.java @@ -57,7 +57,7 @@ private void processMobileForm(MobileFormQueue queue) throws APIException { String householdIdentifier = null; String householdGps = null; MobileFormEntryService mfes = (MobileFormEntryService) Context.getService(MobileFormEntryService.class); - + String providerId=null; try { docBuilder = docBuilderFactory.newDocumentBuilder(); XPathFactory xpf = getXPathFactory(); @@ -66,14 +66,14 @@ private void processMobileForm(MobileFormQueue queue) throws APIException { Node curNode = (Node) xp.evaluate(MobileFormEntryConstants.HOUSEHOLD_PREFIX + MobileFormEntryConstants.HOUSEHOLD_META_PREFIX, doc, XPathConstants.NODE); householdIdentifier = xp.evaluate(MobileFormEntryConstants.HOUSEHOLD_META_HOUSEHOLD_ID, curNode); householdGps = xp.evaluate(MobileFormEntryConstants.HOUSEHOLD_META_GPS_LOCATION, curNode); - + providerId = Integer.toString(MobileFormEntryUtil.getProviderId(xp.evaluate(MobileFormEntryConstants.ENCOUNTER_PROVIDER, curNode))); // check household identifier and gps were entered correctly if (StringUtils.isBlank(householdIdentifier) || StringUtils.isBlank(householdGps)) { log.debug("Null household identifier or GPS"); saveFormInError(queue.getFileSystemUrl()); mfes.saveErrorInDatabase(MobileFormEntryUtil. createError(getFormName(queue.getFileSystemUrl()), "Error processing household", - "This household has no identifier or GPS specified")); + "This household has no identifier or GPS specified", providerId )); return; } @@ -87,7 +87,7 @@ private void processMobileForm(MobileFormQueue queue) throws APIException { saveFormInError(queue.getFileSystemUrl()); mfes.saveErrorInDatabase(MobileFormEntryUtil. createError(getFormName(queue.getFileSystemUrl()), "Error processing household", - "A duplicate household different from this one exists with the same identifier (" + householdIdentifier + ")")); + "A duplicate household different from this one exists with the same identifier (" + householdIdentifier + ")", providerId )); } else { // get or create household @@ -121,7 +121,7 @@ private void processMobileForm(MobileFormQueue queue) throws APIException { //put file in error table and move it to error directory saveFormInError(queue.getFileSystemUrl()); mfes.saveErrorInDatabase(MobileFormEntryUtil. - createError(getFormName(queue.getFileSystemUrl()), "Error Parsing household form", t.getMessage())); + createError(getFormName(queue.getFileSystemUrl()), "Error Parsing household form", t.getMessage(), providerId )); } } diff --git a/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormSplitProcessor.java b/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormSplitProcessor.java index 4963cbf..3fda66f 100644 --- a/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormSplitProcessor.java +++ b/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormSplitProcessor.java @@ -52,6 +52,7 @@ public MobileFormSplitProcessor(){ */ private boolean splitMobileForm(MobileFormQueue queue) throws APIException { String formData = queue.getFormData(); + String providerId=null; try { docBuilder = docBuilderFactory.newDocumentBuilder(); Document doc = docBuilder.parse(IOUtils.toInputStream(formData)); @@ -63,7 +64,7 @@ private boolean splitMobileForm(MobileFormQueue queue) throws APIException { //Move form to error queue saveFormInError(queue.getFileSystemUrl()); mobileService.saveErrorInDatabase(MobileFormEntryUtil. - createError(getFormName(queue.getFileSystemUrl()), "Error splitting document", t.getMessage())); + createError(getFormName(queue.getFileSystemUrl()), "Error splitting document", t.getMessage(),providerId)); return false; } return true; diff --git a/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormUploadProcessor.java b/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormUploadProcessor.java index 6040eff..1b84696 100644 --- a/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormUploadProcessor.java +++ b/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormUploadProcessor.java @@ -61,6 +61,7 @@ public MobileFormUploadProcessor() { */ private void processSplitForm(String filePath, MobileFormQueue queue) throws APIException { log.debug("Sending splitted mobile forms to the xform module"); + String providerId=null; try { String formData = queue.getFormData(); docBuilder = docBuilderFactory.newDocumentBuilder(); @@ -76,7 +77,10 @@ private void processSplitForm(String filePath, MobileFormQueue queue) throws API String givenName = xp.evaluate(MobileFormEntryConstants.PATIENT_GIVENNAME, curNode); String middleName = xp.evaluate(MobileFormEntryConstants.PATIENT_MIDDLENAME, curNode); - //Ensure there is a patient identifier in the form and + curNode = (Node) xp.evaluate(MobileFormEntryConstants.ENCOUNTER_NODE, doc, XPathConstants.NODE); + Integer intProvider = MobileFormEntryUtil.getProviderId(xp.evaluate(MobileFormEntryConstants.ENCOUNTER_PROVIDER, curNode)); + providerId=intProvider.toString(); + //Ensure there is a patient identifier in the form and // if without names just delete the form if (MobileFormEntryUtil.getPatientIdentifier(doc) == null || MobileFormEntryUtil.getPatientIdentifier(doc).trim() == "") { if ((familyName == null || familyName.trim() == "") @@ -87,7 +91,7 @@ private void processSplitForm(String filePath, MobileFormQueue queue) throws API // form has no patient identifier but has names : move to error saveFormInError(filePath); mobileService.saveErrorInDatabase(MobileFormEntryUtil.createError(getFormName(filePath), "Error processing patient", - "Patient has no identifier, or the identifier provided is invalid")); + "Patient has no identifier, or the identifier provided is invalid",providerId)); } return; } @@ -96,22 +100,21 @@ private void processSplitForm(String filePath, MobileFormQueue queue) throws API if (familyName == null || familyName.trim() == "" || givenName == null || givenName == "") { saveFormInError(filePath); mobileService.saveErrorInDatabase(MobileFormEntryUtil.createError(getFormName(filePath), "Error processing patient", - "Patient has no valid names specified, Family Name and Given Name are required")); + "Patient has no valid names specified, Family Name and Given Name are required",providerId)); return; } // Ensure there is a valid provider id or name and return provider_id in the form - curNode = (Node) xp.evaluate(MobileFormEntryConstants.ENCOUNTER_NODE, doc, XPathConstants.NODE); - Integer providerId = MobileFormEntryUtil.getProviderId(xp.evaluate(MobileFormEntryConstants.ENCOUNTER_PROVIDER, curNode)); + if ((providerId) == null) { // form has no valid provider : move to error saveFormInError(filePath); mobileService.saveErrorInDatabase(MobileFormEntryUtil.createError(getFormName(filePath), "Error processing patient form", - "Provider for this encounter is not provided, or the provider identifier provided is invalid")); + "Provider for this encounter is not provided, or the provider identifier provided is invalid",providerId)); return; } else { XFormEditor.editNode(filePath, - MobileFormEntryConstants.ENCOUNTER_NODE + "/" + MobileFormEntryConstants.ENCOUNTER_PROVIDER, providerId.toString()); + MobileFormEntryConstants.ENCOUNTER_NODE + "/" + MobileFormEntryConstants.ENCOUNTER_PROVIDER, providerId); } // ensure patient has birth date @@ -119,7 +122,7 @@ private void processSplitForm(String filePath, MobileFormQueue queue) throws API Integer yearOfBirth = MobileFormEntryUtil.getBirthDateFromAge(doc); if (yearOfBirth == null) {//patient has no valid birth-date saveFormInError(filePath); - mobileService.saveErrorInDatabase(MobileFormEntryUtil.createError(getFormName(filePath), "Error processing patient", "Patient has no valid Birthdate")); + mobileService.saveErrorInDatabase(MobileFormEntryUtil.createError(getFormName(filePath), "Error processing patient", "Patient has no valid Birthdate",providerId)); return; } else { //fix birth-date from age @@ -134,7 +137,7 @@ private void processSplitForm(String filePath, MobileFormQueue queue) throws API if (householdId == null || householdId.trim() == "" || MobileFormEntryUtil.isNewHousehold(householdId)) { saveFormInError(filePath); mobileService.saveErrorInDatabase(MobileFormEntryUtil.createError(getFormName(filePath), "Error processing patient", - "Patient is not linked to household or household Id provided is invalid")); + "Patient is not linked to household or household Id provided is invalid",providerId)); return; } @@ -155,7 +158,7 @@ private void processSplitForm(String filePath, MobileFormQueue queue) throws API sb.append("."); mobileService.saveErrorInDatabase(MobileFormEntryUtil.createError(getFormName(filePath), - "Error processing patient", sb.toString())); + "Error processing patient", sb.toString(),providerId)); return; } } @@ -177,7 +180,7 @@ private void processSplitForm(String filePath, MobileFormQueue queue) throws API log.error("Error while sending form to xform module", t); //put file in error queue saveFormInError(filePath); - mobileService.saveErrorInDatabase(MobileFormEntryUtil.createError(getFormName(filePath), "Error sending form to xform module", t.getMessage())); + mobileService.saveErrorInDatabase(MobileFormEntryUtil.createError(getFormName(filePath), "Error sending form to xform module", t.getMessage(),providerId)); } } diff --git a/api/src/main/java/org/openmrs/module/amrsmobileforms/util/MobileFormEntryUtil.java b/api/src/main/java/org/openmrs/module/amrsmobileforms/util/MobileFormEntryUtil.java index 413b5cb..d3a430d 100755 --- a/api/src/main/java/org/openmrs/module/amrsmobileforms/util/MobileFormEntryUtil.java +++ b/api/src/main/java/org/openmrs/module/amrsmobileforms/util/MobileFormEntryUtil.java @@ -275,8 +275,9 @@ public static boolean isNewLink(Integer patientId) { return false; } - public static MobileFormEntryError createError(String formName, String error, String errorDetails) { + public static MobileFormEntryError createError(String formName, String error, String errorDetails,String providerId) { MobileFormEntryError mobileFormEntryError = new MobileFormEntryError(); + mobileFormEntryError.setProviderId(providerId); mobileFormEntryError.setFormName(formName); mobileFormEntryError.setError(error); mobileFormEntryError.setErrorDetails(errorDetails); diff --git a/api/src/main/resources/MobileFormEntryError.hbm.xml b/api/src/main/resources/MobileFormEntryError.hbm.xml index 16d62a0..7fe929a 100644 --- a/api/src/main/resources/MobileFormEntryError.hbm.xml +++ b/api/src/main/resources/MobileFormEntryError.hbm.xml @@ -12,7 +12,10 @@ - + + generateObjectMap(MobileFormEntryError error) { // JSP expects: [id, error, details, form name, comment] // - MobileFormEntryService mfs = (MobileFormEntryService) Context.getService(MobileFormEntryService.class); + /* MobileFormEntryService mfs = (MobileFormEntryService) Context.getService(MobileFormEntryService.class); String formName = error.getFormName(); String filePath = getAbsoluteFilePath(formName, mfs); - error.setFormName(createFormData(error.getFormName(), mfs)); - MobileFormEntryErrorModel errorModel = new MobileFormEntryErrorModel(error, getFormType(formName)); - errorModel.setFormPath(filePath); - // + error.setFormName(createFormData(error.getFormName(), mfs));*/ + MobileFormEntryErrorModel errorModel = new MobileFormEntryErrorModel(error, getFormType( error.getFormName())); Map result = new HashMap(); - result.put("id", error.getId()); + result.put("id", error.getMobileFormEntryErrorId()); result.put("location", errorModel.getLocation()); - result.put("provider", errorModel.getProvider()); + result.put("provider", error.getProvider()); result.put("error", error.getError()); result.put("errorDetails", error.getErrorDetails()); result.put("formName", error.getFormName()); From 4284a8f8a2cf81d86bd8f06137f00cb8fe3340de Mon Sep 17 00:00:00 2001 From: alfayo-dev Date: Fri, 22 Feb 2013 11:01:48 +0300 Subject: [PATCH 04/12] Revised Liquibase to add the provider column and removed the change from sqldiff, add provider search filter to the dao --- .../hibernate/HibernateMobileFormEntryDAO.java | 1 + api/src/main/resources/liquibase.xml | 17 ++++++++++++++++- api/src/main/resources/sqldiff.xml | 1 - .../web/controller/ResolveErrorsController.java | 2 +- 4 files changed, 18 insertions(+), 3 deletions(-) diff --git a/api/src/main/java/org/openmrs/module/amrsmobileforms/db/hibernate/HibernateMobileFormEntryDAO.java b/api/src/main/java/org/openmrs/module/amrsmobileforms/db/hibernate/HibernateMobileFormEntryDAO.java index 4d17110..babef48 100755 --- a/api/src/main/java/org/openmrs/module/amrsmobileforms/db/hibernate/HibernateMobileFormEntryDAO.java +++ b/api/src/main/java/org/openmrs/module/amrsmobileforms/db/hibernate/HibernateMobileFormEntryDAO.java @@ -203,6 +203,7 @@ private Criteria getErrorCriteria(String query) { if (query != null && !query.isEmpty()) { Criterion disjunction = Restrictions.disjunction() .add(Restrictions.sqlRestriction("mobile_formentry_error_id like '" + idQuery + "'")) + .add(Restrictions.like("providerId", query, MatchMode.ANYWHERE)) .add(Restrictions.like("error", query, MatchMode.ANYWHERE)) .add(Restrictions.like("errorDetails", query, MatchMode.ANYWHERE)) .add(Restrictions.like("formName", query, MatchMode.ANYWHERE)); diff --git a/api/src/main/resources/liquibase.xml b/api/src/main/resources/liquibase.xml index a2d5fb7..329f1a8 100644 --- a/api/src/main/resources/liquibase.xml +++ b/api/src/main/resources/liquibase.xml @@ -60,5 +60,20 @@ referencedColumnNames="user_id" referencedTableName="users"/> - + + + + + + + + + Creating a column that will hold identity of whoever created the household or individual + + + + + + + \ No newline at end of file diff --git a/api/src/main/resources/sqldiff.xml b/api/src/main/resources/sqldiff.xml index 77b6072..11de40c 100755 --- a/api/src/main/resources/sqldiff.xml +++ b/api/src/main/resources/sqldiff.xml @@ -120,7 +120,6 @@ CREATE TABLE IF NOT EXISTS `mobileformentry_error` ( `mobile_formentry_error_id` int(11) NOT NULL auto_increment, - `provider_id` varchar(20), `form_name` mediumtext NOT NULL, `error` varchar(255) NOT NULL default '', `error_details` text, diff --git a/omod/src/main/java/org/openmrs/module/amrsmobileforms/web/controller/ResolveErrorsController.java b/omod/src/main/java/org/openmrs/module/amrsmobileforms/web/controller/ResolveErrorsController.java index 8a0f85c..bc7a129 100644 --- a/omod/src/main/java/org/openmrs/module/amrsmobileforms/web/controller/ResolveErrorsController.java +++ b/omod/src/main/java/org/openmrs/module/amrsmobileforms/web/controller/ResolveErrorsController.java @@ -476,7 +476,7 @@ private Map generateObjectMap(MobileFormEntryError error) { Map result = new HashMap(); result.put("id", error.getMobileFormEntryErrorId()); result.put("location", errorModel.getLocation()); - result.put("provider", error.getProvider()); + result.put("provider", error.getProviderId()); result.put("error", error.getError()); result.put("errorDetails", error.getErrorDetails()); result.put("formName", error.getFormName()); From 1014c6d7c96d15de89a67b85ac6cec132781635d Mon Sep 17 00:00:00 2001 From: alfayo-dev Date: Fri, 22 Feb 2013 15:51:39 +0300 Subject: [PATCH 05/12] Added changes to include location id on error list page --- .../amrsmobileforms/MobileFormEntryError.java | 16 ++++++++++++++++ .../MobileFormHouseholdLinksProcessor.java | 12 +++++++++--- .../MobileFormPostProcessor.java | 1 - .../MobileFormQueueProcessor.java | 11 ++++++++--- .../MobileFormSplitProcessor.java | 4 ++-- .../MobileFormUploadProcessor.java | 19 +++++++++++-------- .../HibernateMobileFormEntryDAO.java | 1 + .../util/MobileFormEntryUtil.java | 5 +++-- .../resources/MobileFormEntryError.hbm.xml | 2 ++ api/src/main/resources/liquibase.xml | 13 +++++++++++++ .../controller/ResolveErrorsController.java | 8 ++++---- 11 files changed, 69 insertions(+), 23 deletions(-) diff --git a/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormEntryError.java b/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormEntryError.java index b4f332d..e46b95d 100644 --- a/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormEntryError.java +++ b/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormEntryError.java @@ -15,6 +15,7 @@ public class MobileFormEntryError extends BaseOpenmrsObject implements Auditable private Integer mobileFormEntryErrorId; private String providerId; + private Integer locationId; private String formName; private String error; private String errorDetails; @@ -113,6 +114,21 @@ public String getProviderId() { public void setProviderId(String providerId) { this.providerId = providerId; } + + /** + * @return Returns the Location Id + */ + public Integer getLocationId() { + return locationId; + } + + /** + * @param Location Id + * The formData to set. + */ + public void setLocationId(Integer locationId) { + this.locationId = locationId; + } /** * @return Returns the mobileFormEntryErrorId. */ diff --git a/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormHouseholdLinksProcessor.java b/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormHouseholdLinksProcessor.java index 428cc09..ac65c3a 100644 --- a/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormHouseholdLinksProcessor.java +++ b/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormHouseholdLinksProcessor.java @@ -12,6 +12,7 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.openmrs.Patient; +import org.openmrs.Location; import org.openmrs.api.APIException; import org.openmrs.api.context.Context; import org.openmrs.module.amrsmobileforms.util.MobileFormEntryUtil; @@ -57,6 +58,7 @@ public MobileFormHouseholdLinksProcessor() { private void processPendingLinkForm(String filePath, MobileFormQueue queue) throws APIException { log.debug("Linking Patient to household"); String providerId=null; + Integer locationId=0; try { String formData = queue.getFormData(); docBuilder = docBuilderFactory.newDocumentBuilder(); @@ -68,20 +70,24 @@ private void processPendingLinkForm(String filePath, MobileFormQueue queue) thro String patientIdentifier = xp.evaluate(MobileFormEntryConstants.PATIENT_IDENTIFIER, curNode); String householdId = xp.evaluate(MobileFormEntryConstants.PATIENT_HOUSEHOLD_IDENTIFIER, curNode); providerId = Integer.toString(MobileFormEntryUtil.getProviderId(xp.evaluate(MobileFormEntryConstants.ENCOUNTER_PROVIDER, curNode))); + String householdLocation = xp.evaluate(MobileFormEntryConstants.PATIENT_CATCHMENT_AREA, curNode); + locationId = locationId = Integer.parseInt(householdLocation); + + //String providerId=Integer.toString(intProviderId); // First Ensure there is at least a patient identifier in the form if (!StringUtils.hasText(MobileFormEntryUtil.getPatientIdentifier(doc))) { // form has no patient identifier : move to error saveFormInError(filePath); mobileService.saveErrorInDatabase(MobileFormEntryUtil.createError(getFormName(filePath), "Error linking patient", - "Patient has no identifier, or the identifier provided is invalid",providerId)); + "Patient has no identifier, or the identifier provided is invalid",providerId, locationId)); return; } if (!StringUtils.hasText(householdId) || MobileFormEntryUtil.isNewHousehold(householdId)) { saveFormInError(filePath); mobileService.saveErrorInDatabase(MobileFormEntryUtil.createError(getFormName(filePath), "Error linking patient", - "Patient is not linked to household or household Id provided is invalid",providerId)); + "Patient is not linked to household or household Id provided is invalid",providerId, locationId)); } else { Patient pat = MobileFormEntryUtil.getPatient(patientIdentifier); MobileFormHousehold household = mobileService.getHousehold(householdId); @@ -102,7 +108,7 @@ private void processPendingLinkForm(String filePath, MobileFormQueue queue) thro log.error("Error while linking patient to household", t); //put file in error queue saveFormInError(filePath); - mobileService.saveErrorInDatabase(MobileFormEntryUtil.createError(getFormName(filePath), "Error while linking patient to house hold", t.getMessage(),providerId)); + mobileService.saveErrorInDatabase(MobileFormEntryUtil.createError(getFormName(filePath), "Error while linking patient to house hold", t.getMessage(),providerId, locationId)); } } diff --git a/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormPostProcessor.java b/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormPostProcessor.java index af34801..98727d8 100644 --- a/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormPostProcessor.java +++ b/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormPostProcessor.java @@ -2,7 +2,6 @@ import java.io.File; import java.util.Iterator; - import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.xpath.XPath; diff --git a/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormQueueProcessor.java b/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormQueueProcessor.java index 88f046f..76092de 100755 --- a/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormQueueProcessor.java +++ b/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormQueueProcessor.java @@ -17,6 +17,7 @@ import org.springframework.transaction.annotation.Transactional; import org.w3c.dom.Document; import org.w3c.dom.Node; +import org.openmrs.Location; import org.xml.sax.SAXParseException; /** @@ -58,6 +59,8 @@ private void processMobileForm(MobileFormQueue queue) throws APIException { String householdGps = null; MobileFormEntryService mfes = (MobileFormEntryService) Context.getService(MobileFormEntryService.class); String providerId=null; + Integer locationId=0; + try { docBuilder = docBuilderFactory.newDocumentBuilder(); XPathFactory xpf = getXPathFactory(); @@ -66,6 +69,8 @@ private void processMobileForm(MobileFormQueue queue) throws APIException { Node curNode = (Node) xp.evaluate(MobileFormEntryConstants.HOUSEHOLD_PREFIX + MobileFormEntryConstants.HOUSEHOLD_META_PREFIX, doc, XPathConstants.NODE); householdIdentifier = xp.evaluate(MobileFormEntryConstants.HOUSEHOLD_META_HOUSEHOLD_ID, curNode); householdGps = xp.evaluate(MobileFormEntryConstants.HOUSEHOLD_META_GPS_LOCATION, curNode); + String householdLocation = xp.evaluate(MobileFormEntryConstants.PATIENT_CATCHMENT_AREA, curNode); + locationId= Integer.parseInt(householdLocation); providerId = Integer.toString(MobileFormEntryUtil.getProviderId(xp.evaluate(MobileFormEntryConstants.ENCOUNTER_PROVIDER, curNode))); // check household identifier and gps were entered correctly if (StringUtils.isBlank(householdIdentifier) || StringUtils.isBlank(householdGps)) { @@ -73,7 +78,7 @@ private void processMobileForm(MobileFormQueue queue) throws APIException { saveFormInError(queue.getFileSystemUrl()); mfes.saveErrorInDatabase(MobileFormEntryUtil. createError(getFormName(queue.getFileSystemUrl()), "Error processing household", - "This household has no identifier or GPS specified", providerId )); + "This household has no identifier or GPS specified", providerId,locationId )); return; } @@ -87,7 +92,7 @@ private void processMobileForm(MobileFormQueue queue) throws APIException { saveFormInError(queue.getFileSystemUrl()); mfes.saveErrorInDatabase(MobileFormEntryUtil. createError(getFormName(queue.getFileSystemUrl()), "Error processing household", - "A duplicate household different from this one exists with the same identifier (" + householdIdentifier + ")", providerId )); + "A duplicate household different from this one exists with the same identifier (" + householdIdentifier + ")", providerId,locationId )); } else { // get or create household @@ -121,7 +126,7 @@ private void processMobileForm(MobileFormQueue queue) throws APIException { //put file in error table and move it to error directory saveFormInError(queue.getFileSystemUrl()); mfes.saveErrorInDatabase(MobileFormEntryUtil. - createError(getFormName(queue.getFileSystemUrl()), "Error Parsing household form", t.getMessage(), providerId )); + createError(getFormName(queue.getFileSystemUrl()), "Error Parsing household form", t.getMessage(), providerId,locationId )); } } diff --git a/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormSplitProcessor.java b/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormSplitProcessor.java index 3fda66f..05b6f22 100644 --- a/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormSplitProcessor.java +++ b/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormSplitProcessor.java @@ -35,7 +35,6 @@ public class MobileFormSplitProcessor { private static final DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance(); private DocumentBuilder docBuilder; private MobileFormEntryService mobileService; - public MobileFormSplitProcessor(){ try{ docBuilder = docBuilderFactory.newDocumentBuilder(); @@ -53,6 +52,7 @@ public MobileFormSplitProcessor(){ private boolean splitMobileForm(MobileFormQueue queue) throws APIException { String formData = queue.getFormData(); String providerId=null; + Integer locationId=0; try { docBuilder = docBuilderFactory.newDocumentBuilder(); Document doc = docBuilder.parse(IOUtils.toInputStream(formData)); @@ -64,7 +64,7 @@ private boolean splitMobileForm(MobileFormQueue queue) throws APIException { //Move form to error queue saveFormInError(queue.getFileSystemUrl()); mobileService.saveErrorInDatabase(MobileFormEntryUtil. - createError(getFormName(queue.getFileSystemUrl()), "Error splitting document", t.getMessage(),providerId)); + createError(getFormName(queue.getFileSystemUrl()), "Error splitting document", t.getMessage(),providerId,locationId)); return false; } return true; diff --git a/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormUploadProcessor.java b/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormUploadProcessor.java index 1b84696..e22ff7d 100644 --- a/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormUploadProcessor.java +++ b/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormUploadProcessor.java @@ -62,6 +62,7 @@ public MobileFormUploadProcessor() { private void processSplitForm(String filePath, MobileFormQueue queue) throws APIException { log.debug("Sending splitted mobile forms to the xform module"); String providerId=null; + Integer locationId =0; try { String formData = queue.getFormData(); docBuilder = docBuilderFactory.newDocumentBuilder(); @@ -80,6 +81,8 @@ private void processSplitForm(String filePath, MobileFormQueue queue) throws API curNode = (Node) xp.evaluate(MobileFormEntryConstants.ENCOUNTER_NODE, doc, XPathConstants.NODE); Integer intProvider = MobileFormEntryUtil.getProviderId(xp.evaluate(MobileFormEntryConstants.ENCOUNTER_PROVIDER, curNode)); providerId=intProvider.toString(); + String householdLocation = xp.evaluate(MobileFormEntryConstants.PATIENT_CATCHMENT_AREA, curNode); + locationId = Integer.parseInt(householdLocation); //Ensure there is a patient identifier in the form and // if without names just delete the form if (MobileFormEntryUtil.getPatientIdentifier(doc) == null || MobileFormEntryUtil.getPatientIdentifier(doc).trim() == "") { @@ -91,7 +94,7 @@ private void processSplitForm(String filePath, MobileFormQueue queue) throws API // form has no patient identifier but has names : move to error saveFormInError(filePath); mobileService.saveErrorInDatabase(MobileFormEntryUtil.createError(getFormName(filePath), "Error processing patient", - "Patient has no identifier, or the identifier provided is invalid",providerId)); + "Patient has no identifier, or the identifier provided is invalid",providerId,locationId)); } return; } @@ -100,7 +103,7 @@ private void processSplitForm(String filePath, MobileFormQueue queue) throws API if (familyName == null || familyName.trim() == "" || givenName == null || givenName == "") { saveFormInError(filePath); mobileService.saveErrorInDatabase(MobileFormEntryUtil.createError(getFormName(filePath), "Error processing patient", - "Patient has no valid names specified, Family Name and Given Name are required",providerId)); + "Patient has no valid names specified, Family Name and Given Name are required",providerId,locationId)); return; } @@ -110,11 +113,11 @@ private void processSplitForm(String filePath, MobileFormQueue queue) throws API // form has no valid provider : move to error saveFormInError(filePath); mobileService.saveErrorInDatabase(MobileFormEntryUtil.createError(getFormName(filePath), "Error processing patient form", - "Provider for this encounter is not provided, or the provider identifier provided is invalid",providerId)); + "Provider for this encounter is not provided, or the provider identifier provided is invalid",providerId,locationId)); return; } else { XFormEditor.editNode(filePath, - MobileFormEntryConstants.ENCOUNTER_NODE + "/" + MobileFormEntryConstants.ENCOUNTER_PROVIDER, providerId); + MobileFormEntryConstants.ENCOUNTER_NODE + "/" + MobileFormEntryConstants.ENCOUNTER_PROVIDER,providerId); } // ensure patient has birth date @@ -122,7 +125,7 @@ private void processSplitForm(String filePath, MobileFormQueue queue) throws API Integer yearOfBirth = MobileFormEntryUtil.getBirthDateFromAge(doc); if (yearOfBirth == null) {//patient has no valid birth-date saveFormInError(filePath); - mobileService.saveErrorInDatabase(MobileFormEntryUtil.createError(getFormName(filePath), "Error processing patient", "Patient has no valid Birthdate",providerId)); + mobileService.saveErrorInDatabase(MobileFormEntryUtil.createError(getFormName(filePath), "Error processing patient", "Patient has no valid Birthdate",providerId,locationId)); return; } else { //fix birth-date from age @@ -137,7 +140,7 @@ private void processSplitForm(String filePath, MobileFormQueue queue) throws API if (householdId == null || householdId.trim() == "" || MobileFormEntryUtil.isNewHousehold(householdId)) { saveFormInError(filePath); mobileService.saveErrorInDatabase(MobileFormEntryUtil.createError(getFormName(filePath), "Error processing patient", - "Patient is not linked to household or household Id provided is invalid",providerId)); + "Patient is not linked to household or household Id provided is invalid",providerId,locationId)); return; } @@ -158,7 +161,7 @@ private void processSplitForm(String filePath, MobileFormQueue queue) throws API sb.append("."); mobileService.saveErrorInDatabase(MobileFormEntryUtil.createError(getFormName(filePath), - "Error processing patient", sb.toString(),providerId)); + "Error processing patient", sb.toString(),providerId,locationId)); return; } } @@ -180,7 +183,7 @@ private void processSplitForm(String filePath, MobileFormQueue queue) throws API log.error("Error while sending form to xform module", t); //put file in error queue saveFormInError(filePath); - mobileService.saveErrorInDatabase(MobileFormEntryUtil.createError(getFormName(filePath), "Error sending form to xform module", t.getMessage(),providerId)); + mobileService.saveErrorInDatabase(MobileFormEntryUtil.createError(getFormName(filePath), "Error sending form to xform module", t.getMessage(),providerId,locationId)); } } diff --git a/api/src/main/java/org/openmrs/module/amrsmobileforms/db/hibernate/HibernateMobileFormEntryDAO.java b/api/src/main/java/org/openmrs/module/amrsmobileforms/db/hibernate/HibernateMobileFormEntryDAO.java index babef48..f861069 100755 --- a/api/src/main/java/org/openmrs/module/amrsmobileforms/db/hibernate/HibernateMobileFormEntryDAO.java +++ b/api/src/main/java/org/openmrs/module/amrsmobileforms/db/hibernate/HibernateMobileFormEntryDAO.java @@ -204,6 +204,7 @@ private Criteria getErrorCriteria(String query) { Criterion disjunction = Restrictions.disjunction() .add(Restrictions.sqlRestriction("mobile_formentry_error_id like '" + idQuery + "'")) .add(Restrictions.like("providerId", query, MatchMode.ANYWHERE)) + .add(Restrictions.like("locationId", query, MatchMode.ANYWHERE)) .add(Restrictions.like("error", query, MatchMode.ANYWHERE)) .add(Restrictions.like("errorDetails", query, MatchMode.ANYWHERE)) .add(Restrictions.like("formName", query, MatchMode.ANYWHERE)); diff --git a/api/src/main/java/org/openmrs/module/amrsmobileforms/util/MobileFormEntryUtil.java b/api/src/main/java/org/openmrs/module/amrsmobileforms/util/MobileFormEntryUtil.java index d3a430d..f9ccd51 100755 --- a/api/src/main/java/org/openmrs/module/amrsmobileforms/util/MobileFormEntryUtil.java +++ b/api/src/main/java/org/openmrs/module/amrsmobileforms/util/MobileFormEntryUtil.java @@ -17,6 +17,7 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.openmrs.Patient; +import org.openmrs.Location; import org.openmrs.Person; import org.openmrs.User; import org.openmrs.api.AdministrationService; @@ -275,7 +276,7 @@ public static boolean isNewLink(Integer patientId) { return false; } - public static MobileFormEntryError createError(String formName, String error, String errorDetails,String providerId) { + public static MobileFormEntryError createError(String formName, String error, String errorDetails,String providerId, Integer locationId) { MobileFormEntryError mobileFormEntryError = new MobileFormEntryError(); mobileFormEntryError.setProviderId(providerId); mobileFormEntryError.setFormName(formName); @@ -630,7 +631,7 @@ public static Integer getProviderId(String userName) { return null; } - /** + /** * Deletes a file specified by form path */ public static void deleteFile(String filePath) { diff --git a/api/src/main/resources/MobileFormEntryError.hbm.xml b/api/src/main/resources/MobileFormEntryError.hbm.xml index 7fe929a..b7c72f2 100644 --- a/api/src/main/resources/MobileFormEntryError.hbm.xml +++ b/api/src/main/resources/MobileFormEntryError.hbm.xml @@ -14,6 +14,8 @@ + diff --git a/api/src/main/resources/liquibase.xml b/api/src/main/resources/liquibase.xml index 329f1a8..932921c 100644 --- a/api/src/main/resources/liquibase.xml +++ b/api/src/main/resources/liquibase.xml @@ -74,6 +74,19 @@ + + + + + + + + Creating a column that will hold the location of the household or individual + + + + + \ No newline at end of file diff --git a/omod/src/main/java/org/openmrs/module/amrsmobileforms/web/controller/ResolveErrorsController.java b/omod/src/main/java/org/openmrs/module/amrsmobileforms/web/controller/ResolveErrorsController.java index bc7a129..d4fdfde 100644 --- a/omod/src/main/java/org/openmrs/module/amrsmobileforms/web/controller/ResolveErrorsController.java +++ b/omod/src/main/java/org/openmrs/module/amrsmobileforms/web/controller/ResolveErrorsController.java @@ -451,10 +451,10 @@ Map getErrorBatchAsJson( for (MobileFormEntryError error : errors) { results.add(generateObjectMap(error)); } - // build the response - Map response = new HashMap(); - response.put("iTotalRecords", mfs.countErrors(null)); + Map response; + response = new HashMap(); + response.put("iTotalRecords", mfs.countErrors(null)); response.put("iTotalDisplayRecords", mfs.countErrors(sSearch)); response.put("sEcho", sEcho); response.put("aaData", results.toArray()); @@ -475,7 +475,7 @@ private Map generateObjectMap(MobileFormEntryError error) { MobileFormEntryErrorModel errorModel = new MobileFormEntryErrorModel(error, getFormType( error.getFormName())); Map result = new HashMap(); result.put("id", error.getMobileFormEntryErrorId()); - result.put("location", errorModel.getLocation()); + result.put("location", error.getLocationId()); result.put("provider", error.getProviderId()); result.put("error", error.getError()); result.put("errorDetails", error.getErrorDetails()); From 1f2601dabeab37014d65d6b0eff8854f974010f5 Mon Sep 17 00:00:00 2001 From: alfayo-dev Date: Thu, 14 Mar 2013 09:32:23 +0300 Subject: [PATCH 06/12] Revised Location and provider identification and saving approach --- .../MobileFormEntryConstants.java | 2 +- .../amrsmobileforms/MobileFormEntryError.java | 6 +++--- .../MobileFormHouseholdLinksProcessor.java | 10 ++++++--- .../MobileFormQueueProcessor.java | 9 +++++--- .../MobileFormSplitProcessor.java | 2 +- .../MobileFormUploadProcessor.java | 16 ++++++++++---- .../util/MobileFormEntryUtil.java | 21 ++++++++++++++++--- 7 files changed, 48 insertions(+), 18 deletions(-) diff --git a/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormEntryConstants.java b/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormEntryConstants.java index 40fcdb5..ff34284 100755 --- a/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormEntryConstants.java +++ b/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormEntryConstants.java @@ -89,7 +89,7 @@ public class MobileFormEntryConstants { /** The survey nodes prefix. */ public final static String SURVEY_PREFIX = "/form/survey"; - /** The household nodes prefix. */ + /** The household nodes prefix. */ public final static String HOUSEHOLD_PREFIX = "/form/household"; /** The economics nodes prefix. */ diff --git a/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormEntryError.java b/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormEntryError.java index e46b95d..babd59d 100644 --- a/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormEntryError.java +++ b/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormEntryError.java @@ -15,7 +15,7 @@ public class MobileFormEntryError extends BaseOpenmrsObject implements Auditable private Integer mobileFormEntryErrorId; private String providerId; - private Integer locationId; + private String locationId; private String formName; private String error; private String errorDetails; @@ -118,7 +118,7 @@ public void setProviderId(String providerId) { /** * @return Returns the Location Id */ - public Integer getLocationId() { + public String getLocationId() { return locationId; } @@ -126,7 +126,7 @@ public Integer getLocationId() { * @param Location Id * The formData to set. */ - public void setLocationId(Integer locationId) { + public void setLocationId(String locationId) { this.locationId = locationId; } /** diff --git a/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormHouseholdLinksProcessor.java b/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormHouseholdLinksProcessor.java index ac65c3a..b8bddb8 100644 --- a/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormHouseholdLinksProcessor.java +++ b/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormHouseholdLinksProcessor.java @@ -58,7 +58,7 @@ public MobileFormHouseholdLinksProcessor() { private void processPendingLinkForm(String filePath, MobileFormQueue queue) throws APIException { log.debug("Linking Patient to household"); String providerId=null; - Integer locationId=0; + String locationId=null; try { String formData = queue.getFormData(); docBuilder = docBuilderFactory.newDocumentBuilder(); @@ -71,10 +71,14 @@ private void processPendingLinkForm(String filePath, MobileFormQueue queue) thro String householdId = xp.evaluate(MobileFormEntryConstants.PATIENT_HOUSEHOLD_IDENTIFIER, curNode); providerId = Integer.toString(MobileFormEntryUtil.getProviderId(xp.evaluate(MobileFormEntryConstants.ENCOUNTER_PROVIDER, curNode))); String householdLocation = xp.evaluate(MobileFormEntryConstants.PATIENT_CATCHMENT_AREA, curNode); - locationId = locationId = Integer.parseInt(householdLocation); + //find provider Id from the document + Node surveyNode = (Node) xp.evaluate(MobileFormEntryConstants.SURVEY_PREFIX, doc, XPathConstants.NODE); + providerId = Integer.toString(MobileFormEntryUtil.getProviderId(xp.evaluate(MobileFormEntryConstants.SURVEY_PROVIDER_ID, surveyNode))); + + //Clean location id by removing decimal points + locationId=MobileFormEntryUtil.cleanLocationEntry(householdLocation) ; - //String providerId=Integer.toString(intProviderId); // First Ensure there is at least a patient identifier in the form if (!StringUtils.hasText(MobileFormEntryUtil.getPatientIdentifier(doc))) { // form has no patient identifier : move to error diff --git a/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormQueueProcessor.java b/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormQueueProcessor.java index 76092de..473aa1f 100755 --- a/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormQueueProcessor.java +++ b/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormQueueProcessor.java @@ -59,7 +59,7 @@ private void processMobileForm(MobileFormQueue queue) throws APIException { String householdGps = null; MobileFormEntryService mfes = (MobileFormEntryService) Context.getService(MobileFormEntryService.class); String providerId=null; - Integer locationId=0; + String locationId=null; try { docBuilder = docBuilderFactory.newDocumentBuilder(); @@ -70,8 +70,11 @@ private void processMobileForm(MobileFormQueue queue) throws APIException { householdIdentifier = xp.evaluate(MobileFormEntryConstants.HOUSEHOLD_META_HOUSEHOLD_ID, curNode); householdGps = xp.evaluate(MobileFormEntryConstants.HOUSEHOLD_META_GPS_LOCATION, curNode); String householdLocation = xp.evaluate(MobileFormEntryConstants.PATIENT_CATCHMENT_AREA, curNode); - locationId= Integer.parseInt(householdLocation); - providerId = Integer.toString(MobileFormEntryUtil.getProviderId(xp.evaluate(MobileFormEntryConstants.ENCOUNTER_PROVIDER, curNode))); + + Node surveyNode = (Node) xp.evaluate(MobileFormEntryConstants.SURVEY_PREFIX, doc, XPathConstants.NODE); + locationId=MobileFormEntryUtil.cleanLocationEntry(householdLocation) ; + + providerId = Integer.toString(MobileFormEntryUtil.getProviderId(xp.evaluate(MobileFormEntryConstants.SURVEY_PROVIDER_ID, surveyNode))); // check household identifier and gps were entered correctly if (StringUtils.isBlank(householdIdentifier) || StringUtils.isBlank(householdGps)) { log.debug("Null household identifier or GPS"); diff --git a/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormSplitProcessor.java b/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormSplitProcessor.java index 05b6f22..0565b3a 100644 --- a/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormSplitProcessor.java +++ b/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormSplitProcessor.java @@ -52,7 +52,7 @@ public MobileFormSplitProcessor(){ private boolean splitMobileForm(MobileFormQueue queue) throws APIException { String formData = queue.getFormData(); String providerId=null; - Integer locationId=0; + String locationId=null; try { docBuilder = docBuilderFactory.newDocumentBuilder(); Document doc = docBuilder.parse(IOUtils.toInputStream(formData)); diff --git a/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormUploadProcessor.java b/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormUploadProcessor.java index e22ff7d..3813c6b 100644 --- a/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormUploadProcessor.java +++ b/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormUploadProcessor.java @@ -62,7 +62,7 @@ public MobileFormUploadProcessor() { private void processSplitForm(String filePath, MobileFormQueue queue) throws APIException { log.debug("Sending splitted mobile forms to the xform module"); String providerId=null; - Integer locationId =0; + String locationId =null; try { String formData = queue.getFormData(); docBuilder = docBuilderFactory.newDocumentBuilder(); @@ -78,11 +78,19 @@ private void processSplitForm(String filePath, MobileFormQueue queue) throws API String givenName = xp.evaluate(MobileFormEntryConstants.PATIENT_GIVENNAME, curNode); String middleName = xp.evaluate(MobileFormEntryConstants.PATIENT_MIDDLENAME, curNode); - curNode = (Node) xp.evaluate(MobileFormEntryConstants.ENCOUNTER_NODE, doc, XPathConstants.NODE); + /* curNode = (Node) xp.evaluate(MobileFormEntryConstants.ENCOUNTER_NODE, doc, XPathConstants.NODE); Integer intProvider = MobileFormEntryUtil.getProviderId(xp.evaluate(MobileFormEntryConstants.ENCOUNTER_PROVIDER, curNode)); - providerId=intProvider.toString(); + providerId=intProvider.toString();*/ String householdLocation = xp.evaluate(MobileFormEntryConstants.PATIENT_CATCHMENT_AREA, curNode); - locationId = Integer.parseInt(householdLocation); + + //Clean location id by removing decimal points + locationId=MobileFormEntryUtil.cleanLocationEntry(householdLocation) ; + + //find provider Id from the document + Node surveyNode = (Node) xp.evaluate(MobileFormEntryConstants.SURVEY_PREFIX, doc, XPathConstants.NODE); + providerId = Integer.toString(MobileFormEntryUtil.getProviderId(xp.evaluate(MobileFormEntryConstants.SURVEY_PROVIDER_ID, surveyNode))); + + //Ensure there is a patient identifier in the form and // if without names just delete the form if (MobileFormEntryUtil.getPatientIdentifier(doc) == null || MobileFormEntryUtil.getPatientIdentifier(doc).trim() == "") { diff --git a/api/src/main/java/org/openmrs/module/amrsmobileforms/util/MobileFormEntryUtil.java b/api/src/main/java/org/openmrs/module/amrsmobileforms/util/MobileFormEntryUtil.java index f9ccd51..bfafdf8 100755 --- a/api/src/main/java/org/openmrs/module/amrsmobileforms/util/MobileFormEntryUtil.java +++ b/api/src/main/java/org/openmrs/module/amrsmobileforms/util/MobileFormEntryUtil.java @@ -276,15 +276,30 @@ public static boolean isNewLink(Integer patientId) { return false; } - public static MobileFormEntryError createError(String formName, String error, String errorDetails,String providerId, Integer locationId) { + public static MobileFormEntryError createError(String formName, String error, String errorDetails,String providerId, String locationId) { MobileFormEntryError mobileFormEntryError = new MobileFormEntryError(); - mobileFormEntryError.setProviderId(providerId); mobileFormEntryError.setFormName(formName); mobileFormEntryError.setError(error); mobileFormEntryError.setErrorDetails(errorDetails); + mobileFormEntryError.setProviderId(providerId); + mobileFormEntryError.setLocationId(locationId); return mobileFormEntryError; } - + public static String cleanLocationEntry(String householdLocation) { + householdLocation=householdLocation.trim(); + String locationId=null; + if(householdLocation.length()>0) { + + String lastDec=householdLocation.substring(householdLocation.length()-2); + if (lastDec.equals(".0")) { + locationId=householdLocation.substring(0,householdLocation.length()-2); + } else { + locationId= householdLocation; + } + } + + return locationId; + } public static MobileFormHousehold getHousehold(MobileFormHousehold household, Document doc, XPath xp) throws XPathExpressionException { Node householdMetaNode = (Node) xp.evaluate(MobileFormEntryConstants.HOUSEHOLD_PREFIX + MobileFormEntryConstants.HOUSEHOLD_META_PREFIX, doc, XPathConstants.NODE); if (household == null) { From 37fd0c69f40c71e80a5abdf851e443dab5d0700c Mon Sep 17 00:00:00 2001 From: alfayo-dev Date: Thu, 21 Mar 2013 11:42:00 +0300 Subject: [PATCH 07/12] Revised Provider ID to List the actual --- .../amrsmobileforms/MobileFormHouseholdLinksProcessor.java | 5 +++-- .../module/amrsmobileforms/MobileFormQueueProcessor.java | 5 ++++- .../module/amrsmobileforms/MobileFormUploadProcessor.java | 5 +++-- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormHouseholdLinksProcessor.java b/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormHouseholdLinksProcessor.java index b8bddb8..6d14a05 100644 --- a/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormHouseholdLinksProcessor.java +++ b/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormHouseholdLinksProcessor.java @@ -74,8 +74,9 @@ private void processPendingLinkForm(String filePath, MobileFormQueue queue) thro //find provider Id from the document Node surveyNode = (Node) xp.evaluate(MobileFormEntryConstants.SURVEY_PREFIX, doc, XPathConstants.NODE); - providerId = Integer.toString(MobileFormEntryUtil.getProviderId(xp.evaluate(MobileFormEntryConstants.SURVEY_PROVIDER_ID, surveyNode))); - + //providerId = Integer.toString(MobileFormEntryUtil.getProviderId(xp.evaluate(MobileFormEntryConstants.SURVEY_PROVIDER_ID, surveyNode))); + providerId = xp.evaluate(MobileFormEntryConstants.SURVEY_PROVIDER_ID, surveyNode); + providerId=providerId.trim(); //Clean location id by removing decimal points locationId=MobileFormEntryUtil.cleanLocationEntry(householdLocation) ; diff --git a/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormQueueProcessor.java b/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormQueueProcessor.java index 473aa1f..7586886 100755 --- a/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormQueueProcessor.java +++ b/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormQueueProcessor.java @@ -74,7 +74,10 @@ private void processMobileForm(MobileFormQueue queue) throws APIException { Node surveyNode = (Node) xp.evaluate(MobileFormEntryConstants.SURVEY_PREFIX, doc, XPathConstants.NODE); locationId=MobileFormEntryUtil.cleanLocationEntry(householdLocation) ; - providerId = Integer.toString(MobileFormEntryUtil.getProviderId(xp.evaluate(MobileFormEntryConstants.SURVEY_PROVIDER_ID, surveyNode))); + // providerId = Integer.toString(MobileFormEntryUtil.getProviderId(xp.evaluate(MobileFormEntryConstants.SURVEY_PROVIDER_ID, surveyNode))); + + providerId = xp.evaluate(MobileFormEntryConstants.SURVEY_PROVIDER_ID, surveyNode); + providerId=providerId.trim(); // check household identifier and gps were entered correctly if (StringUtils.isBlank(householdIdentifier) || StringUtils.isBlank(householdGps)) { log.debug("Null household identifier or GPS"); diff --git a/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormUploadProcessor.java b/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormUploadProcessor.java index 3813c6b..4ac6fe5 100644 --- a/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormUploadProcessor.java +++ b/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormUploadProcessor.java @@ -88,9 +88,10 @@ private void processSplitForm(String filePath, MobileFormQueue queue) throws API //find provider Id from the document Node surveyNode = (Node) xp.evaluate(MobileFormEntryConstants.SURVEY_PREFIX, doc, XPathConstants.NODE); - providerId = Integer.toString(MobileFormEntryUtil.getProviderId(xp.evaluate(MobileFormEntryConstants.SURVEY_PROVIDER_ID, surveyNode))); - + //providerId = Integer.toString(MobileFormEntryUtil.getProviderId(xp.evaluate(MobileFormEntryConstants.SURVEY_PROVIDER_ID, surveyNode))); + providerId = xp.evaluate(MobileFormEntryConstants.SURVEY_PROVIDER_ID, surveyNode); + providerId=providerId.trim(); //Ensure there is a patient identifier in the form and // if without names just delete the form if (MobileFormEntryUtil.getPatientIdentifier(doc) == null || MobileFormEntryUtil.getPatientIdentifier(doc).trim() == "") { From 03f55a810de2206a078d84df1ace3316688c5838 Mon Sep 17 00:00:00 2001 From: Jeremy Keiper Date: Tue, 14 May 2013 15:07:05 -0400 Subject: [PATCH 08/12] MOB-29 - cleaning up code, integrating with other branches --- .../MobileFormEntryErrorModel.java | 51 +- .../MobileFormHouseholdLinksProcessor.java | 49 +- .../MobileFormQueueProcessor.java | 33 +- .../MobileFormSplitProcessor.java | 111 ++- .../MobileFormUploadProcessor.java | 45 +- .../util/MobileFormEntryUtil.java | 56 +- omod/src/main/webapp/resolveErrors.jsp | 863 ++++++++++++++---- 7 files changed, 889 insertions(+), 319 deletions(-) diff --git a/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormEntryErrorModel.java b/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormEntryErrorModel.java index 8219c58..278b96f 100755 --- a/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormEntryErrorModel.java +++ b/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormEntryErrorModel.java @@ -25,6 +25,10 @@ public class MobileFormEntryErrorModel extends MobileFormEntryError { private String birthdate = ""; private String gender = ""; private String identifier = ""; + + //data from household meta-data section + private String totalHousehold = ""; + private String totalEligible = ""; // data from the formData encounter section private String location = ""; @@ -50,6 +54,8 @@ public MobileFormEntryErrorModel(MobileFormEntryError error, String errorType) { setError(error.getError()); setErrorDetails(error.getErrorDetails()); setDateCreated(error.getDateCreated()); + setProviderId(error.getProviderId()); + setLocationId(error.getLocationId()); //For resolve form setComment(error.getComment()); @@ -61,7 +67,7 @@ public MobileFormEntryErrorModel(MobileFormEntryError error, String errorType) { Document formDataDoc = getDocumentForErrorQueueItem(getFormName()); XPath xp = getXPathFactory().newXPath(); - if ("household".equals(errorType)) { + if ("household".equals(errorType)) { setName("Household"); setBirthdate("N/A"); setIdentifier(xp.evaluate("/form/household/meta_data/household_id", formDataDoc)); @@ -71,7 +77,10 @@ public MobileFormEntryErrorModel(MobileFormEntryError error, String errorType) { setTotalHousehold(xp.evaluate("/form/household/meta_data/total_household", formDataDoc)); setTotalEligible(xp.evaluate("/form/household/meta_data/total_eligible", formDataDoc)); - setProviderId(xp.evaluate("/form/encounter/encounter.provider_id",formDataDoc)); + + if (getProviderId() == null) + setProviderId(xp.evaluate("/form/survey/provider_id", formDataDoc)); + } else { setName(xp.evaluate("/form/patient/patient.given_name", formDataDoc) + " " + xp.evaluate("/form/patient/patient.middle_name", formDataDoc) + " " + @@ -85,7 +94,15 @@ public MobileFormEntryErrorModel(MobileFormEntryError error, String errorType) { String location = xp.evaluate("/form/encounter/encounter.location_id", formDataDoc); setLocation(location.substring(location.indexOf("^") + 1)); setEncounterDate(xp.evaluate("/form/encounter/encounter.encounter_datetime", formDataDoc)); + + setTotalHousehold("N/A"); + setTotalEligible("N/A"); + + if (getProviderId() == null) + setProviderId(xp.evaluate("/form/encounter/encounter.provider_id", formDataDoc)); } + + // common properties for both household and individual setFormModelName(xp.evaluate("/form/@name", formDataDoc)); setFormId(xp.evaluate("/form/@version", formDataDoc)); @@ -185,12 +202,14 @@ public void setLocation(String location) { public String getFormModelName() { return formModelName; } + /** * @param formModelName the formModelName to set */ public void setFormModelName(String formModelName) { this.formModelName = formModelName; } + /** * @return the formId */ @@ -213,7 +232,35 @@ public void setFormPath(String formPath) { this.formPath = formPath; } + /** + * @return the totalHousehold + */ + public String getTotalHousehold() { + return totalHousehold; + } + + /** + * @param totalHousehold the totalHousehold to set + */ + public void setTotalHousehold(String totalHousehold) { + this.totalHousehold = totalHousehold; + } + + + /** + * @return the totalEligible + */ + public String getTotalEligible() { + return totalEligible; + } + /** + * @param totalEligible the totalEligible to set + */ + public void setTotalEligible(String totalEligible) { + this.totalEligible = totalEligible; + } + /** * @return the errorType */ diff --git a/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormHouseholdLinksProcessor.java b/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormHouseholdLinksProcessor.java index 6d14a05..c89cb69 100644 --- a/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormHouseholdLinksProcessor.java +++ b/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormHouseholdLinksProcessor.java @@ -34,7 +34,7 @@ public class MobileFormHouseholdLinksProcessor { private DocumentBuilder docBuilder; private XPathFactory xPathFactory; private MobileFormEntryService mobileService; - + // allow only one running instance private static Boolean isRunning = false; @@ -57,8 +57,8 @@ public MobileFormHouseholdLinksProcessor() { */ private void processPendingLinkForm(String filePath, MobileFormQueue queue) throws APIException { log.debug("Linking Patient to household"); - String providerId=null; - String locationId=null; + String providerId = null; + String locationId = null; try { String formData = queue.getFormData(); docBuilder = docBuilderFactory.newDocumentBuilder(); @@ -66,33 +66,32 @@ private void processPendingLinkForm(String filePath, MobileFormQueue queue) thro XPath xp = xpf.newXPath(); Document doc = docBuilder.parse(IOUtils.toInputStream(formData)); - Node curNode = (Node) xp.evaluate("/form/patient", doc, XPathConstants.NODE); + Node curNode = (Node) xp.evaluate("/form/patient", doc, XPathConstants.NODE); String patientIdentifier = xp.evaluate(MobileFormEntryConstants.PATIENT_IDENTIFIER, curNode); String householdId = xp.evaluate(MobileFormEntryConstants.PATIENT_HOUSEHOLD_IDENTIFIER, curNode); - providerId = Integer.toString(MobileFormEntryUtil.getProviderId(xp.evaluate(MobileFormEntryConstants.ENCOUNTER_PROVIDER, curNode))); - String householdLocation = xp.evaluate(MobileFormEntryConstants.PATIENT_CATCHMENT_AREA, curNode); - - //find provider Id from the document - Node surveyNode = (Node) xp.evaluate(MobileFormEntryConstants.SURVEY_PREFIX, doc, XPathConstants.NODE); - //providerId = Integer.toString(MobileFormEntryUtil.getProviderId(xp.evaluate(MobileFormEntryConstants.SURVEY_PROVIDER_ID, surveyNode))); - providerId = xp.evaluate(MobileFormEntryConstants.SURVEY_PROVIDER_ID, surveyNode); - providerId=providerId.trim(); - //Clean location id by removing decimal points - locationId=MobileFormEntryUtil.cleanLocationEntry(householdLocation) ; - - // First Ensure there is at least a patient identifier in the form - if (!StringUtils.hasText(MobileFormEntryUtil.getPatientIdentifier(doc))) { - // form has no patient identifier : move to error - saveFormInError(filePath); - mobileService.saveErrorInDatabase(MobileFormEntryUtil.createError(getFormName(filePath), "Error linking patient", - "Patient has no identifier, or the identifier provided is invalid",providerId, locationId)); - return; - } + String householdLocation = xp.evaluate(MobileFormEntryConstants.PATIENT_CATCHMENT_AREA, curNode); + + //find provider Id from the document + Node surveyNode = (Node) xp.evaluate(MobileFormEntryConstants.SURVEY_PREFIX, doc, XPathConstants.NODE); + providerId = xp.evaluate(MobileFormEntryConstants.SURVEY_PROVIDER_ID, surveyNode); + providerId = providerId.trim(); + + //Clean location id by removing decimal points + locationId = MobileFormEntryUtil.cleanLocationEntry(householdLocation); + + // First Ensure there is at least a patient identifier in the form + if (!StringUtils.hasText(MobileFormEntryUtil.getPatientIdentifier(doc))) { + // form has no patient identifier : move to error + saveFormInError(filePath); + mobileService.saveErrorInDatabase(MobileFormEntryUtil.createError(getFormName(filePath), "Error linking patient", + "Patient has no identifier, or the identifier provided is invalid", providerId, locationId)); + return; + } if (!StringUtils.hasText(householdId) || MobileFormEntryUtil.isNewHousehold(householdId)) { saveFormInError(filePath); mobileService.saveErrorInDatabase(MobileFormEntryUtil.createError(getFormName(filePath), "Error linking patient", - "Patient is not linked to household or household Id provided is invalid",providerId, locationId)); + "Patient is not linked to household or household Id provided is invalid", providerId, locationId)); } else { Patient pat = MobileFormEntryUtil.getPatient(patientIdentifier); MobileFormHousehold household = mobileService.getHousehold(householdId); @@ -113,7 +112,7 @@ private void processPendingLinkForm(String filePath, MobileFormQueue queue) thro log.error("Error while linking patient to household", t); //put file in error queue saveFormInError(filePath); - mobileService.saveErrorInDatabase(MobileFormEntryUtil.createError(getFormName(filePath), "Error while linking patient to house hold", t.getMessage(),providerId, locationId)); + mobileService.saveErrorInDatabase(MobileFormEntryUtil.createError(getFormName(filePath), "Error while linking patient to house hold", t.getMessage(), providerId, locationId)); } } diff --git a/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormQueueProcessor.java b/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormQueueProcessor.java index 7586886..7b787ca 100755 --- a/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormQueueProcessor.java +++ b/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormQueueProcessor.java @@ -6,6 +6,7 @@ import javax.xml.xpath.XPath; import javax.xml.xpath.XPathConstants; import javax.xml.xpath.XPathFactory; + import org.apache.commons.io.IOUtils; import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.Log; @@ -22,12 +23,11 @@ /** * Processes Mobile forms Queue entries. - * + *

* When the processing is successful, For unsuccessful processing, the queue * entry is put in the Mobile forms error folder. * * @author Samuel Mbugua - * */ @Transactional public class MobileFormQueueProcessor { @@ -58,8 +58,8 @@ private void processMobileForm(MobileFormQueue queue) throws APIException { String householdIdentifier = null; String householdGps = null; MobileFormEntryService mfes = (MobileFormEntryService) Context.getService(MobileFormEntryService.class); - String providerId=null; - String locationId=null; + String providerId = null; + String locationId = null; try { docBuilder = docBuilderFactory.newDocumentBuilder(); @@ -69,22 +69,19 @@ private void processMobileForm(MobileFormQueue queue) throws APIException { Node curNode = (Node) xp.evaluate(MobileFormEntryConstants.HOUSEHOLD_PREFIX + MobileFormEntryConstants.HOUSEHOLD_META_PREFIX, doc, XPathConstants.NODE); householdIdentifier = xp.evaluate(MobileFormEntryConstants.HOUSEHOLD_META_HOUSEHOLD_ID, curNode); householdGps = xp.evaluate(MobileFormEntryConstants.HOUSEHOLD_META_GPS_LOCATION, curNode); - String householdLocation = xp.evaluate(MobileFormEntryConstants.PATIENT_CATCHMENT_AREA, curNode); - - Node surveyNode = (Node) xp.evaluate(MobileFormEntryConstants.SURVEY_PREFIX, doc, XPathConstants.NODE); - locationId=MobileFormEntryUtil.cleanLocationEntry(householdLocation) ; + String householdLocation = xp.evaluate(MobileFormEntryConstants.PATIENT_CATCHMENT_AREA, curNode); - // providerId = Integer.toString(MobileFormEntryUtil.getProviderId(xp.evaluate(MobileFormEntryConstants.SURVEY_PROVIDER_ID, surveyNode))); + Node surveyNode = (Node) xp.evaluate(MobileFormEntryConstants.SURVEY_PREFIX, doc, XPathConstants.NODE); + locationId = MobileFormEntryUtil.cleanLocationEntry(householdLocation); + providerId = xp.evaluate(MobileFormEntryConstants.SURVEY_PROVIDER_ID, surveyNode).trim(); - providerId = xp.evaluate(MobileFormEntryConstants.SURVEY_PROVIDER_ID, surveyNode); - providerId=providerId.trim(); // check household identifier and gps were entered correctly if (StringUtils.isBlank(householdIdentifier) || StringUtils.isBlank(householdGps)) { log.debug("Null household identifier or GPS"); saveFormInError(queue.getFileSystemUrl()); mfes.saveErrorInDatabase(MobileFormEntryUtil. - createError(getFormName(queue.getFileSystemUrl()), "Error processing household", - "This household has no identifier or GPS specified", providerId,locationId )); + createError(getFormName(queue.getFileSystemUrl()), "Error processing household", + "This household has no identifier or GPS specified", providerId, locationId)); return; } @@ -92,13 +89,13 @@ private void processMobileForm(MobileFormQueue queue) throws APIException { //Search for the identifier in the household database if (!MobileFormEntryUtil.isNewHousehold(householdIdentifier) - && !MobileFormEntryUtil.isSameHousehold(householdIdentifier, householdGps)) { + && !MobileFormEntryUtil.isSameHousehold(householdIdentifier, householdGps)) { log.error("household with identifier " + householdIdentifier + " has conflicting GPS coordinates: " + householdGps); saveFormInError(queue.getFileSystemUrl()); mfes.saveErrorInDatabase(MobileFormEntryUtil. - createError(getFormName(queue.getFileSystemUrl()), "Error processing household", - "A duplicate household different from this one exists with the same identifier (" + householdIdentifier + ")", providerId,locationId )); + createError(getFormName(queue.getFileSystemUrl()), "Error processing household", + "A duplicate household different from this one exists with the same identifier (" + householdIdentifier + ")", providerId, locationId)); } else { // get or create household @@ -132,7 +129,7 @@ private void processMobileForm(MobileFormQueue queue) throws APIException { //put file in error table and move it to error directory saveFormInError(queue.getFileSystemUrl()); mfes.saveErrorInDatabase(MobileFormEntryUtil. - createError(getFormName(queue.getFileSystemUrl()), "Error Parsing household form", t.getMessage(), providerId,locationId )); + createError(getFormName(queue.getFileSystemUrl()), "Error Parsing household form", t.getMessage(), providerId, locationId)); } } @@ -222,7 +219,7 @@ private String getFormName(String formPath) { /** * @return XPathFactory to be used for obtaining data from the parsed - * XML + * XML */ private XPathFactory getXPathFactory() { if (xPathFactory == null) { diff --git a/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormSplitProcessor.java b/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormSplitProcessor.java index 0565b3a..df9e245 100644 --- a/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormSplitProcessor.java +++ b/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormSplitProcessor.java @@ -5,6 +5,9 @@ import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.xpath.XPath; +import javax.xml.xpath.XPathConstants; +import javax.xml.xpath.XPathFactory; import org.apache.commons.io.IOUtils; import org.apache.commons.logging.Log; @@ -15,17 +18,17 @@ import org.openmrs.module.amrsmobileforms.util.XFormEditor; import org.springframework.transaction.annotation.Transactional; import org.w3c.dom.Document; +import org.w3c.dom.Node; /** * Processes Mobile forms Drop Queue entries. - * + *

* Splits composite forms from the drop queue * When the processing is successful, the queue entry is submitted to the Mobile form entry Queue while * the split forms are submitted to xformsEntry queue * For unsuccessful processing, the queue entry is put in the Mobile forms error folder. - * - * @author Samuel Mbugua * + * @author Samuel Mbugua */ @Transactional public class MobileFormSplitProcessor { @@ -34,46 +37,59 @@ public class MobileFormSplitProcessor { private static Boolean isRunning = false; // allow only one running private static final DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance(); private DocumentBuilder docBuilder; + private XPathFactory xPathFactory; private MobileFormEntryService mobileService; - public MobileFormSplitProcessor(){ - try{ + + public MobileFormSplitProcessor() { + try { docBuilder = docBuilderFactory.newDocumentBuilder(); this.getMobileService(); - } - catch(Exception e){ + } catch (Exception e) { log.error("Problem occurred while creating document builder", e); } } /** * Process all existing queue entries in the mobile form queue - * @param queue + * + * @param queue */ private boolean splitMobileForm(MobileFormQueue queue) throws APIException { String formData = queue.getFormData(); - String providerId=null; - String locationId=null; + String providerId = null; + String locationId = null; try { docBuilder = docBuilderFactory.newDocumentBuilder(); Document doc = docBuilder.parse(IOUtils.toInputStream(formData)); + XPathFactory xpf = getXPathFactory(); + XPath xp = xpf.newXPath(); + + // get location id for error if needed + Node curNode = (Node) xp.evaluate(MobileFormEntryConstants.HOUSEHOLD_PREFIX + MobileFormEntryConstants.HOUSEHOLD_META_PREFIX, doc, XPathConstants.NODE); + locationId = MobileFormEntryUtil.cleanLocationEntry( + xp.evaluate(MobileFormEntryConstants.PATIENT_CATCHMENT_AREA, curNode)); + + // get provider id for error if needed + curNode = (Node) xp.evaluate(MobileFormEntryConstants.SURVEY_PREFIX, doc, XPathConstants.NODE); + providerId = xp.evaluate(MobileFormEntryConstants.SURVEY_PROVIDER_ID, curNode).trim(); + log.debug("Splitting mobile xforms"); XFormEditor.createIndividualFiles(doc); - } - catch (Throwable t) { + } catch (Throwable t) { log.error("Error splitting document", t); //Move form to error queue saveFormInError(queue.getFileSystemUrl()); mobileService.saveErrorInDatabase(MobileFormEntryUtil. - createError(getFormName(queue.getFileSystemUrl()), "Error splitting document", t.getMessage(),providerId,locationId)); + createError(getFormName(queue.getFileSystemUrl()), "Error splitting document", t.getMessage(), providerId, locationId)); return false; } return true; } - + /** * Split the next pending MobileForm drop entry. If there are no pending * items in the drop_dir, this method simply returns quietly. - * + * * @return true if a queue entry was processed, false if queue was empty */ public void splitForms() { @@ -86,44 +102,41 @@ public void splitForms() { isRunning = true; } try { - mobileService= (MobileFormEntryService)Context.getService(MobileFormEntryService.class); - }catch (APIException e) { + mobileService = (MobileFormEntryService) Context.getService(MobileFormEntryService.class); + } catch (APIException e) { log.debug("MobileFormEntryService not found"); return; } - try { + try { File pendingSplitDir = MobileFormEntryUtil.getMobileFormsPendingSplitDir(); for (File file : pendingSplitDir.listFiles()) { MobileFormQueue queue = mobileService.getMobileFormEntryQueue(file.getAbsolutePath()); - + if (splitMobileForm(queue)) //Move form to archive saveFormInArchive(queue.getFileSystemUrl()); } - } - catch(Exception e){ + } catch (Exception e) { log.error("Problem occured while splitting", e); - } - finally { + } finally { isRunning = false; } } - + /** * Stores a form in a specified folder after processing. */ - private void saveForm(String oldFormPath, String newFormPath){ - try{ - if(oldFormPath != null){ - File file=new File(oldFormPath); - + private void saveForm(String oldFormPath, String newFormPath) { + try { + if (oldFormPath != null) { + File file = new File(oldFormPath); + //move the file to specified new directory file.renameTo(new File(newFormPath)); } - } - catch(Exception e){ - log.error(e.getMessage(),e); + } catch (Exception e) { + log.error(e.getMessage(), e); } } @@ -131,39 +144,51 @@ private void saveForm(String oldFormPath, String newFormPath){ /** * Archives a mobile form after successful processing */ - private void saveFormInArchive(String formPath){ - String archiveFilePath= MobileFormEntryUtil.getMobileFormsArchiveDir(new Date()).getAbsolutePath() + getFormName(formPath); + private void saveFormInArchive(String formPath) { + String archiveFilePath = MobileFormEntryUtil.getMobileFormsArchiveDir(new Date()).getAbsolutePath() + getFormName(formPath); saveForm(formPath, archiveFilePath); } - - private void saveFormInError(String formPath){ - String errorFilePath= MobileFormEntryUtil.getMobileFormsErrorDir().getAbsolutePath() + getFormName(formPath); + + private void saveFormInError(String formPath) { + String errorFilePath = MobileFormEntryUtil.getMobileFormsErrorDir().getAbsolutePath() + getFormName(formPath); saveForm(formPath, errorFilePath); } - + /** * Extracts form name from an absolute file path + * * @param formPath * @return */ private String getFormName(String formPath) { - return formPath.substring(formPath.lastIndexOf(File.separatorChar)); + return formPath.substring(formPath.lastIndexOf(File.separatorChar)); } - + /** * @return MobileFormEntryService to be used by the process */ private MobileFormEntryService getMobileService() { if (mobileService == null) { try { - mobileService= (MobileFormEntryService)Context.getService(MobileFormEntryService.class); - }catch (APIException e) { + mobileService = (MobileFormEntryService) Context.getService(MobileFormEntryService.class); + } catch (APIException e) { log.debug("MobileFormEntryService not found"); return null; } } return mobileService; } - + + /** + * @return XPathFactory to be used for obtaining data from the parsed + * XML + */ + private XPathFactory getXPathFactory() { + if (xPathFactory == null) { + xPathFactory = XPathFactory.newInstance(); + } + return xPathFactory; + } + } \ No newline at end of file diff --git a/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormUploadProcessor.java b/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormUploadProcessor.java index 4ac6fe5..675988a 100644 --- a/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormUploadProcessor.java +++ b/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormUploadProcessor.java @@ -32,7 +32,6 @@ * xforms module for processing * * @author Samuel Mbugua - * */ @Transactional public class MobileFormUploadProcessor { @@ -61,8 +60,8 @@ public MobileFormUploadProcessor() { */ private void processSplitForm(String filePath, MobileFormQueue queue) throws APIException { log.debug("Sending splitted mobile forms to the xform module"); - String providerId=null; - String locationId =null; + String providerId = null; + String locationId = null; try { String formData = queue.getFormData(); docBuilder = docBuilderFactory.newDocumentBuilder(); @@ -77,22 +76,16 @@ private void processSplitForm(String filePath, MobileFormQueue queue) throws API String familyName = xp.evaluate(MobileFormEntryConstants.PATIENT_FAMILYNAME, curNode); String givenName = xp.evaluate(MobileFormEntryConstants.PATIENT_GIVENNAME, curNode); String middleName = xp.evaluate(MobileFormEntryConstants.PATIENT_MIDDLENAME, curNode); + String householdLocation = xp.evaluate(MobileFormEntryConstants.PATIENT_CATCHMENT_AREA, curNode); - /* curNode = (Node) xp.evaluate(MobileFormEntryConstants.ENCOUNTER_NODE, doc, XPathConstants.NODE); - Integer intProvider = MobileFormEntryUtil.getProviderId(xp.evaluate(MobileFormEntryConstants.ENCOUNTER_PROVIDER, curNode)); - providerId=intProvider.toString();*/ - String householdLocation = xp.evaluate(MobileFormEntryConstants.PATIENT_CATCHMENT_AREA, curNode); - - //Clean location id by removing decimal points - locationId=MobileFormEntryUtil.cleanLocationEntry(householdLocation) ; + //Clean location id by removing decimal points + locationId = MobileFormEntryUtil.cleanLocationEntry(householdLocation); - //find provider Id from the document - Node surveyNode = (Node) xp.evaluate(MobileFormEntryConstants.SURVEY_PREFIX, doc, XPathConstants.NODE); - //providerId = Integer.toString(MobileFormEntryUtil.getProviderId(xp.evaluate(MobileFormEntryConstants.SURVEY_PROVIDER_ID, surveyNode))); + //find provider Id from the document + Node surveyNode = (Node) xp.evaluate(MobileFormEntryConstants.SURVEY_PREFIX, doc, XPathConstants.NODE); + providerId = xp.evaluate(MobileFormEntryConstants.SURVEY_PROVIDER_ID, surveyNode).trim(); - providerId = xp.evaluate(MobileFormEntryConstants.SURVEY_PROVIDER_ID, surveyNode); - providerId=providerId.trim(); - //Ensure there is a patient identifier in the form and + //Ensure there is a patient identifier in the form and // if without names just delete the form if (MobileFormEntryUtil.getPatientIdentifier(doc) == null || MobileFormEntryUtil.getPatientIdentifier(doc).trim() == "") { if ((familyName == null || familyName.trim() == "") @@ -103,7 +96,7 @@ private void processSplitForm(String filePath, MobileFormQueue queue) throws API // form has no patient identifier but has names : move to error saveFormInError(filePath); mobileService.saveErrorInDatabase(MobileFormEntryUtil.createError(getFormName(filePath), "Error processing patient", - "Patient has no identifier, or the identifier provided is invalid",providerId,locationId)); + "Patient has no identifier, or the identifier provided is invalid", providerId, locationId)); } return; } @@ -112,21 +105,21 @@ private void processSplitForm(String filePath, MobileFormQueue queue) throws API if (familyName == null || familyName.trim() == "" || givenName == null || givenName == "") { saveFormInError(filePath); mobileService.saveErrorInDatabase(MobileFormEntryUtil.createError(getFormName(filePath), "Error processing patient", - "Patient has no valid names specified, Family Name and Given Name are required",providerId,locationId)); + "Patient has no valid names specified, Family Name and Given Name are required", providerId, locationId)); return; } // Ensure there is a valid provider id or name and return provider_id in the form - if ((providerId) == null) { + if (providerId == null) { // form has no valid provider : move to error saveFormInError(filePath); mobileService.saveErrorInDatabase(MobileFormEntryUtil.createError(getFormName(filePath), "Error processing patient form", - "Provider for this encounter is not provided, or the provider identifier provided is invalid",providerId,locationId)); + "Provider for this encounter is not provided, or the provider identifier provided is invalid", providerId, locationId)); return; } else { XFormEditor.editNode(filePath, - MobileFormEntryConstants.ENCOUNTER_NODE + "/" + MobileFormEntryConstants.ENCOUNTER_PROVIDER,providerId); + MobileFormEntryConstants.ENCOUNTER_NODE + "/" + MobileFormEntryConstants.ENCOUNTER_PROVIDER, providerId); } // ensure patient has birth date @@ -134,7 +127,7 @@ private void processSplitForm(String filePath, MobileFormQueue queue) throws API Integer yearOfBirth = MobileFormEntryUtil.getBirthDateFromAge(doc); if (yearOfBirth == null) {//patient has no valid birth-date saveFormInError(filePath); - mobileService.saveErrorInDatabase(MobileFormEntryUtil.createError(getFormName(filePath), "Error processing patient", "Patient has no valid Birthdate",providerId,locationId)); + mobileService.saveErrorInDatabase(MobileFormEntryUtil.createError(getFormName(filePath), "Error processing patient", "Patient has no valid Birthdate", providerId, locationId)); return; } else { //fix birth-date from age @@ -149,7 +142,7 @@ private void processSplitForm(String filePath, MobileFormQueue queue) throws API if (householdId == null || householdId.trim() == "" || MobileFormEntryUtil.isNewHousehold(householdId)) { saveFormInError(filePath); mobileService.saveErrorInDatabase(MobileFormEntryUtil.createError(getFormName(filePath), "Error processing patient", - "Patient is not linked to household or household Id provided is invalid",providerId,locationId)); + "Patient is not linked to household or household Id provided is invalid", providerId, locationId)); return; } @@ -170,7 +163,7 @@ private void processSplitForm(String filePath, MobileFormQueue queue) throws API sb.append("."); mobileService.saveErrorInDatabase(MobileFormEntryUtil.createError(getFormName(filePath), - "Error processing patient", sb.toString(),providerId,locationId)); + "Error processing patient", sb.toString(), providerId, locationId)); return; } } @@ -192,7 +185,7 @@ private void processSplitForm(String filePath, MobileFormQueue queue) throws API log.error("Error while sending form to xform module", t); //put file in error queue saveFormInError(filePath); - mobileService.saveErrorInDatabase(MobileFormEntryUtil.createError(getFormName(filePath), "Error sending form to xform module", t.getMessage(),providerId,locationId)); + mobileService.saveErrorInDatabase(MobileFormEntryUtil.createError(getFormName(filePath), "Error sending form to xform module", t.getMessage(), providerId, locationId)); } } @@ -200,7 +193,7 @@ private void processSplitForm(String filePath, MobileFormQueue queue) throws API * check for a match of name parts against the names from a given patient * * @param providedNames the list of name parts to check against - * @param personNames set of PersonName objects for review + * @param personNames set of PersonName objects for review * @return whether a name part from the set of PersonNames matches one from the first list * @should return true when only one name part is found in a person name * @should return true when more than one name part matches diff --git a/api/src/main/java/org/openmrs/module/amrsmobileforms/util/MobileFormEntryUtil.java b/api/src/main/java/org/openmrs/module/amrsmobileforms/util/MobileFormEntryUtil.java index bfafdf8..39355c2 100755 --- a/api/src/main/java/org/openmrs/module/amrsmobileforms/util/MobileFormEntryUtil.java +++ b/api/src/main/java/org/openmrs/module/amrsmobileforms/util/MobileFormEntryUtil.java @@ -49,7 +49,7 @@ public class MobileFormEntryUtil { public static File getMobileFormsResourcesDir() { AdministrationService as = Context.getAdministrationService(); String folderName = as.getGlobalProperty(MobileFormEntryConstants.GP_MOBILE_FORMS_RESOURCES_DIR, - MobileFormEntryConstants.GP_MOBILE_FORMS_RESOURCES_DIR_DEFAULT); + MobileFormEntryConstants.GP_MOBILE_FORMS_RESOURCES_DIR_DEFAULT); File mobileFormsErrorDir = OpenmrsUtil.getDirectoryInApplicationDataDirectory(folderName); if (log.isDebugEnabled()) { log.debug("Loaded mobile forms resources directory from global properties: " + mobileFormsErrorDir.getAbsolutePath()); @@ -91,7 +91,7 @@ public static File getMobileFormsSyncLogDir() { public static File getMobileFormsErrorDir() { AdministrationService as = Context.getAdministrationService(); String folderName = as.getGlobalProperty(MobileFormEntryConstants.GP_MOBILE_FORMS_ERROR_DIR, - MobileFormEntryConstants.GP_MOBILE_FORMS_ERROR_DIR_DEFAULT); + MobileFormEntryConstants.GP_MOBILE_FORMS_ERROR_DIR_DEFAULT); File mobileFormsErrorDir = OpenmrsUtil.getDirectoryInApplicationDataDirectory(folderName); if (log.isDebugEnabled()) { log.debug("Loaded mobile forms error directory from global properties: " + mobileFormsErrorDir.getAbsolutePath()); @@ -154,7 +154,7 @@ public static File getMobileFormsPostProcessDir() { public static File getMobileFormsDropDir() { AdministrationService as = Context.getAdministrationService(); String folderName = as.getGlobalProperty(MobileFormEntryConstants.GP_MOBILE_FORMS_DROP_DIR, - MobileFormEntryConstants.GP_MOBILE_FORMS_DROP_DIR_DEFAULT); + MobileFormEntryConstants.GP_MOBILE_FORMS_DROP_DIR_DEFAULT); File mobileFormsDropDir = OpenmrsUtil.getDirectoryInApplicationDataDirectory(folderName); if (log.isDebugEnabled()) { log.debug("Loaded mobile forms drop queue directory from global properties: " + mobileFormsDropDir.getAbsolutePath()); @@ -166,7 +166,7 @@ public static File getMobileFormsDropDir() { public static File getMobileFormsQueueDir() { AdministrationService as = Context.getAdministrationService(); String folderName = as.getGlobalProperty(MobileFormEntryConstants.GP_MOBILE_FORMS_QUEUE_DIR, - MobileFormEntryConstants.GP_MOBILE_FORMS_QUEUE_DIR_DEFAULT); + MobileFormEntryConstants.GP_MOBILE_FORMS_QUEUE_DIR_DEFAULT); File mobileFormQueueDir = OpenmrsUtil.getDirectoryInApplicationDataDirectory(folderName); if (log.isDebugEnabled()) { log.debug("Loaded mobile forms queue directory from global properties: " + mobileFormQueueDir.getAbsolutePath()); @@ -181,7 +181,7 @@ public static File getMobileFormsQueueDir() { * with week of the year Replaces %W with week of the month * * @param str String filename containing variables to replace with date - * strings + * strings * @return String with variables replaced */ public static String replaceVariables(String str, Date d) { @@ -252,7 +252,7 @@ public static boolean isSameHousehold(String identifier, String gpsLocation) { } return false; */ - + return (household != null); } @@ -276,30 +276,32 @@ public static boolean isNewLink(Integer patientId) { return false; } - public static MobileFormEntryError createError(String formName, String error, String errorDetails,String providerId, String locationId) { + public static MobileFormEntryError createError(String formName, String error, String errorDetails, String providerId, String locationId) { MobileFormEntryError mobileFormEntryError = new MobileFormEntryError(); mobileFormEntryError.setFormName(formName); mobileFormEntryError.setError(error); mobileFormEntryError.setErrorDetails(errorDetails); - mobileFormEntryError.setProviderId(providerId); - mobileFormEntryError.setLocationId(locationId); + mobileFormEntryError.setProviderId(providerId); + mobileFormEntryError.setLocationId(locationId); return mobileFormEntryError; } - public static String cleanLocationEntry(String householdLocation) { - householdLocation=householdLocation.trim(); - String locationId=null; - if(householdLocation.length()>0) { - - String lastDec=householdLocation.substring(householdLocation.length()-2); - if (lastDec.equals(".0")) { - locationId=householdLocation.substring(0,householdLocation.length()-2); - } else { - locationId= householdLocation; - } - } - - return locationId; - } + + public static String cleanLocationEntry(String householdLocation) { + householdLocation = householdLocation.trim(); + String locationId = null; + if (householdLocation.length() > 0) { + + String lastDec = householdLocation.substring(householdLocation.length() - 2); + if (lastDec.equals(".0")) { + locationId = householdLocation.substring(0, householdLocation.length() - 2); + } else { + locationId = householdLocation; + } + } + + return locationId; + } + public static MobileFormHousehold getHousehold(MobileFormHousehold household, Document doc, XPath xp) throws XPathExpressionException { Node householdMetaNode = (Node) xp.evaluate(MobileFormEntryConstants.HOUSEHOLD_PREFIX + MobileFormEntryConstants.HOUSEHOLD_META_PREFIX, doc, XPathConstants.NODE); if (household == null) { @@ -525,7 +527,7 @@ private static void setLocations(String item) { * * @param auth * @return true if authentication was successful otherwise - * false + * false */ public static boolean authenticate(String auth) { boolean authenticated = false; @@ -565,7 +567,7 @@ public static String getPatientIdentifier(Document doc) { } if ("patient_identifier".equalsIgnoreCase(((Element) child).getAttribute("openmrs_table")) - && "identifier".equalsIgnoreCase(((Element) child).getAttribute("openmrs_attribute"))) { + && "identifier".equalsIgnoreCase(((Element) child).getAttribute("openmrs_attribute"))) { return child.getTextContent(); } } @@ -646,7 +648,7 @@ public static Integer getProviderId(String userName) { return null; } - /** + /** * Deletes a file specified by form path */ public static void deleteFile(String filePath) { diff --git a/omod/src/main/webapp/resolveErrors.jsp b/omod/src/main/webapp/resolveErrors.jsp index 151a187..8036e92 100755 --- a/omod/src/main/webapp/resolveErrors.jsp +++ b/omod/src/main/webapp/resolveErrors.jsp @@ -1,198 +1,705 @@ <%@ include file="/WEB-INF/template/include.jsp" %> - + <%@ include file="/WEB-INF/template/header.jsp" %> -<%@ include file="localHeader.jsp"%> +<%@ include file="localHeader.jsp" %> - + + + + + + + + + - - -

+ + + + + +
+
Mobile Form Entry Errors -
-
- Select All in Search Results (including unseen) -     - -
-
-
- - - - - - - - - - - - - - - - -
SelectActionIDLocationProviderErrorError DetailsForm NameComment
-
-
-
+ +
+
+ Select All in Search Results + (including unseen) +     + +
+
+
+ + + + + + + + + + + + + + + + +
SelectActionIDLocationProviderErrorError DetailsForm NameComment
+
+
+
<%@ include file="/WEB-INF/template/footer.jsp" %> From fd8d0d0411624e8a72a87d12e1955e8cbcd330c2 Mon Sep 17 00:00:00 2001 From: alfayo-dev Date: Fri, 24 May 2013 16:48:03 +0300 Subject: [PATCH 09/12] Cleaned up code for adding provider id --- .../amrsmobileforms/MobileFormUploadProcessor.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormUploadProcessor.java b/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormUploadProcessor.java index 4ac6fe5..915ce98 100644 --- a/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormUploadProcessor.java +++ b/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormUploadProcessor.java @@ -44,7 +44,7 @@ public class MobileFormUploadProcessor { private MobileFormEntryService mobileService; // allow only one running instance private static Boolean isRunning = false; - + private Integer providerPerson_id; public MobileFormUploadProcessor() { try { docBuilder = docBuilderFactory.newDocumentBuilder(); @@ -87,12 +87,12 @@ private void processSplitForm(String filePath, MobileFormQueue queue) throws API locationId=MobileFormEntryUtil.cleanLocationEntry(householdLocation) ; //find provider Id from the document - Node surveyNode = (Node) xp.evaluate(MobileFormEntryConstants.SURVEY_PREFIX, doc, XPathConstants.NODE); + Node encounterNode = (Node) xp.evaluate(MobileFormEntryConstants.ENCOUNTER_NODE, doc, XPathConstants.NODE); //providerId = Integer.toString(MobileFormEntryUtil.getProviderId(xp.evaluate(MobileFormEntryConstants.SURVEY_PROVIDER_ID, surveyNode))); - - providerId = xp.evaluate(MobileFormEntryConstants.SURVEY_PROVIDER_ID, surveyNode); + providerPerson_id=MobileFormEntryUtil.getProviderId(xp.evaluate(MobileFormEntryConstants.ENCOUNTER_PROVIDER, curNode)); + providerId = xp.evaluate(MobileFormEntryConstants.ENCOUNTER_PROVIDER, encounterNode); providerId=providerId.trim(); - //Ensure there is a patient identifier in the form and + //Ensure there is a patient identifier in the form and // if without names just delete the form if (MobileFormEntryUtil.getPatientIdentifier(doc) == null || MobileFormEntryUtil.getPatientIdentifier(doc).trim() == "") { if ((familyName == null || familyName.trim() == "") @@ -126,7 +126,7 @@ private void processSplitForm(String filePath, MobileFormQueue queue) throws API return; } else { XFormEditor.editNode(filePath, - MobileFormEntryConstants.ENCOUNTER_NODE + "/" + MobileFormEntryConstants.ENCOUNTER_PROVIDER,providerId); + MobileFormEntryConstants.ENCOUNTER_NODE + "/" + MobileFormEntryConstants.ENCOUNTER_PROVIDER,providerPerson_id.toString()); } // ensure patient has birth date From 88b33ad26e1e98c724cca41eb9c48c96170b1e10 Mon Sep 17 00:00:00 2001 From: alfayo-dev Date: Tue, 28 May 2013 09:28:28 +0300 Subject: [PATCH 10/12] Cleaned code for searching location and provider --- .../MobileFormEntryConstants.java | 3 +- .../MobileFormHouseholdLinksProcessor.java | 11 ++++--- .../MobileFormUploadProcessor.java | 29 ++++++++++--------- .../util/MobileFormEntryUtil.java | 15 +++++++--- 4 files changed, 35 insertions(+), 23 deletions(-) diff --git a/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormEntryConstants.java b/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormEntryConstants.java index ff34284..31dabf3 100755 --- a/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormEntryConstants.java +++ b/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormEntryConstants.java @@ -150,7 +150,8 @@ public class MobileFormEntryConstants { public final static String ENCOUNTER_NODE = "/form/encounter"; public final static String ENCOUNTER_PROVIDER = "encounter.provider_id"; - + public final static String ENCOUNTER_LOCATION= "encounter.location_id"; + //TEMPORAL public final static String OBS_NODE = "/form/obs"; public final static String OBS_RELATIONSHIP = "relation_to_househead"; diff --git a/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormHouseholdLinksProcessor.java b/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormHouseholdLinksProcessor.java index 6d14a05..1d36d04 100644 --- a/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormHouseholdLinksProcessor.java +++ b/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormHouseholdLinksProcessor.java @@ -59,6 +59,7 @@ private void processPendingLinkForm(String filePath, MobileFormQueue queue) thro log.debug("Linking Patient to household"); String providerId=null; String locationId=null; + String householdLocation=null; try { String formData = queue.getFormData(); docBuilder = docBuilderFactory.newDocumentBuilder(); @@ -70,16 +71,18 @@ private void processPendingLinkForm(String filePath, MobileFormQueue queue) thro String patientIdentifier = xp.evaluate(MobileFormEntryConstants.PATIENT_IDENTIFIER, curNode); String householdId = xp.evaluate(MobileFormEntryConstants.PATIENT_HOUSEHOLD_IDENTIFIER, curNode); providerId = Integer.toString(MobileFormEntryUtil.getProviderId(xp.evaluate(MobileFormEntryConstants.ENCOUNTER_PROVIDER, curNode))); - String householdLocation = xp.evaluate(MobileFormEntryConstants.PATIENT_CATCHMENT_AREA, curNode); //find provider Id from the document - Node surveyNode = (Node) xp.evaluate(MobileFormEntryConstants.SURVEY_PREFIX, doc, XPathConstants.NODE); - //providerId = Integer.toString(MobileFormEntryUtil.getProviderId(xp.evaluate(MobileFormEntryConstants.SURVEY_PROVIDER_ID, surveyNode))); - providerId = xp.evaluate(MobileFormEntryConstants.SURVEY_PROVIDER_ID, surveyNode); + curNode=(Node) xp.evaluate(MobileFormEntryConstants.ENCOUNTER_NODE, doc, XPathConstants.NODE); + providerId = xp.evaluate(MobileFormEntryConstants.ENCOUNTER_PROVIDER, curNode); providerId=providerId.trim(); + + householdLocation=xp.evaluate(MobileFormEntryConstants.ENCOUNTER_LOCATION, curNode); + //Clean location id by removing decimal points locationId=MobileFormEntryUtil.cleanLocationEntry(householdLocation) ; + // First Ensure there is at least a patient identifier in the form if (!StringUtils.hasText(MobileFormEntryUtil.getPatientIdentifier(doc))) { // form has no patient identifier : move to error diff --git a/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormUploadProcessor.java b/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormUploadProcessor.java index 915ce98..8fa703a 100644 --- a/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormUploadProcessor.java +++ b/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormUploadProcessor.java @@ -63,6 +63,7 @@ private void processSplitForm(String filePath, MobileFormQueue queue) throws API log.debug("Sending splitted mobile forms to the xform module"); String providerId=null; String locationId =null; + String householdLocation=null; try { String formData = queue.getFormData(); docBuilder = docBuilderFactory.newDocumentBuilder(); @@ -78,21 +79,20 @@ private void processSplitForm(String filePath, MobileFormQueue queue) throws API String givenName = xp.evaluate(MobileFormEntryConstants.PATIENT_GIVENNAME, curNode); String middleName = xp.evaluate(MobileFormEntryConstants.PATIENT_MIDDLENAME, curNode); - /* curNode = (Node) xp.evaluate(MobileFormEntryConstants.ENCOUNTER_NODE, doc, XPathConstants.NODE); - Integer intProvider = MobileFormEntryUtil.getProviderId(xp.evaluate(MobileFormEntryConstants.ENCOUNTER_PROVIDER, curNode)); - providerId=intProvider.toString();*/ - String householdLocation = xp.evaluate(MobileFormEntryConstants.PATIENT_CATCHMENT_AREA, curNode); + + //find provider Id from the document + curNode=(Node) xp.evaluate(MobileFormEntryConstants.ENCOUNTER_NODE, doc, XPathConstants.NODE); + providerPerson_id=MobileFormEntryUtil.getProviderId(xp.evaluate(MobileFormEntryConstants.ENCOUNTER_PROVIDER, curNode)); + + providerId = xp.evaluate(MobileFormEntryConstants.ENCOUNTER_PROVIDER, curNode); + providerId=providerId.trim(); + + householdLocation=xp.evaluate(MobileFormEntryConstants.ENCOUNTER_LOCATION, curNode); //Clean location id by removing decimal points locationId=MobileFormEntryUtil.cleanLocationEntry(householdLocation) ; - //find provider Id from the document - Node encounterNode = (Node) xp.evaluate(MobileFormEntryConstants.ENCOUNTER_NODE, doc, XPathConstants.NODE); - //providerId = Integer.toString(MobileFormEntryUtil.getProviderId(xp.evaluate(MobileFormEntryConstants.SURVEY_PROVIDER_ID, surveyNode))); - providerPerson_id=MobileFormEntryUtil.getProviderId(xp.evaluate(MobileFormEntryConstants.ENCOUNTER_PROVIDER, curNode)); - providerId = xp.evaluate(MobileFormEntryConstants.ENCOUNTER_PROVIDER, encounterNode); - providerId=providerId.trim(); - //Ensure there is a patient identifier in the form and + //Ensure there is a patient identifier in the form and // if without names just delete the form if (MobileFormEntryUtil.getPatientIdentifier(doc) == null || MobileFormEntryUtil.getPatientIdentifier(doc).trim() == "") { if ((familyName == null || familyName.trim() == "") @@ -186,9 +186,10 @@ private void processSplitForm(String filePath, MobileFormQueue queue) throws API } //Finally send to xforms for processing - MobileFormEntryFileUploader.submitXFormFile(filePath); - saveFormInPendingLink(filePath); - } catch (Throwable t) { + MobileFormEntryFileUploader.submitXFormFile(filePath); + saveFormInPendingLink(filePath); + + } catch (Throwable t) { log.error("Error while sending form to xform module", t); //put file in error queue saveFormInError(filePath); diff --git a/api/src/main/java/org/openmrs/module/amrsmobileforms/util/MobileFormEntryUtil.java b/api/src/main/java/org/openmrs/module/amrsmobileforms/util/MobileFormEntryUtil.java index bfafdf8..8942489 100755 --- a/api/src/main/java/org/openmrs/module/amrsmobileforms/util/MobileFormEntryUtil.java +++ b/api/src/main/java/org/openmrs/module/amrsmobileforms/util/MobileFormEntryUtil.java @@ -290,12 +290,19 @@ public static String cleanLocationEntry(String householdLocation) { String locationId=null; if(householdLocation.length()>0) { - String lastDec=householdLocation.substring(householdLocation.length()-2); - if (lastDec.equals(".0")) { - locationId=householdLocation.substring(0,householdLocation.length()-2); - } else { + if(householdLocation.length()>2) { + String lastDec=householdLocation.substring(householdLocation.length()-2); + if (lastDec.equals(".0")) { + locationId=householdLocation.substring(0,householdLocation.length()-2); + } else { + locationId= householdLocation; + } + + } + else{ locationId= householdLocation; } + } return locationId; From 82d5916fd6e4090455378b5a75910036188920b4 Mon Sep 17 00:00:00 2001 From: Jeremy Keiper Date: Fri, 31 May 2013 10:16:20 -0400 Subject: [PATCH 11/12] MOB-29 - minor formatting changes, removed call to find provider id since we are using the person id anyways --- .../MobileFormUploadProcessor.java | 71 ++++++++++--------- 1 file changed, 36 insertions(+), 35 deletions(-) diff --git a/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormUploadProcessor.java b/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormUploadProcessor.java index 7e373b4..0bfeb94 100644 --- a/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormUploadProcessor.java +++ b/api/src/main/java/org/openmrs/module/amrsmobileforms/MobileFormUploadProcessor.java @@ -42,7 +42,6 @@ public class MobileFormUploadProcessor { private MobileFormEntryService mobileService; // allow only one running instance private static Boolean isRunning = false; - private Integer providerPerson_id; public MobileFormUploadProcessor() { try { @@ -59,41 +58,43 @@ public MobileFormUploadProcessor() { * @param filePath */ private void processSplitForm(String filePath, MobileFormQueue queue) throws APIException { + log.debug("Sending splitted mobile forms to the xform module"); + String providerId = null; String locationId = null; - String householdLocation = null; + try { + + // establish a doc to work from String formData = queue.getFormData(); docBuilder = docBuilderFactory.newDocumentBuilder(); XPathFactory xpf = getXPathFactory(); XPath xp = xpf.newXPath(); Document doc = docBuilder.parse(IOUtils.toInputStream(formData)); - Node curNode = (Node) xp.evaluate(MobileFormEntryConstants.PATIENT_NODE, doc, XPathConstants.NODE); - String patientIdentifier = xp.evaluate(MobileFormEntryConstants.PATIENT_IDENTIFIER, curNode); - String patientAmpathIdentifier = xp.evaluate(MobileFormEntryConstants.PATIENT_HCT_IDENTIFIER, curNode); - String householdId = xp.evaluate(MobileFormEntryConstants.PATIENT_HOUSEHOLD_IDENTIFIER, curNode); - String birthDate = xp.evaluate(MobileFormEntryConstants.PATIENT_BIRTHDATE, curNode); - String familyName = xp.evaluate(MobileFormEntryConstants.PATIENT_FAMILYNAME, curNode); - String givenName = xp.evaluate(MobileFormEntryConstants.PATIENT_GIVENNAME, curNode); - String middleName = xp.evaluate(MobileFormEntryConstants.PATIENT_MIDDLENAME, curNode); - - //find provider Id from the document - curNode = (Node) xp.evaluate(MobileFormEntryConstants.ENCOUNTER_NODE, doc, XPathConstants.NODE); - providerPerson_id = MobileFormEntryUtil.getProviderId(xp.evaluate(MobileFormEntryConstants.ENCOUNTER_PROVIDER, curNode)); + // start with the /form/patient node + Node patientNode = (Node) xp.evaluate(MobileFormEntryConstants.PATIENT_NODE, doc, XPathConstants.NODE); - providerId = xp.evaluate(MobileFormEntryConstants.ENCOUNTER_PROVIDER, curNode); - providerId = providerId.trim(); + // get patient-related information + String patientIdentifier = xp.evaluate(MobileFormEntryConstants.PATIENT_IDENTIFIER, patientNode); + String patientAmpathIdentifier = xp.evaluate(MobileFormEntryConstants.PATIENT_HCT_IDENTIFIER, patientNode); + String householdId = xp.evaluate(MobileFormEntryConstants.PATIENT_HOUSEHOLD_IDENTIFIER, patientNode); + String birthDate = xp.evaluate(MobileFormEntryConstants.PATIENT_BIRTHDATE, patientNode); + String familyName = xp.evaluate(MobileFormEntryConstants.PATIENT_FAMILYNAME, patientNode); + String givenName = xp.evaluate(MobileFormEntryConstants.PATIENT_GIVENNAME, patientNode); + String middleName = xp.evaluate(MobileFormEntryConstants.PATIENT_MIDDLENAME, patientNode); + String householdLocation = xp.evaluate(MobileFormEntryConstants.PATIENT_CATCHMENT_AREA, patientNode); - householdLocation = xp.evaluate(MobileFormEntryConstants.ENCOUNTER_LOCATION, curNode); - - //Clean location id by removing decimal points + // Clean location id by removing decimal points locationId = MobileFormEntryUtil.cleanLocationEntry(householdLocation); - //Ensure there is a patient identifier in the form and - // if without names just delete the form - if (MobileFormEntryUtil.getPatientIdentifier(doc) == null || MobileFormEntryUtil.getPatientIdentifier(doc).trim() == "") { + // find providerId from the encounter + Node encounterNode = (Node) xp.evaluate(MobileFormEntryConstants.ENCOUNTER_NODE, doc, XPathConstants.NODE); + providerId = xp.evaluate(MobileFormEntryConstants.ENCOUNTER_PROVIDER, encounterNode).trim(); + + // Ensure there is a patient identifier in the form and if without names just delete the form + if (StringUtils.isBlank(MobileFormEntryUtil.getPatientIdentifier(doc))) { if ((familyName == null || familyName.trim() == "") && (givenName == null || givenName == "")) { MobileFormEntryUtil.deleteFile(filePath); @@ -107,8 +108,8 @@ private void processSplitForm(String filePath, MobileFormQueue queue) throws API return; } - //Ensure Family name and Given names are not blanks - if (familyName == null || familyName.trim() == "" || givenName == null || givenName == "") { + // Ensure Family name and Given names are not blanks + if (StringUtils.isBlank(familyName) || StringUtils.isBlank(givenName)) { saveFormInError(filePath); mobileService.saveErrorInDatabase(MobileFormEntryUtil.createError(getFormName(filePath), "Error processing patient", "Patient has no valid names specified, Family Name and Given Name are required", providerId, locationId)); @@ -116,20 +117,20 @@ private void processSplitForm(String filePath, MobileFormQueue queue) throws API } // Ensure there is a valid provider id or name and return provider_id in the form - - if ((providerId) == null) { + if (StringUtils.isBlank(providerId)) { // form has no valid provider : move to error saveFormInError(filePath); mobileService.saveErrorInDatabase(MobileFormEntryUtil.createError(getFormName(filePath), "Error processing patient form", "Provider for this encounter is not provided, or the provider identifier provided is invalid", providerId, locationId)); return; } else { + // TODO understand why this is being replaced with itself -- seems frivolous XFormEditor.editNode(filePath, - MobileFormEntryConstants.ENCOUNTER_NODE + "/" + MobileFormEntryConstants.ENCOUNTER_PROVIDER, providerPerson_id.toString()); + MobileFormEntryConstants.ENCOUNTER_NODE + "/" + MobileFormEntryConstants.ENCOUNTER_PROVIDER, providerId); } // ensure patient has birth date - if (birthDate == null || birthDate.trim().length() == 0) { + if (StringUtils.isBlank(birthDate)) { Integer yearOfBirth = MobileFormEntryUtil.getBirthDateFromAge(doc); if (yearOfBirth == null) {//patient has no valid birth-date saveFormInError(filePath); @@ -140,19 +141,18 @@ private void processSplitForm(String filePath, MobileFormQueue queue) throws API birthDate = "" + yearOfBirth + "-01-01"; XFormEditor.editNode(filePath, MobileFormEntryConstants.PATIENT_NODE + "/" + MobileFormEntryConstants.PATIENT_BIRTHDATE, birthDate); - } } - //Ensure that the patient has a household to link to - if (householdId == null || householdId.trim() == "" || MobileFormEntryUtil.isNewHousehold(householdId)) { + // Ensure that the patient has a household to link to + if (StringUtils.isBlank(householdId) || MobileFormEntryUtil.isNewHousehold(householdId)) { saveFormInError(filePath); mobileService.saveErrorInDatabase(MobileFormEntryUtil.createError(getFormName(filePath), "Error processing patient", "Patient is not linked to household or household Id provided is invalid", providerId, locationId)); return; } - //Ensure if not new it is same person + // Ensure if not new it is same person if (!MobileFormEntryUtil.isNewPatient(patientIdentifier)) { Patient pat = MobileFormEntryUtil.getPatient(patientIdentifier); @@ -175,7 +175,7 @@ private void processSplitForm(String filePath, MobileFormQueue queue) throws API } // If patient has an AMPATH ID we use it to create the patient - if (patientAmpathIdentifier != null && patientAmpathIdentifier != "") { + if (!StringUtils.isBlank(patientAmpathIdentifier)) { XFormEditor.editNode(filePath, MobileFormEntryConstants.PATIENT_NODE + "/" + MobileFormEntryConstants.PATIENT_IDENTIFIER, patientAmpathIdentifier); XFormEditor.editNode(filePath, @@ -184,13 +184,14 @@ private void processSplitForm(String filePath, MobileFormQueue queue) throws API MobileFormEntryConstants.PATIENT_NODE + "/" + MobileFormEntryConstants.PATIENT_HCT_IDENTIFIER, patientIdentifier); } - //Finally send to xforms for processing + // Finally send to xforms for processing MobileFormEntryFileUploader.submitXFormFile(filePath); saveFormInPendingLink(filePath); } catch (Throwable t) { log.error("Error while sending form to xform module", t); - //put file in error queue + + // put file in error queue saveFormInError(filePath); mobileService.saveErrorInDatabase(MobileFormEntryUtil.createError(getFormName(filePath), "Error sending form to xform module", t.getMessage(), providerId, locationId)); } From 6241f8ee94befdccda21192c5db752c409f5c6cb Mon Sep 17 00:00:00 2001 From: ojwanganto Date: Thu, 13 Jun 2013 23:35:25 +0300 Subject: [PATCH 12/12] Enabled User.username to be displayed on error resolution dialog --- omod/src/main/resources/config.xml | 10 ++++++---- omod/src/main/webapp/resolveErrors.jsp | 3 ++- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/omod/src/main/resources/config.xml b/omod/src/main/resources/config.xml index 4e337a0..2c7899d 100755 --- a/omod/src/main/resources/config.xml +++ b/omod/src/main/resources/config.xml @@ -164,10 +164,12 @@ - - - - + + + + + +