diff --git a/api-docs/apiLive.htm b/api-docs/apiLive.htm
index 590a876e3..33b41010d 100644
--- a/api-docs/apiLive.htm
+++ b/api-docs/apiLive.htm
@@ -13703,7 +13703,10 @@ Request Body:
"isLoanOfficer": "true",
"externalId": "17H",
"mobileNo": "+353851239876",
- "isActive": "true"
+ "isActive": "true",
+ "joiningDate": "01 January 2009",
+ "locale":"en",
+ "dateFormat":"dd MMMM yyyy"
}
@@ -13738,7 +13741,8 @@ GET https://DomainName/api/v1/staff
"officeName": "Head Office",
"isLoanOfficer": true,
"externalId": "17H",
- "isActive": "true"
+ "isActive": "true",
+ "joiningDate":[2009,8,1]
}
]
@@ -13765,7 +13769,8 @@ GET https://DomainName/api/v1/staff
"officeName": "Head Office",
"isLoanOfficer": true,
"externalId": "17H",
- "isActive": "true"
+ "isActive": "true",
+ "joiningDate":[2009,8,1]
}
@@ -13794,7 +13799,8 @@ GET https://DomainName/api/v1/staff
"officeName": "Head Office",
"isLoanOfficer": true,
"externalId": "17H",
- "isActive": "true"
+ "isActive": "true",
+ "joiningDate":[2009,8,1]
}
diff --git a/mifosng-db/migrations/core_db/V189__added_column_joiningDate_for_staff.sql b/mifosng-db/migrations/core_db/V189__added_column_joiningDate_for_staff.sql
new file mode 100644
index 000000000..cbbbadbe6
--- /dev/null
+++ b/mifosng-db/migrations/core_db/V189__added_column_joiningDate_for_staff.sql
@@ -0,0 +1,2 @@
+alter table m_staff
+add column joining_date date;
\ No newline at end of file
diff --git a/mifosng-db/old-schema-files/0001a-mifosplatform-core-ddl-latest.sql b/mifosng-db/old-schema-files/0001a-mifosplatform-core-ddl-latest.sql
index dc02925ad..6615c90d8 100644
--- a/mifosng-db/old-schema-files/0001a-mifosplatform-core-ddl-latest.sql
+++ b/mifosng-db/old-schema-files/0001a-mifosplatform-core-ddl-latest.sql
@@ -346,6 +346,7 @@ CREATE TABLE `m_staff` (
`firstname` varchar(50) DEFAULT NULL,
`lastname` varchar(50) DEFAULT NULL,
`display_name` varchar(100) NOT NULL,
+ `joining_date` date,
PRIMARY KEY (`id`),
UNIQUE KEY `display_name` (`display_name`),
KEY `FK_m_staff_m_office` (`office_id`),
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 acf989c83..cb1e132ea 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
@@ -49,7 +49,7 @@ public class StaffApiResource {
* {@link StaffData}.
*/
private final Set RESPONSE_DATA_PARAMETERS = new HashSet<>(Arrays.asList("id", "firstname", "lastname", "displayName",
- "officeId", "officeName", "isLoanOfficer", "externalId", "mobileNo", "allowedOffices", "isActive"));
+ "officeId", "officeName", "isLoanOfficer", "externalId", "mobileNo", "allowedOffices", "isActive", "dateJoined"));
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 4eb67ee7d..86aff4dae 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
@@ -7,6 +7,7 @@ package org.mifosplatform.organisation.staff.data;
import java.util.Collection;
+import org.joda.time.LocalDate;
import org.mifosplatform.organisation.office.data.OfficeData;
/**
@@ -24,29 +25,30 @@ public class StaffData {
private final String officeName;
private final Boolean isLoanOfficer;
private final Boolean isActive;
+ private final LocalDate joiningDate;
@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, staff.externalId, staff.mobileNo, allowedOffices, staff.isActive);
+ staff.isLoanOfficer, staff.externalId, staff.mobileNo, allowedOffices, staff.isActive, staff.joiningDate);
}
public static StaffData lookup(final Long id, final String displayName) {
- return new StaffData(id, null, null, displayName, null, null, null, null, null, null, null);
+ return new StaffData(id, null, null, displayName, null, null, null, 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, final String externalId, final String mobileNo,
- final boolean isActive) {
+ final boolean isActive, final LocalDate joiningDate) {
return new StaffData(id, firstname, lastname, displayName, officeId, officeName, isLoanOfficer, externalId, mobileNo, null,
- isActive);
+ isActive, joiningDate);
}
private StaffData(final Long id, final String firstname, final String lastname, final String displayName, final Long officeId,
final String officeName, final Boolean isLoanOfficer, final String externalId, final String mobileNo,
- final Collection allowedOffices, final Boolean isActive) {
+ final Collection allowedOffices, final Boolean isActive, final LocalDate joiningDate) {
this.id = id;
this.firstname = firstname;
this.lastname = lastname;
@@ -58,6 +60,7 @@ public class StaffData {
this.mobileNo = mobileNo;
this.allowedOffices = allowedOffices;
this.isActive = isActive;
+ this.joiningDate = joiningDate;
}
public Long getId() {
@@ -79,4 +82,8 @@ public class StaffData {
public String getOfficeName() {
return this.officeName;
}
+
+ public LocalDate getJoiningDate() {
+ return this.joiningDate;
+ }
}
\ No newline at end of file
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 f9b34f4a1..109c1ad71 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
@@ -5,6 +5,7 @@
*/
package org.mifosplatform.organisation.staff.domain;
+import java.util.Date;
import java.util.LinkedHashMap;
import java.util.Map;
@@ -13,12 +14,16 @@ import javax.persistence.Entity;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
+import javax.persistence.Temporal;
+import javax.persistence.TemporalType;
import javax.persistence.UniqueConstraint;
import org.apache.commons.lang.StringUtils;
+import org.joda.time.LocalDate;
import org.mifosplatform.infrastructure.core.api.JsonCommand;
import org.mifosplatform.infrastructure.core.data.EnumOptionData;
import org.mifosplatform.organisation.office.domain.Office;
+import org.mifosplatform.portfolio.client.api.ClientApiConstants;
import org.springframework.data.jpa.domain.AbstractPersistable;
@Entity
@@ -55,6 +60,10 @@ public class Staff extends AbstractPersistable {
@Column(name = "is_active", nullable = false)
private boolean active;
+ @Column(name = "joining_date", nullable = false)
+ @Temporal(TemporalType.DATE)
+ private Date joiningDate;
+
@ManyToOne
@JoinColumn(name = "organisational_role_parent_staff_id", nullable = true)
private Staff organisationalRoleParentStaff;
@@ -78,8 +87,15 @@ public class Staff extends AbstractPersistable {
final String isActiveParamName = "isActive";
final Boolean isActive = command.booleanObjectValueOfParameterNamed(isActiveParamName);
+
+ LocalDate joiningDate = null;
+
+ final String joiningDateParamName = "joiningDate";
+ if (command.hasParameter(joiningDateParamName)) {
+ joiningDate = command.localDateValueOfParameterNamed(joiningDateParamName);
+ }
- return new Staff(staffOffice, firstname, lastname, externalId, mobileNo, isLoanOfficer, isActive);
+ return new Staff(staffOffice, firstname, lastname, externalId, mobileNo, isLoanOfficer, isActive, joiningDate);
}
protected Staff() {
@@ -87,7 +103,8 @@ public class Staff extends AbstractPersistable {
}
private Staff(final Office staffOffice, final String firstname, final String lastname, final String externalId, final String mobileNo,
- final boolean isLoanOfficer, final Boolean isActive) {
+ final boolean isLoanOfficer, final Boolean isActive,
+ final LocalDate joiningDate) {
this.office = staffOffice;
this.firstname = StringUtils.defaultIfEmpty(firstname, null);
this.lastname = StringUtils.defaultIfEmpty(lastname, null);
@@ -96,6 +113,9 @@ public class Staff extends AbstractPersistable {
this.loanOfficer = isLoanOfficer;
this.active = (isActive == null) ? true : isActive;
deriveDisplayName(firstname);
+ if (joiningDate != null) {
+ this.joiningDate = joiningDate.toDateTimeAtStartOfDay().toDate();
+ }
}
public EnumOptionData organisationalRoleData() {
@@ -169,6 +189,14 @@ public class Staff extends AbstractPersistable {
actualChanges.put(isActiveParamName, newValue);
this.active = newValue;
}
+
+ final String joiningDateParamName = "joiningDate";
+ if (command.isChangeInDateParameterNamed(joiningDateParamName, this.joiningDate)) {
+ final String valueAsInput = command.stringValueOfParameterNamed(joiningDateParamName);
+ actualChanges.put(joiningDateParamName, valueAsInput);
+ final LocalDate newValue = command.localDateValueOfParameterNamed(joiningDateParamName);
+ this.joiningDate = newValue.toDate();
+ }
return actualChanges;
}
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 4077d9f38..7a65d3e12 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
@@ -14,6 +14,7 @@ import java.util.Map;
import java.util.Set;
import org.apache.commons.lang.StringUtils;
+import org.joda.time.LocalDate;
import org.mifosplatform.infrastructure.core.data.ApiParameterError;
import org.mifosplatform.infrastructure.core.data.DataValidatorBuilder;
import org.mifosplatform.infrastructure.core.exception.InvalidJsonException;
@@ -33,7 +34,7 @@ public final class StaffCommandFromApiJsonDeserializer {
* The parameters supported for this command.
*/
private final Set supportedParameters = new HashSet<>(Arrays.asList("firstname", "lastname", "officeId", "externalId",
- "mobileNo", "isLoanOfficer", "isActive"));
+ "mobileNo", "isLoanOfficer", "isActive", "joiningDate", "dateFormat", "locale"));
private final FromJsonHelper fromApiJsonHelper;
@@ -77,6 +78,21 @@ public final class StaffCommandFromApiJsonDeserializer {
final Boolean activeFlag = this.fromApiJsonHelper.extractBooleanNamed("isActive", element);
baseDataValidator.reset().parameter("isActive").value(activeFlag).notNull();
}
+
+ if (this.fromApiJsonHelper.parameterExists("joiningDate", element)) {
+ final LocalDate joiningDate = this.fromApiJsonHelper.extractLocalDateNamed("joiningDate", element);
+ baseDataValidator.reset().parameter("joiningDate").value(joiningDate).notNull();
+ }
+
+ if (this.fromApiJsonHelper.parameterExists("dateFormat", element)) {
+ final String dateFormat = this.fromApiJsonHelper.extractStringNamed("dateFormat", element);
+ baseDataValidator.reset().parameter("dateFormat").value(dateFormat).notBlank();
+ }
+
+ if (this.fromApiJsonHelper.parameterExists("locale", element)) {
+ final String locale = this.fromApiJsonHelper.extractStringNamed("locale", element);
+ baseDataValidator.reset().parameter("locale").value(locale).notBlank();
+ }
throwExceptionIfValidationWarningsExist(dataValidationErrors);
}
@@ -120,6 +136,21 @@ public final class StaffCommandFromApiJsonDeserializer {
final Boolean activeFlag = this.fromApiJsonHelper.extractBooleanNamed("isActive", element);
baseDataValidator.reset().parameter("isActive").value(activeFlag).notNull();
}
+
+ if (this.fromApiJsonHelper.parameterExists("joiningDate", element)) {
+ final LocalDate joiningDate = this.fromApiJsonHelper.extractLocalDateNamed("joiningDate", element);
+ baseDataValidator.reset().parameter("joiningDate").value(joiningDate).notNull();
+ }
+
+ if (this.fromApiJsonHelper.parameterExists("dateFormat", element)) {
+ final String dateFormat = this.fromApiJsonHelper.extractStringNamed("dateFormat", element);
+ baseDataValidator.reset().parameter("dateFormat").value(dateFormat).notBlank();
+ }
+
+ if (this.fromApiJsonHelper.parameterExists("locale", element)) {
+ final String locale = this.fromApiJsonHelper.extractStringNamed("locale", element);
+ baseDataValidator.reset().parameter("locale").value(locale).notBlank();
+ }
throwExceptionIfValidationWarningsExist(dataValidationErrors);
}
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 5f2f7e79b..42aa35917 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
@@ -10,6 +10,8 @@ import java.sql.SQLException;
import java.util.Collection;
import org.apache.commons.lang.StringUtils;
+import org.joda.time.LocalDate;
+import org.mifosplatform.infrastructure.core.domain.JdbcSupport;
import org.mifosplatform.infrastructure.core.exception.UnrecognizedQueryParamException;
import org.mifosplatform.infrastructure.core.service.RoutingDataSource;
import org.mifosplatform.infrastructure.security.service.PlatformSecurityContext;
@@ -39,7 +41,8 @@ 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, s.external_id as externalId, s.mobile_no as mobileNo, s.is_active as isActive from m_staff s "
+ + " s.display_name as displayName, s.is_loan_officer as isLoanOfficer, s.external_id as externalId, s.mobile_no as mobileNo,"
+ + " s.is_active as isActive, s.joining_date as joiningDate from m_staff s "
+ " join m_office o on o.id = s.office_id";
}
@@ -56,9 +59,10 @@ public class StaffReadPlatformServiceImpl implements StaffReadPlatformService {
final String externalId = rs.getString("externalId");
final String mobileNo = rs.getString("mobileNo");
final boolean isActive = rs.getBoolean("isActive");
+ final LocalDate joiningDate = JdbcSupport.getLocalDate(rs, "joiningDate");
return StaffData.instance(id, firstname, lastname, displayName, officeId, officeName, isLoanOfficer, externalId, mobileNo,
- isActive);
+ isActive, joiningDate);
}
}
@@ -71,7 +75,7 @@ public class StaffReadPlatformServiceImpl implements StaffReadPlatformService {
sqlBuilder.append("s.id as id, s.office_id as officeId, ohierarchy.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, s.external_id as externalId, ");
- sqlBuilder.append("s.mobile_no as mobileNo, s.is_active as isActive ");
+ sqlBuilder.append("s.mobile_no as mobileNo, s.is_active as isActive, s.joining_date as joiningDate ");
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 and s.is_active=1 ");
@@ -98,9 +102,10 @@ public class StaffReadPlatformServiceImpl implements StaffReadPlatformService {
final String externalId = rs.getString("externalId");
final String mobileNo = rs.getString("mobileNo");
final boolean isActive = rs.getBoolean("isActive");
+ final LocalDate joiningDate = JdbcSupport.getLocalDate(rs, "joiningDate");
return StaffData.instance(id, firstname, lastname, displayName, officeId, officeName, isLoanOfficer, externalId, mobileNo,
- isActive);
+ isActive, joiningDate);
}
}