diff --git a/api-docs/apiLive.htm b/api-docs/apiLive.htm index 3805e793b..ef2dc2294 100644 --- a/api-docs/apiLive.htm +++ b/api-docs/apiLive.htm @@ -861,7 +861,7 @@ Staff staff - Create a Staff + Create a Staff Member List Staff @@ -10029,7 +10029,8 @@ Request Body: "officeId": 1, "firstname": "John", "lastname": "Doe", - "isLoanOfficer": "true" + "isLoanOfficer": "true", + "externalId": "17H" } @@ -10062,7 +10063,8 @@ GET https://DomainName/api/v1/staff "displayName": "Doe, John", "officeId": 1, "officeName": "Head Office", - "isLoanOfficer": true + "isLoanOfficer": true, + "externalId": "17H" } ] @@ -10087,7 +10089,8 @@ GET https://DomainName/api/v1/staff "displayName": "Doe, John", "officeId": 1, "officeName": "Head Office", - "isLoanOfficer": true + "isLoanOfficer": true, + "externalId": "17H" } @@ -10108,7 +10111,8 @@ PUT staff/1 Content-Type: application/json Request Body: { - "isLoanOfficer": "false" + "isLoanOfficer": "false", + "externalId": "17Hbb" } @@ -10116,7 +10120,8 @@ Request Body: "officeId": 1, "resourceId": 1, "changes": { - "isLoanOfficer": false + "isLoanOfficer": false, + "externalId": "17Hbb" } } diff --git a/mifosng-provider/src/main/java/org/mifosplatform/organisation/staff/api/StaffApiResource.java b/mifosng-provider/src/main/java/org/mifosplatform/organisation/staff/api/StaffApiResource.java index 22009a5e7..fe20fe593 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/organisation/staff/api/StaffApiResource.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/organisation/staff/api/StaffApiResource.java @@ -48,7 +48,7 @@ public class StaffApiResource { * {@link StaffData}. */ private final Set RESPONSE_DATA_PARAMETERS = new HashSet(Arrays.asList("id", "firstname", "lastname", "displayName", - "officeId", "officeName", "loanOfficerFlag", "allowedOffices")); + "officeId", "officeName", "loanOfficerFlag", "externalId", "allowedOffices")); private final String resourceNameForPermissions = "STAFF"; diff --git a/mifosng-provider/src/main/java/org/mifosplatform/organisation/staff/data/StaffData.java b/mifosng-provider/src/main/java/org/mifosplatform/organisation/staff/data/StaffData.java index d2e0557d8..2356341e4 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/organisation/staff/data/StaffData.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/organisation/staff/data/StaffData.java @@ -21,32 +21,34 @@ public class StaffData { private final Long officeId; private final String officeName; private final Boolean isLoanOfficer; + private final String externalId; @SuppressWarnings("unused") private final Collection allowedOffices; public static StaffData templateData(final StaffData staff, final Collection allowedOffices) { return new StaffData(staff.id, staff.firstname, staff.lastname, staff.displayName, staff.officeId, staff.officeName, - staff.isLoanOfficer, allowedOffices); + staff.isLoanOfficer, staff.externalId, allowedOffices); } public static StaffData lookup(final Long id, final String displayName) { - return new StaffData(id, null, null, displayName, null, null, null, null); + return new StaffData(id, null, null, displayName, null, null, null, null, null); } public static StaffData instance(final Long id, final String firstname, final String lastname, final String displayName, - final Long officeId, final String officeName, final Boolean isLoanOfficer) { - return new StaffData(id, firstname, lastname, displayName, officeId, officeName, isLoanOfficer, null); + final Long officeId, final String officeName, final Boolean isLoanOfficer, final String externalId) { + return new StaffData(id, firstname, lastname, displayName, officeId, officeName, isLoanOfficer, externalId, null); } private StaffData(final Long id, final String firstname, final String lastname, final String displayName, final Long officeId, - final String officeName, final Boolean isLoanOfficer, final Collection allowedOffices) { + final String officeName, final Boolean isLoanOfficer, final String externalId, final Collection allowedOffices) { this.id = id; this.firstname = firstname; this.lastname = lastname; this.displayName = displayName; this.officeName = officeName; this.isLoanOfficer = isLoanOfficer; + this.externalId = externalId; this.officeId = officeId; this.allowedOffices = allowedOffices; } diff --git a/mifosng-provider/src/main/java/org/mifosplatform/organisation/staff/domain/Staff.java b/mifosng-provider/src/main/java/org/mifosplatform/organisation/staff/domain/Staff.java index 22f7b2879..bc07e68d3 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/organisation/staff/domain/Staff.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/organisation/staff/domain/Staff.java @@ -34,6 +34,9 @@ public class Staff extends AbstractPersistable { @Column(name = "display_name", length = 100) private String displayName; + @Column(name = "external_id", length = 100, nullable = true, unique = true) + private String externalId; + // Office to which this employee belongs @ManyToOne @JoinColumn(name = "office_id", nullable = false) @@ -58,25 +61,29 @@ public class Staff extends AbstractPersistable { final String lastnameParamName = "lastname"; String lastname = command.stringValueOfParameterNamed(lastnameParamName); + + final String externalIdParamName = "externalId"; + String externalId = command.stringValueOfParameterNamed(externalIdParamName); final String isLoanOfficerParamName = "isLoanOfficer"; final boolean isLoanOfficer = command.booleanPrimitiveValueOfParameterNamed(isLoanOfficerParamName); - return new Staff(staffOffice, firstname, lastname, isLoanOfficer); + return new Staff(staffOffice, firstname, lastname, externalId, isLoanOfficer); } - public static Staff createNew(final Office staffOffice, final String firstname, final String lastname, final boolean isLoanOfficer) { - return new Staff(staffOffice, firstname, lastname, isLoanOfficer); + public static Staff createNew(final Office staffOffice, final String firstname, final String lastname, final String externalId, final boolean isLoanOfficer) { + return new Staff(staffOffice, firstname, lastname, externalId, isLoanOfficer); } protected Staff() { // } - private Staff(final Office staffOffice, final String firstname, final String lastname, final boolean isLoanOfficer) { + private Staff(final Office staffOffice, final String firstname, final String lastname, final String externalId, final boolean isLoanOfficer) { this.office = staffOffice; this.firstname = StringUtils.defaultIfEmpty(firstname, null); this.lastname = StringUtils.defaultIfEmpty(lastname, null); + this.externalId = externalId; this.loanOfficer = isLoanOfficer; deriveDisplayName(firstname); } @@ -125,6 +132,13 @@ public class Staff extends AbstractPersistable { deriveDisplayName(this.firstname); } + final String externalIdParamName = "externalId"; + if (command.isChangeInStringParameterNamed(externalIdParamName, this.externalId)) { + final String newValue = command.stringValueOfParameterNamed(externalIdParamName); + actualChanges.put(externalIdParamName, newValue); + this.externalId = newValue; + } + final String isLoanOfficerParamName = "isLoanOfficer"; if (command.isChangeInBooleanParameterNamed(isLoanOfficerParamName, this.loanOfficer)) { final boolean newValue = command.booleanPrimitiveValueOfParameterNamed(isLoanOfficerParamName); diff --git a/mifosng-provider/src/main/java/org/mifosplatform/organisation/staff/serialization/StaffCommandFromApiJsonDeserializer.java b/mifosng-provider/src/main/java/org/mifosplatform/organisation/staff/serialization/StaffCommandFromApiJsonDeserializer.java index c2cd8c018..c1562e58a 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/organisation/staff/serialization/StaffCommandFromApiJsonDeserializer.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/organisation/staff/serialization/StaffCommandFromApiJsonDeserializer.java @@ -31,7 +31,7 @@ public final class StaffCommandFromApiJsonDeserializer { /** * The parameters supported for this command. */ - private final Set supportedParameters = new HashSet(Arrays.asList("firstname", "lastname", "officeId", "isLoanOfficer")); + private final Set supportedParameters = new HashSet(Arrays.asList("firstname", "lastname", "officeId", "externalId", "isLoanOfficer")); private final FromJsonHelper fromApiJsonHelper; diff --git a/mifosng-provider/src/main/java/org/mifosplatform/organisation/staff/service/StaffReadPlatformServiceImpl.java b/mifosng-provider/src/main/java/org/mifosplatform/organisation/staff/service/StaffReadPlatformServiceImpl.java index cbd0d1791..52422e9b0 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/organisation/staff/service/StaffReadPlatformServiceImpl.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/organisation/staff/service/StaffReadPlatformServiceImpl.java @@ -38,7 +38,7 @@ public class StaffReadPlatformServiceImpl implements StaffReadPlatformService { public String schema() { return " s.id as id,s.office_id as officeId, o.name as officeName, s.firstname as firstname, s.lastname as lastname," - + " s.display_name as displayName, s.is_loan_officer as isLoanOfficer from m_staff s " + + " s.display_name as displayName, s.is_loan_officer as isLoanOfficer, s.external_id as externalId from m_staff s " + " join m_office o on o.id = s.office_id"; } @@ -52,8 +52,9 @@ public class StaffReadPlatformServiceImpl implements StaffReadPlatformService { final Long officeId = rs.getLong("officeId"); final boolean isLoanOfficer = rs.getBoolean("isLoanOfficer"); final String officeName = rs.getString("officeName"); + final String externalId = rs.getString("externalId"); - return StaffData.instance(id, firstname, lastname, displayName, officeId, officeName, isLoanOfficer); + return StaffData.instance(id, firstname, lastname, displayName, officeId, officeName, isLoanOfficer, externalId); } } @@ -64,7 +65,7 @@ public class StaffReadPlatformServiceImpl implements StaffReadPlatformService { StringBuilder sqlBuilder = new StringBuilder(200); sqlBuilder.append("s.id as id, s.office_id as officeId, o.name as officeName,"); sqlBuilder.append("s.firstname as firstname, s.lastname as lastname,"); - sqlBuilder.append("s.display_name as displayName, s.is_loan_officer as isLoanOfficer "); + sqlBuilder.append("s.display_name as displayName, s.is_loan_officer as isLoanOfficer, s.external_id as externalId "); sqlBuilder.append("from m_office o "); sqlBuilder.append("join m_office ohierarchy on o.hierarchy like concat(ohierarchy.hierarchy, '%') "); sqlBuilder.append("join m_staff s on s.office_id = ohierarchy.id "); @@ -88,8 +89,9 @@ public class StaffReadPlatformServiceImpl implements StaffReadPlatformService { final Long officeId = rs.getLong("officeId"); final String officeName = rs.getString("officeName"); final boolean isLoanOfficer = rs.getBoolean("isLoanOfficer"); + final String externalId = rs.getString("externalId"); - return StaffData.instance(id, firstname, lastname, displayName, officeId, officeName, isLoanOfficer); + return StaffData.instance(id, firstname, lastname, displayName, officeId, officeName, isLoanOfficer, externalId); } } diff --git a/mifosng-provider/src/main/java/org/mifosplatform/organisation/staff/service/StaffWritePlatformServiceJpaRepositoryImpl.java b/mifosng-provider/src/main/java/org/mifosplatform/organisation/staff/service/StaffWritePlatformServiceJpaRepositoryImpl.java index 27f960e52..0524c6f05 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/organisation/staff/service/StaffWritePlatformServiceJpaRepositoryImpl.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/organisation/staff/service/StaffWritePlatformServiceJpaRepositoryImpl.java @@ -115,7 +115,14 @@ public class StaffWritePlatformServiceJpaRepositoryImpl implements StaffWritePla */ private void handleStaffDataIntegrityIssues(final JsonCommand command, final DataIntegrityViolationException dve) { Throwable realCause = dve.getMostSpecificCause(); - if (realCause.getMessage().contains("display_name")) { + + if (realCause.getMessage().contains("external_id")) { + + final String externalId = command.stringValueOfParameterNamed("externalId"); + throw new PlatformDataIntegrityException("error.msg.staff.duplicate.externalId", "Staff with externalId `" + externalId + + "` already exists", "externalId", externalId); + } + else if (realCause.getMessage().contains("display_name")) { final String lastname = command.stringValueOfParameterNamed("lastname"); String displayName = lastname; if (!StringUtils.isBlank(displayName)) {