Skip to content

Commit

Permalink
Merge pull request #419 from OpenSRP/issue-138-update-family-member-n…
Browse files Browse the repository at this point in the history
…ames

Update family member names if Family name is changed
  • Loading branch information
zzainulabidin authored Apr 15, 2021
2 parents 5002798 + 11b1492 commit 9cccb74
Show file tree
Hide file tree
Showing 6 changed files with 300 additions and 4 deletions.
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
VERSION_NAME=2.0.28-SNAPSHOT
VERSION_NAME=2.0.29-SNAPSHOT
VERSION_CODE=1
GROUP=org.smartregister
POM_SETTING_DESCRIPTION=OpenSRP Client Chw Core Library
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package org.smartregister.chw.core.dao;

import org.smartregister.chw.core.model.CoreFamilyMemberModel;
import org.smartregister.dao.AbstractDao;

import java.util.List;

public class FamilyMemberDao extends AbstractDao {

public static List<CoreFamilyMemberModel> familyMembersToUpdateLastName(String baseEntityId) {
String sql = String.format("SELECT DISTINCT fm.entity_type, fm.last_name, fm.base_entity_id,fm.relational_id FROM ec_family_member fm " +
"INNER JOIN ec_family f on '" + baseEntityId + "' = fm.relational_id " +
"WHERE f.first_name = fm.last_name");

DataMap<CoreFamilyMemberModel> dataMap = cursor ->
new CoreFamilyMemberModel(getCursorValue(cursor, "last_name"),
getCursorValue(cursor, "base_entity_id"),
getCursorValue(cursor, "relational_id"),
getCursorValue(cursor, "entity_type"));

return readData(sql, dataMap);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package org.smartregister.chw.core.model;

public class CoreFamilyMemberModel {
private final String lastName;
private final String baseEntityId;
private final String familyBaseEntityId;
private final String entityType;

public CoreFamilyMemberModel(String lastName, String baseEntityId, String familyBaseEntityId, String entityType) {
this.lastName = lastName;
this.baseEntityId = baseEntityId;
this.familyBaseEntityId = familyBaseEntityId;
this.entityType = entityType;
}

public String getEntityType() {
return entityType;
}

public String getLastName() {
return lastName;
}

public String getBaseEntityId() {
return baseEntityId;
}

public String getFamilyBaseEntityId() {
return familyBaseEntityId;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.text.TextUtils;
import android.util.Pair;

import com.vijay.jsonwizard.constants.JsonFormConstants;
Expand All @@ -19,9 +18,12 @@
import org.json.JSONException;
import org.json.JSONObject;
import org.smartregister.chw.anc.domain.MemberObject;
import org.smartregister.chw.anc.util.NCUtils;
import org.smartregister.chw.core.R;
import org.smartregister.chw.core.application.CoreChwApplication;
import org.smartregister.chw.core.dao.FamilyMemberDao;
import org.smartregister.chw.core.domain.FamilyMember;
import org.smartregister.chw.core.model.CoreFamilyMemberModel;
import org.smartregister.clientandeventmodel.Address;
import org.smartregister.clientandeventmodel.Client;
import org.smartregister.clientandeventmodel.Event;
Expand All @@ -34,10 +36,10 @@
import org.smartregister.domain.Photo;
import org.smartregister.domain.tag.FormTag;
import org.smartregister.family.FamilyLibrary;
import org.smartregister.family.domain.FamilyEventClient;
import org.smartregister.family.util.Constants;
import org.smartregister.family.util.DBConstants;
import org.smartregister.immunization.domain.ServiceRecord;
import org.smartregister.immunization.domain.Vaccine;
import org.smartregister.family.util.JsonFormUtils;
import org.smartregister.location.helper.LocationHelper;
import org.smartregister.repository.AllSharedPreferences;
import org.smartregister.sync.helper.ECSyncHelper;
Expand All @@ -62,6 +64,9 @@

import timber.log.Timber;

import static org.smartregister.chw.core.utils.CoreConstants.EventType.UPDATE_CHILD_REGISTRATION;
import static org.smartregister.chw.core.utils.CoreConstants.EventType.UPDATE_FAMILY_MEMBER_REGISTRATION;

/**
* Created by keyman on 13/11/2018.
*/
Expand Down Expand Up @@ -556,6 +561,115 @@ public static FamilyMember getFamilyMemberFromRegistrationForm(String jsonString
return member;
}

public static FamilyEventClient processFamilyUpdateForm(AllSharedPreferences allSharedPreferences, String jsonString, String familyBaseEntityId) {
return processFamilyForm(allSharedPreferences, jsonString, familyBaseEntityId, org.smartregister.family.util.Utils.metadata().familyRegister.updateEventType);
}

private static FamilyEventClient processFamilyForm(AllSharedPreferences allSharedPreferences, String jsonString, String familyBaseEntityId, String encounterType) {
try {
Triple<Boolean, JSONObject, JSONArray> registrationFormParams = validateParameters(jsonString);
if (!(Boolean)registrationFormParams.getLeft()) {
return null;
} else {
JSONObject jsonForm = (JSONObject)registrationFormParams.getMiddle();
JSONArray fields = (JSONArray)registrationFormParams.getRight();
String entityId = getString(jsonForm, "entity_id");
if (StringUtils.isBlank(entityId)) {
entityId = generateRandomUUIDString();
}

lastInteractedWith(fields);
dobUnknownUpdateFromAge(fields);
Client baseClient = org.smartregister.util.JsonFormUtils.createBaseClient(fields, formTag(allSharedPreferences), entityId);
if (baseClient != null && !baseClient.getBaseEntityId().equals(familyBaseEntityId)) {
baseClient.addRelationship(org.smartregister.family.util.Utils.metadata().familyMemberRegister.familyRelationKey, familyBaseEntityId);
}

Event baseEvent = org.smartregister.util.JsonFormUtils.createEvent(fields, getJSONObject(jsonForm, "metadata"), formTag(allSharedPreferences), entityId, encounterType, org.smartregister.family.util.Utils.metadata().familyMemberRegister.tableName);
tagSyncMetadata(allSharedPreferences, baseEvent);
if (encounterType.equals(org.smartregister.family.util.Utils.metadata().familyRegister.updateEventType) && baseClient != null) {
updateFamilyMembersLastName(familyBaseEntityId, baseClient.getFirstName(), formTag(allSharedPreferences), allSharedPreferences);
}

return new FamilyEventClient(baseClient, baseEvent);
}
} catch (Exception var10) {
Timber.e(var10);
return null;
}
}

private static void updateFamilyMembersLastName(String familyBaseEntityId, String familyName, FormTag formTag, AllSharedPreferences allSharedPreferences) throws Exception {
List<org.apache.commons.lang3.tuple.Pair<Client, Event>> familyMembersEvents = processFamilyMemberUpdateFamilyName(familyBaseEntityId, familyName, formTag, allSharedPreferences);

for (org.apache.commons.lang3.tuple.Pair<Client, Event> familyMembersEvent : familyMembersEvents) {

JSONObject eventPartialJson = new JSONObject(JsonFormUtils.gson.toJson(familyMembersEvent.getRight()));
getSyncHelper().addEvent(familyMembersEvent.getLeft().getBaseEntityId(), eventPartialJson);
JsonFormUtils.mergeAndSaveClient(getSyncHelper(), familyMembersEvent.getLeft());
NCUtils.processEvent(familyMembersEvent.getRight().getBaseEntityId(), new JSONObject(JsonFormUtils.gson.toJson(familyMembersEvent.getRight())));
}
}

protected static List<org.apache.commons.lang3.tuple.Pair<Client, Event>> processFamilyMemberUpdateFamilyName(String familyBaseEntityId, String familyName, FormTag formTag, AllSharedPreferences allSharedPreferences) {
List<CoreFamilyMemberModel> familyMembers = FamilyMemberDao.familyMembersToUpdateLastName(familyBaseEntityId);
List<org.apache.commons.lang3.tuple.Pair<Client, Event>> clientEventPairsList = new ArrayList<>();


if (familyName != null && familyMembers != null) {
for (CoreFamilyMemberModel familyMember : familyMembers) {

Event event = new Event()
.withFormSubmissionId(generateRandomUUIDString())
.withBaseEntityId(familyMember.getBaseEntityId())
.withEventType(familyMember.getEntityType().equals("ec_family_member") ? UPDATE_FAMILY_MEMBER_REGISTRATION : UPDATE_CHILD_REGISTRATION)
.withEntityType(familyMember.getEntityType())
.withEventDate(new Date());
event.withDateCreated(new Date());

List<Obs> obs = new ArrayList<>();
obs.add(getObs(Collections.singletonList(familyName),
Collections.singletonList(familyName)));
event.setObs(obs);

tagSyncMetadata(allSharedPreferences, event);

// client
Client client = (Client) new Client(familyMember.getBaseEntityId()).withLastName(familyName)
.withDateCreated(new Date());

client.setLocationId(formTag.locationId);
client.setTeamId(formTag.teamId);

client.setClientApplicationVersion(formTag.appVersion);
client.setClientApplicationVersionName(formTag.appVersionName);
client.setClientDatabaseVersion(formTag.databaseVersion);


clientEventPairsList.add(org.apache.commons.lang3.tuple.Pair.of(client, event));
}
return clientEventPairsList;
}
return clientEventPairsList;
}

public static ECSyncHelper getSyncHelper() {
return FamilyLibrary.getInstance().getEcSyncHelper();
}

private static Obs getObs(List<Object> values, List<Object> humanReadableValues) {
Obs obs = new Obs();
obs.setFieldType("concept");
obs.setFieldDataType("text");
obs.setFieldCode("lastName");
obs.setParentCode("");
obs.setValues(values);
obs.setFormSubmissionField("lastName");
obs.setHumanReadableValues(humanReadableValues);
return obs;
}


public static String getJsonFieldValue(JSONArray jsonArray, String key) {
try {
JSONObject jsonObject = getFieldJSONObject(jsonArray, key);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package org.smartregister.chw.core.dao;

import net.sqlcipher.MatrixCursor;
import net.sqlcipher.database.SQLiteDatabase;

import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import org.smartregister.chw.core.model.CoreFamilyMemberModel;
import org.smartregister.repository.Repository;

import java.util.List;

public class FamilyMemberDaoTest extends FamilyMemberDao {

@Mock
private Repository repository;

@Mock
private SQLiteDatabase database;

@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
setRepository(repository);
Mockito.doReturn(database).when(repository).getReadableDatabase();
}

@Test
public void testGetActiveAlerts() {
MatrixCursor matrixCursor = new MatrixCursor(new String[]{"last_name", "base_entity_id", "relational_id", "entity_type"});
matrixCursor.addRow(new Object[]{"demo_last_name", "123456", "654321", "Update"});
Mockito.doReturn(matrixCursor).when(database).rawQuery(Mockito.any(), Mockito.any());

List<CoreFamilyMemberModel> familyMembers = FamilyMemberDao.familyMembersToUpdateLastName("123456");

Mockito.verify(database).rawQuery(Mockito.anyString(), Mockito.any());

Assert.assertNotNull(familyMembers);
Assert.assertEquals(familyMembers.get(0).getLastName(), "demo_last_name");
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
package org.smartregister.chw.core.utils;

import org.apache.commons.lang3.tuple.Pair;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import org.smartregister.Context;
import org.smartregister.chw.core.dao.FamilyMemberDao;
import org.smartregister.chw.core.model.CoreFamilyMemberModel;
import org.smartregister.clientandeventmodel.Client;
import org.smartregister.clientandeventmodel.Event;
import org.smartregister.domain.tag.FormTag;
import org.smartregister.family.FamilyLibrary;
import org.smartregister.family.activity.FamilyWizardFormActivity;
import org.smartregister.family.domain.FamilyMetadata;
import org.smartregister.repository.AllSharedPreferences;
import org.smartregister.view.activity.BaseProfileActivity;

import java.util.Collections;
import java.util.List;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.smartregister.chw.core.dao.FamilyMemberDao.familyMembersToUpdateLastName;

@RunWith(PowerMockRunner.class)
public class ProcessFamilyMembersClientEventTest {

@Mock
private Context context;
@Mock
private AllSharedPreferences allSharedPreferences;
private FamilyMetadata metadata;

@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
FamilyLibrary.init(context, null, 1, 1);
FamilyLibrary.getInstance().setMetadata(getMetadata());
}

@PrepareForTest({FamilyMemberDao.class})
@Test
public void processFamilyMemberUpdateFamilyNameShouldReturnEventAndClient() {
PowerMockito.mockStatic(FamilyMemberDao.class);
PowerMockito.when(familyMembersToUpdateLastName("6543421")).thenReturn(Collections.singletonList(new CoreFamilyMemberModel("demo", "123456", "6543421", "Update Family Member Registration")));
List<Pair<Client, Event>> familyEventClient = CoreJsonFormUtils.processFamilyMemberUpdateFamilyName("6543421", "demo", formTag(allSharedPreferences), allSharedPreferences);
assertNotNull(familyEventClient);
assertEquals(familyEventClient.size(), 1);
assertNotNull(familyEventClient.get(0).getRight());
assertNotNull(familyEventClient.get(0).getLeft());
}

protected FamilyMetadata getMetadata() {
BaseProfileActivity activity = Mockito.mock(BaseProfileActivity.class);
if (metadata == null) {
metadata = new FamilyMetadata(FamilyWizardFormActivity.class, FamilyWizardFormActivity.class, activity.getClass(), "UNIQUE_IDENTIFIER_KEY", true);
metadata.updateFamilyRegister("FAMILY_REGISTER", "FAMILY", "FAMILY_REGISTRATION", "UPDATE_FAMILY_REGISTRATION", "FAMILY_REGISTER", "FAMILY_HEAD", "PRIMARY_CAREGIVER");
metadata.updateFamilyMemberRegister("FAMILY_MEMBER_REGISTER", "FAMILY_MEMBER", "FAMILY_MEMBER_REGISTRATION", "UPDATE_FAMILY_MEMBER_REGISTRATION", "FAMILY_MEMBER_REGISTER", "FAMILY");
metadata.updateFamilyDueRegister("FAMILY_MEMBER", 20, true);
metadata.updateFamilyActivityRegister("FAMILY_MEMBER", Integer.MAX_VALUE, false);
metadata.updateFamilyOtherMemberRegister("FAMILY_MEMBER", Integer.MAX_VALUE, false);
}
return metadata;
}

protected static FormTag formTag(AllSharedPreferences allSharedPreferences) {
FormTag formTag = new FormTag();
formTag.providerId = allSharedPreferences.fetchRegisteredANM();
formTag.appVersion = FamilyLibrary.getInstance().getApplicationVersion();
formTag.databaseVersion = FamilyLibrary.getInstance().getDatabaseVersion();
return formTag;
}
}


0 comments on commit 9cccb74

Please sign in to comment.