From 1a747ab1c0d029793fec2a2eac8b7dff95dc6740 Mon Sep 17 00:00:00 2001 From: Binny G Sreevas Date: Sun, 3 Aug 2014 14:01:38 +0530 Subject: [PATCH] MIFOSX-1468 - Added field 'Joining Date' for Staff --- api-docs/apiLive.htm | 14 +++++--- ...89__added_column_joiningDate_for_staff.sql | 2 ++ .../0001a-mifosplatform-core-ddl-latest.sql | 1 + .../staff/api/StaffApiResource.java | 2 +- .../organisation/staff/data/StaffData.java | 17 +++++++--- .../organisation/staff/domain/Staff.java | 32 ++++++++++++++++-- .../StaffCommandFromApiJsonDeserializer.java | 33 ++++++++++++++++++- .../service/StaffReadPlatformServiceImpl.java | 13 +++++--- 8 files changed, 97 insertions(+), 17 deletions(-) create mode 100644 mifosng-db/migrations/core_db/V189__added_column_joiningDate_for_staff.sql 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); } }