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)) {