Implemented Notes API
This commit is contained in:
@@ -0,0 +1,8 @@
|
|||||||
|
ALTER TABLE `m_note`
|
||||||
|
ADD COLUMN `group_id` BIGINT(20) NULL AFTER `client_id`,
|
||||||
|
ADD CONSTRAINT `FK_m_note_m_group` FOREIGN KEY (`group_id`) REFERENCES `m_group` (`id`);
|
||||||
|
|
||||||
|
ALTER TABLE `m_note`
|
||||||
|
ALTER `client_id` DROP DEFAULT;
|
||||||
|
ALTER TABLE `m_note`
|
||||||
|
CHANGE COLUMN `client_id` `client_id` BIGINT(20) NULL AFTER `id`;
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
INSERT INTO `m_permission` (`grouping`, `code`, `entity_name`, `action_name`, `can_maker_checker`)
|
||||||
|
VALUES('portfolio', 'CREATE_LOANNOTE', 'LOANNOTE', 'CREATE', '0'),
|
||||||
|
('portfolio', 'READ_LOANNOTE', 'LOANNOTE', 'READ', '0'),
|
||||||
|
('portfolio', 'UPDATE_LOANNOTE', 'LOANNOTE', 'UPDATE', '0'),
|
||||||
|
('portfolio', 'DELETE_LOANNOTE', 'LOANNOTE', 'DELETE', '0'),
|
||||||
|
('portfolio', 'CREATE_LOANNOTE_CHECKER', 'LOANNOTE', 'CREATE', '0'),
|
||||||
|
('portfolio', 'UPDATE_LOANNOTE_CHECKER', 'LOANNOTE', 'UPDATE', '0'),
|
||||||
|
('portfolio', 'DELETE_LOANNOTE_CHECKER', 'LOANNOTE', 'DELETE', '0'),
|
||||||
|
('portfolio', 'CREATE_LOANTRANSACTIONNOTE', 'LOANTRANSACTIONNOTE', 'CREATE', '0'),
|
||||||
|
('portfolio', 'READ_LOANTRANSACTIONNOTE', 'LOANTRANSACTIONNOTE', 'READ', '0'),
|
||||||
|
('portfolio', 'UPDATE_LOANTRANSACTIONNOTE', 'LOANTRANSACTIONNOTE', 'UPDATE', '0'),
|
||||||
|
('portfolio', 'DELETE_LOANTRANSACTIONNOTE', 'LOANTRANSACTIONNOTE', 'DELETE', '0'),
|
||||||
|
('portfolio', 'CREATE_LOANTRANSACTIONNOTE_CHECKER', 'LOANTRANSACTIONNOTE', 'CREATE', '0'),
|
||||||
|
('portfolio', 'UPDATE_LOANTRANSACTIONNOTE_CHECKER', 'LOANTRANSACTIONNOTE', 'UPDATE', '0'),
|
||||||
|
('portfolio', 'DELETE_LOANTRANSACTIONNOTE_CHECKER', 'LOANTRANSACTIONNOTE', 'DELETE', '0'),
|
||||||
|
('portfolio', 'CREATE_DEPOSITNOTE', 'DEPOSITNOTE', 'CREATE', '0'),
|
||||||
|
('portfolio', 'READ_DEPOSITNOTE', 'DEPOSITNOTE', 'READ', '0'),
|
||||||
|
('portfolio', 'UPDATE_DEPOSITNOTE', 'DEPOSITNOTE', 'UPDATE', '0'),
|
||||||
|
('portfolio', 'DELETE_DEPOSITNOTE', 'DEPOSITNOTE', 'DELETE', '0'),
|
||||||
|
('portfolio', 'CREATE_DEPOSITNOTE_CHECKER', 'DEPOSITNOTE', 'CREATE', '0'),
|
||||||
|
('portfolio', 'UPDATE_DEPOSITNOTE_CHECKER', 'DEPOSITNOTE', 'UPDATE', '0'),
|
||||||
|
('portfolio', 'DELETE_DEPOSITNOTE_CHECKER', 'DEPOSITNOTE', 'DELETE', '0'),
|
||||||
|
('portfolio', 'CREATE_SAVINGNOTE', 'SAVINGNOTE', 'CREATE', '0'),
|
||||||
|
('portfolio', 'READ_SAVINGNOTE', 'SAVINGNOTE', 'READ', '0'),
|
||||||
|
('portfolio', 'UPDATE_SAVINGNOTE', 'SAVINGNOTE', 'UPDATE', '0'),
|
||||||
|
('portfolio', 'DELETE_SAVINGNOTE', 'SAVINGNOTE', 'DELETE', '0'),
|
||||||
|
('portfolio', 'CREATE_SAVINGNOTE_CHECKER', 'SAVINGNOTE', 'CREATE', '0'),
|
||||||
|
('portfolio', 'UPDATE_SAVINGNOTE_CHECKER', 'SAVINGNOTE', 'UPDATE', '0'),
|
||||||
|
('portfolio', 'DELETE_SAVINGNOTE_CHECKER', 'SAVINGNOTE', 'DELETE', '0'),
|
||||||
|
('portfolio', 'CREATE_GROUPNOTE', 'GROUPNOTE', 'CREATE', '0'),
|
||||||
|
('portfolio', 'READ_GROUPNOTE', 'GROUPNOTE', 'READ', '0'),
|
||||||
|
('portfolio', 'UPDATE_GROUPNOTE', 'GROUPNOTE', 'UPDATE', '0'),
|
||||||
|
('portfolio', 'DELETE_GROUPNOTE', 'GROUPNOTE', 'DELETE', '0'),
|
||||||
|
('portfolio', 'CREATE_GROUPNOTE_CHECKER', 'GROUPNOTE', 'CREATE', '0'),
|
||||||
|
('portfolio', 'UPDATE_GROUPNOTE_CHECKER', 'GROUPNOTE', 'UPDATE', '0'),
|
||||||
|
('portfolio', 'DELETE_GROUPNOTE_CHECKER', 'GROUPNOTE', 'DELETE', '0');
|
||||||
@@ -448,5 +448,18 @@ public class CommandWrapper {
|
|||||||
public boolean isCalendarResource() {
|
public boolean isCalendarResource() {
|
||||||
return this.entityName.equalsIgnoreCase("CALENDAR");
|
return this.entityName.equalsIgnoreCase("CALENDAR");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isNoteResource() {
|
||||||
|
boolean isnoteResource = false;
|
||||||
|
if(this.entityName.equalsIgnoreCase("CLIENTNOTE") ||
|
||||||
|
this.entityName.equalsIgnoreCase("LOANNOTE") ||
|
||||||
|
this.entityName.equalsIgnoreCase("LOANTRANSACTIONNOTE") ||
|
||||||
|
this.entityName.equalsIgnoreCase("DEPOSITNOTE") ||
|
||||||
|
this.entityName.equalsIgnoreCase("SAVINGNOTE") ||
|
||||||
|
this.entityName.equalsIgnoreCase("GROUPNOTE")){
|
||||||
|
isnoteResource = true;
|
||||||
|
}
|
||||||
|
return isnoteResource;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
+29
-17
@@ -301,23 +301,6 @@ public class CommandWrapperBuilder {
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public CommandWrapperBuilder createClientNote(final Long clientId) {
|
|
||||||
this.actionName = "CREATE";
|
|
||||||
this.entityName = "CLIENTNOTE";
|
|
||||||
this.clientId = clientId;
|
|
||||||
this.href = "/clients/" + clientId + "/notes/template";
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public CommandWrapperBuilder updateClientNote(final Long clientId, final Long noteId) {
|
|
||||||
this.actionName = "UPDATE";
|
|
||||||
this.entityName = "CLIENTNOTE";
|
|
||||||
this.entityId = noteId;
|
|
||||||
this.clientId = clientId;
|
|
||||||
this.href = "/clients/" + clientId + "/notes";
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public CommandWrapperBuilder createClient() {
|
public CommandWrapperBuilder createClient() {
|
||||||
this.actionName = "CREATE";
|
this.actionName = "CREATE";
|
||||||
this.entityName = "CLIENT";
|
this.entityName = "CLIENT";
|
||||||
@@ -892,4 +875,33 @@ public class CommandWrapperBuilder {
|
|||||||
this.href = "/" + supportedEntityType + "/" + supportedEntityId + "/calendars/" + calendarId;
|
this.href = "/" + supportedEntityType + "/" + supportedEntityId + "/calendars/" + calendarId;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public CommandWrapperBuilder createNote(final String entityName, final String resourceType, final Long resourceId) {
|
||||||
|
this.actionName = "CREATE";
|
||||||
|
this.entityName = entityName;//Note supports multiple resources. Note Permissions are set for each resource.
|
||||||
|
this.supportedEntityType = resourceType;
|
||||||
|
this.supportedEntityId = resourceId;
|
||||||
|
this.href = "/" + resourceType + "/" + resourceId + "/notes/template";
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public CommandWrapperBuilder updateNote(final String entityName, final String resourceType, final Long resourceId, final Long noteId) {
|
||||||
|
this.actionName = "UPDATE";
|
||||||
|
this.entityName = entityName;//Note supports multiple resources. Note Permissions are set for each resource.
|
||||||
|
this.entityId = noteId;
|
||||||
|
this.supportedEntityType = resourceType;
|
||||||
|
this.supportedEntityId = resourceId;
|
||||||
|
this.href = "/" + resourceType + "/" + resourceId + "/notes";
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public CommandWrapperBuilder deleteNote(final String entityName, final String resourceType, final Long resourceId, final Long noteId) {
|
||||||
|
this.actionName = "DELETE";
|
||||||
|
this.entityName = entityName;//Note supports multiple resources. Note Permissions are set for each resource.
|
||||||
|
this.entityId = noteId;
|
||||||
|
this.supportedEntityType = resourceType;
|
||||||
|
this.supportedEntityId = resourceId;
|
||||||
|
this.href = "/" + resourceType + "/" + resourceId + "/calendars/" + noteId;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
+5
-3
@@ -125,11 +125,13 @@ public class SynchronousCommandProcessingService implements CommandProcessingSer
|
|||||||
} else {
|
} else {
|
||||||
throw new UnsupportedCommandException(wrapper.commandName());
|
throw new UnsupportedCommandException(wrapper.commandName());
|
||||||
}
|
}
|
||||||
} else if (wrapper.isClientNoteResource()) {
|
} else if (wrapper.isNoteResource()) {
|
||||||
if (wrapper.isCreate()) {
|
if (wrapper.isCreate()) {
|
||||||
handler = applicationContext.getBean("createClientNoteCommandHandler", NewCommandSourceHandler.class);
|
handler = applicationContext.getBean("createNoteCommandHandler", NewCommandSourceHandler.class);
|
||||||
} else if (wrapper.isUpdate()) {
|
} else if (wrapper.isUpdate()) {
|
||||||
handler = applicationContext.getBean("updateClientNoteCommandHandler", NewCommandSourceHandler.class);
|
handler = applicationContext.getBean("updateNoteCommandHandler", NewCommandSourceHandler.class);
|
||||||
|
} else if (wrapper.isDelete()) {
|
||||||
|
handler = applicationContext.getBean("deleteNoteCommandHandler", NewCommandSourceHandler.class);
|
||||||
} else {
|
} else {
|
||||||
throw new UnsupportedCommandException(wrapper.commandName());
|
throw new UnsupportedCommandException(wrapper.commandName());
|
||||||
}
|
}
|
||||||
|
|||||||
-117
@@ -1,117 +0,0 @@
|
|||||||
/**
|
|
||||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
|
||||||
* You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
||||||
*/
|
|
||||||
package org.mifosplatform.portfolio.client.api;
|
|
||||||
|
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.HashSet;
|
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
import javax.ws.rs.Consumes;
|
|
||||||
import javax.ws.rs.GET;
|
|
||||||
import javax.ws.rs.POST;
|
|
||||||
import javax.ws.rs.PUT;
|
|
||||||
import javax.ws.rs.Path;
|
|
||||||
import javax.ws.rs.PathParam;
|
|
||||||
import javax.ws.rs.Produces;
|
|
||||||
import javax.ws.rs.core.Context;
|
|
||||||
import javax.ws.rs.core.MediaType;
|
|
||||||
import javax.ws.rs.core.UriInfo;
|
|
||||||
|
|
||||||
import org.mifosplatform.commands.domain.CommandWrapper;
|
|
||||||
import org.mifosplatform.commands.service.CommandWrapperBuilder;
|
|
||||||
import org.mifosplatform.commands.service.PortfolioCommandSourceWritePlatformService;
|
|
||||||
import org.mifosplatform.infrastructure.core.api.ApiRequestParameterHelper;
|
|
||||||
import org.mifosplatform.infrastructure.core.data.CommandProcessingResult;
|
|
||||||
import org.mifosplatform.infrastructure.core.serialization.ApiRequestJsonSerializationSettings;
|
|
||||||
import org.mifosplatform.infrastructure.core.serialization.DefaultToApiJsonSerializer;
|
|
||||||
import org.mifosplatform.infrastructure.security.service.PlatformSecurityContext;
|
|
||||||
import org.mifosplatform.portfolio.client.data.NoteData;
|
|
||||||
import org.mifosplatform.portfolio.client.service.ClientReadPlatformService;
|
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
|
||||||
import org.springframework.context.annotation.Scope;
|
|
||||||
import org.springframework.stereotype.Component;
|
|
||||||
|
|
||||||
@Path("/clients/{clientId}/notes")
|
|
||||||
@Component
|
|
||||||
@Scope("singleton")
|
|
||||||
public class ClientNotesApiResource {
|
|
||||||
|
|
||||||
private final Set<String> NOTE_DATA_PARAMETERS = new HashSet<String>(Arrays.asList("id", "clientId", "loanId", "loanTransactionId",
|
|
||||||
"noteType", "note", "createdById", "createdByUsername", "createdOn", "updatedById", "updatedByUsername", "updatedOn"));
|
|
||||||
|
|
||||||
private final PlatformSecurityContext context;
|
|
||||||
private final ClientReadPlatformService clientReadPlatformService;
|
|
||||||
private final DefaultToApiJsonSerializer<NoteData> toApiJsonSerializer;
|
|
||||||
private final ApiRequestParameterHelper apiRequestParameterHelper;
|
|
||||||
private final PortfolioCommandSourceWritePlatformService commandsSourceWritePlatformService;
|
|
||||||
|
|
||||||
@Autowired
|
|
||||||
public ClientNotesApiResource(final PlatformSecurityContext context, final ClientReadPlatformService readPlatformService,
|
|
||||||
final DefaultToApiJsonSerializer<NoteData> toApiJsonSerializer, final ApiRequestParameterHelper apiRequestParameterHelper,
|
|
||||||
final PortfolioCommandSourceWritePlatformService commandsSourceWritePlatformService) {
|
|
||||||
this.context = context;
|
|
||||||
this.clientReadPlatformService = readPlatformService;
|
|
||||||
this.toApiJsonSerializer = toApiJsonSerializer;
|
|
||||||
this.apiRequestParameterHelper = apiRequestParameterHelper;
|
|
||||||
this.commandsSourceWritePlatformService = commandsSourceWritePlatformService;
|
|
||||||
}
|
|
||||||
|
|
||||||
@GET
|
|
||||||
@Consumes({ MediaType.APPLICATION_JSON })
|
|
||||||
@Produces({ MediaType.APPLICATION_JSON })
|
|
||||||
public String retrieveAllClientNotes(@PathParam("clientId") final Long clientId, @Context final UriInfo uriInfo) {
|
|
||||||
|
|
||||||
context.authenticatedUser().validateHasReadPermission("CLIENTNOTE");
|
|
||||||
|
|
||||||
final Collection<NoteData> notes = this.clientReadPlatformService.retrieveAllClientNotes(clientId);
|
|
||||||
|
|
||||||
final ApiRequestJsonSerializationSettings settings = apiRequestParameterHelper.process(uriInfo.getQueryParameters());
|
|
||||||
return this.toApiJsonSerializer.serialize(settings, notes, NOTE_DATA_PARAMETERS);
|
|
||||||
}
|
|
||||||
|
|
||||||
@POST
|
|
||||||
@Consumes({ MediaType.APPLICATION_JSON })
|
|
||||||
@Produces({ MediaType.APPLICATION_JSON })
|
|
||||||
public String addNewClientNote(@PathParam("clientId") final Long clientId, final String apiRequestBodyAsJson) {
|
|
||||||
|
|
||||||
final CommandWrapper commandRequest = new CommandWrapperBuilder().createClientNote(clientId).withJson(apiRequestBodyAsJson).build();
|
|
||||||
|
|
||||||
final CommandProcessingResult result = this.commandsSourceWritePlatformService.logCommandSource(commandRequest);
|
|
||||||
|
|
||||||
return this.toApiJsonSerializer.serialize(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
@GET
|
|
||||||
@Path("{noteId}")
|
|
||||||
@Consumes({ MediaType.APPLICATION_JSON })
|
|
||||||
@Produces({ MediaType.APPLICATION_JSON })
|
|
||||||
public String retrieveClientNote(@PathParam("clientId") final Long clientId, @PathParam("noteId") final Long noteId,
|
|
||||||
@Context final UriInfo uriInfo) {
|
|
||||||
|
|
||||||
context.authenticatedUser().validateHasReadPermission("CLIENTNOTE");
|
|
||||||
|
|
||||||
final NoteData note = this.clientReadPlatformService.retrieveClientNote(clientId, noteId);
|
|
||||||
|
|
||||||
final ApiRequestJsonSerializationSettings settings = apiRequestParameterHelper.process(uriInfo.getQueryParameters());
|
|
||||||
return this.toApiJsonSerializer.serialize(settings, note, NOTE_DATA_PARAMETERS);
|
|
||||||
}
|
|
||||||
|
|
||||||
@PUT
|
|
||||||
@Path("{noteId}")
|
|
||||||
@Consumes({ MediaType.APPLICATION_JSON })
|
|
||||||
@Produces({ MediaType.APPLICATION_JSON })
|
|
||||||
public String updateClientNote(@PathParam("clientId") final Long clientId, @PathParam("noteId") final Long noteId,
|
|
||||||
final String apiRequestBodyAsJson) {
|
|
||||||
|
|
||||||
final CommandWrapper commandRequest = new CommandWrapperBuilder().updateClientNote(clientId, noteId).withJson(apiRequestBodyAsJson)
|
|
||||||
.build();
|
|
||||||
|
|
||||||
final CommandProcessingResult result = this.commandsSourceWritePlatformService.logCommandSource(commandRequest);
|
|
||||||
|
|
||||||
return this.toApiJsonSerializer.serialize(result);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
-46
@@ -1,46 +0,0 @@
|
|||||||
/**
|
|
||||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
|
||||||
* You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
||||||
*/
|
|
||||||
package org.mifosplatform.portfolio.client.command;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Immutable command used for create or update of notes.
|
|
||||||
*/
|
|
||||||
public class NoteCommand {
|
|
||||||
|
|
||||||
private final Long id;
|
|
||||||
private final Long clientId;
|
|
||||||
private final Long loanId;
|
|
||||||
private final Long loanTransactionId;
|
|
||||||
private final String note;
|
|
||||||
|
|
||||||
public NoteCommand(final Long id, Long clientId, final String note) {
|
|
||||||
this.id = id;
|
|
||||||
this.clientId = clientId;
|
|
||||||
this.loanId = null;
|
|
||||||
this.loanTransactionId = null;
|
|
||||||
this.note = note;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Long getId() {
|
|
||||||
return id;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Long getClientId() {
|
|
||||||
return clientId;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Long getLoanId() {
|
|
||||||
return loanId;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Long getLoanTransactionId() {
|
|
||||||
return loanTransactionId;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getNote() {
|
|
||||||
return note;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
-41
@@ -1,41 +0,0 @@
|
|||||||
/**
|
|
||||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
|
||||||
* You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
||||||
*/
|
|
||||||
package org.mifosplatform.portfolio.client.domain;
|
|
||||||
|
|
||||||
import org.mifosplatform.infrastructure.core.data.EnumOptionData;
|
|
||||||
import org.mifosplatform.portfolio.client.domain.Note.NoteType;
|
|
||||||
|
|
||||||
public class NoteEnumerations {
|
|
||||||
|
|
||||||
public static EnumOptionData noteType(final Integer id) {
|
|
||||||
return noteType(Note.NoteType.parse(id));
|
|
||||||
}
|
|
||||||
|
|
||||||
public static EnumOptionData noteType(NoteType type) {
|
|
||||||
EnumOptionData optionData = null;
|
|
||||||
switch (type) {
|
|
||||||
case CLIENT:
|
|
||||||
optionData = new EnumOptionData(type.getValue().longValue(), type.getCode(), "Client note");
|
|
||||||
break;
|
|
||||||
case LOAN:
|
|
||||||
optionData = new EnumOptionData(type.getValue().longValue(), type.getCode(), "Loan note");
|
|
||||||
break;
|
|
||||||
case LOAN_TRANSACTION:
|
|
||||||
optionData = new EnumOptionData(type.getValue().longValue(), type.getCode(), "Loan transaction note");
|
|
||||||
break;
|
|
||||||
case DEPOSIT:
|
|
||||||
optionData = new EnumOptionData(type.getValue().longValue(), type.getCode(), "Deposit transaction note");
|
|
||||||
break;
|
|
||||||
case SAVING:
|
|
||||||
optionData = new EnumOptionData(type.getValue().longValue(), type.getCode(), "Saving transaction note");
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
|
|
||||||
}
|
|
||||||
return optionData;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
-18
@@ -1,18 +0,0 @@
|
|||||||
/**
|
|
||||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
|
||||||
* You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
||||||
*/
|
|
||||||
package org.mifosplatform.portfolio.client.domain;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import org.springframework.data.jpa.repository.JpaRepository;
|
|
||||||
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
|
|
||||||
|
|
||||||
public interface NoteRepository extends JpaRepository<Note, Long>, JpaSpecificationExecutor<Note> {
|
|
||||||
|
|
||||||
List<Note> findByLoanId(Long id);
|
|
||||||
|
|
||||||
List<Note> findByClientId(Long id);
|
|
||||||
}
|
|
||||||
-59
@@ -1,59 +0,0 @@
|
|||||||
/**
|
|
||||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
|
||||||
* You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
||||||
*/
|
|
||||||
package org.mifosplatform.portfolio.client.serialization;
|
|
||||||
|
|
||||||
import java.lang.reflect.Type;
|
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.HashSet;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
import org.apache.commons.lang.StringUtils;
|
|
||||||
import org.mifosplatform.infrastructure.core.exception.InvalidJsonException;
|
|
||||||
import org.mifosplatform.infrastructure.core.serialization.AbstractFromApiJsonDeserializer;
|
|
||||||
import org.mifosplatform.infrastructure.core.serialization.FromApiJsonDeserializer;
|
|
||||||
import org.mifosplatform.infrastructure.core.serialization.FromJsonHelper;
|
|
||||||
import org.mifosplatform.portfolio.client.command.ClientCommand;
|
|
||||||
import org.mifosplatform.portfolio.client.command.ClientNoteCommand;
|
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
|
||||||
import org.springframework.stereotype.Component;
|
|
||||||
|
|
||||||
import com.google.gson.JsonElement;
|
|
||||||
import com.google.gson.reflect.TypeToken;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Implementation of {@link FromApiJsonDeserializer} for {@link ClientCommand}
|
|
||||||
* 's.
|
|
||||||
*/
|
|
||||||
@Component
|
|
||||||
public final class ClientNoteCommandFromApiJsonDeserializer extends AbstractFromApiJsonDeserializer<ClientNoteCommand> {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The parameters supported for this command.
|
|
||||||
*/
|
|
||||||
private final Set<String> supportedParameters = new HashSet<String>(Arrays.asList("note"));
|
|
||||||
|
|
||||||
private final FromJsonHelper fromApiJsonHelper;
|
|
||||||
|
|
||||||
@Autowired
|
|
||||||
public ClientNoteCommandFromApiJsonDeserializer(final FromJsonHelper fromApiJsonHelper) {
|
|
||||||
this.fromApiJsonHelper = fromApiJsonHelper;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ClientNoteCommand commandFromApiJson(final String json) {
|
|
||||||
|
|
||||||
if (StringUtils.isBlank(json)) { throw new InvalidJsonException(); }
|
|
||||||
|
|
||||||
final Type typeOfMap = new TypeToken<Map<String, Object>>() {}.getType();
|
|
||||||
fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, supportedParameters);
|
|
||||||
|
|
||||||
final JsonElement element = fromApiJsonHelper.parse(json);
|
|
||||||
final String note = fromApiJsonHelper.extractStringNamed("note", element);
|
|
||||||
|
|
||||||
return new ClientNoteCommand(note);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
-5
@@ -12,7 +12,6 @@ import org.mifosplatform.portfolio.client.data.ClientAccountSummaryData;
|
|||||||
import org.mifosplatform.portfolio.client.data.ClientData;
|
import org.mifosplatform.portfolio.client.data.ClientData;
|
||||||
import org.mifosplatform.portfolio.client.data.ClientIdentifierData;
|
import org.mifosplatform.portfolio.client.data.ClientIdentifierData;
|
||||||
import org.mifosplatform.portfolio.client.data.ClientLookup;
|
import org.mifosplatform.portfolio.client.data.ClientLookup;
|
||||||
import org.mifosplatform.portfolio.client.data.NoteData;
|
|
||||||
|
|
||||||
public interface ClientReadPlatformService {
|
public interface ClientReadPlatformService {
|
||||||
|
|
||||||
@@ -30,10 +29,6 @@ public interface ClientReadPlatformService {
|
|||||||
|
|
||||||
Collection<ClientAccountSummaryData> retrieveClientLoanAccountsByLoanOfficerId(Long clientId, Long loanOfficerId);
|
Collection<ClientAccountSummaryData> retrieveClientLoanAccountsByLoanOfficerId(Long clientId, Long loanOfficerId);
|
||||||
|
|
||||||
Collection<NoteData> retrieveAllClientNotes(Long clientId);
|
|
||||||
|
|
||||||
NoteData retrieveClientNote(Long clientId, Long noteId);
|
|
||||||
|
|
||||||
Collection<ClientIdentifierData> retrieveClientIdentifiers(Long clientId);
|
Collection<ClientIdentifierData> retrieveClientIdentifiers(Long clientId);
|
||||||
|
|
||||||
ClientIdentifierData retrieveClientIdentifier(Long clientId, Long clientIdentifierId);
|
ClientIdentifierData retrieveClientIdentifier(Long clientId, Long clientIdentifierId);
|
||||||
|
|||||||
+1
-98
@@ -12,9 +12,7 @@ import java.util.Collection;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import org.apache.commons.lang.StringUtils;
|
import org.apache.commons.lang.StringUtils;
|
||||||
import org.joda.time.DateTime;
|
|
||||||
import org.joda.time.LocalDate;
|
import org.joda.time.LocalDate;
|
||||||
import org.mifosplatform.infrastructure.core.data.EnumOptionData;
|
|
||||||
import org.mifosplatform.infrastructure.core.domain.JdbcSupport;
|
import org.mifosplatform.infrastructure.core.domain.JdbcSupport;
|
||||||
import org.mifosplatform.infrastructure.core.service.TenantAwareRoutingDataSource;
|
import org.mifosplatform.infrastructure.core.service.TenantAwareRoutingDataSource;
|
||||||
import org.mifosplatform.infrastructure.security.service.PlatformSecurityContext;
|
import org.mifosplatform.infrastructure.security.service.PlatformSecurityContext;
|
||||||
@@ -25,14 +23,10 @@ import org.mifosplatform.portfolio.client.data.ClientAccountSummaryData;
|
|||||||
import org.mifosplatform.portfolio.client.data.ClientData;
|
import org.mifosplatform.portfolio.client.data.ClientData;
|
||||||
import org.mifosplatform.portfolio.client.data.ClientIdentifierData;
|
import org.mifosplatform.portfolio.client.data.ClientIdentifierData;
|
||||||
import org.mifosplatform.portfolio.client.data.ClientLookup;
|
import org.mifosplatform.portfolio.client.data.ClientLookup;
|
||||||
import org.mifosplatform.portfolio.client.data.NoteData;
|
|
||||||
import org.mifosplatform.portfolio.client.domain.NoteEnumerations;
|
|
||||||
import org.mifosplatform.portfolio.client.exception.ClientIdentifierNotFoundException;
|
import org.mifosplatform.portfolio.client.exception.ClientIdentifierNotFoundException;
|
||||||
import org.mifosplatform.portfolio.client.exception.ClientNotFoundException;
|
import org.mifosplatform.portfolio.client.exception.ClientNotFoundException;
|
||||||
import org.mifosplatform.portfolio.client.exception.NoteNotFoundException;
|
|
||||||
import org.mifosplatform.portfolio.loanaccount.data.LoanStatusEnumData;
|
import org.mifosplatform.portfolio.loanaccount.data.LoanStatusEnumData;
|
||||||
import org.mifosplatform.portfolio.loanproduct.service.LoanEnumerations;
|
import org.mifosplatform.portfolio.loanproduct.service.LoanEnumerations;
|
||||||
import org.mifosplatform.useradministration.data.AppUserData;
|
|
||||||
import org.mifosplatform.useradministration.domain.AppUser;
|
import org.mifosplatform.useradministration.domain.AppUser;
|
||||||
import org.mifosplatform.useradministration.service.AppUserReadPlatformService;
|
import org.mifosplatform.useradministration.service.AppUserReadPlatformService;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
@@ -356,98 +350,7 @@ public class ClientReadPlatformServiceImpl implements ClientReadPlatformService
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public NoteData retrieveClientNote(final Long clientId, final Long noteId) {
|
|
||||||
|
|
||||||
try {
|
|
||||||
context.authenticatedUser();
|
|
||||||
|
|
||||||
// Check if client exists
|
|
||||||
retrieveIndividualClient(clientId);
|
|
||||||
|
|
||||||
// FIXME - KW - use join on sql query to fetch user information for
|
|
||||||
// note
|
|
||||||
// rather than fetching users?
|
|
||||||
Collection<AppUserData> allUsers = this.appUserReadPlatformService.retrieveAllUsers();
|
|
||||||
|
|
||||||
NoteMapper noteMapper = new NoteMapper(allUsers);
|
|
||||||
|
|
||||||
String sql = "select " + noteMapper.schema() + " where n.client_id = ? and n.id = ?";
|
|
||||||
|
|
||||||
return this.jdbcTemplate.queryForObject(sql, noteMapper, new Object[] { clientId, noteId });
|
|
||||||
} catch (EmptyResultDataAccessException e) {
|
|
||||||
throw new NoteNotFoundException(clientId);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Collection<NoteData> retrieveAllClientNotes(final Long clientId) {
|
|
||||||
|
|
||||||
context.authenticatedUser();
|
|
||||||
|
|
||||||
// Check if client exists
|
|
||||||
retrieveIndividualClient(clientId);
|
|
||||||
|
|
||||||
// FIXME - KW - use join on sql query to fetch user information for note
|
|
||||||
// rather than fetching users?
|
|
||||||
Collection<AppUserData> allUsers = this.appUserReadPlatformService.retrieveAllUsers();
|
|
||||||
|
|
||||||
NoteMapper noteMapper = new NoteMapper(allUsers);
|
|
||||||
|
|
||||||
String sql = "select " + noteMapper.schema() + " where n.client_id = ? order by n.created_date DESC";
|
|
||||||
|
|
||||||
return this.jdbcTemplate.query(sql, noteMapper, new Object[] { clientId });
|
|
||||||
}
|
|
||||||
|
|
||||||
private static final class NoteMapper implements RowMapper<NoteData> {
|
|
||||||
|
|
||||||
private final Collection<AppUserData> allUsers;
|
|
||||||
|
|
||||||
public NoteMapper(final Collection<AppUserData> allUsers) {
|
|
||||||
this.allUsers = allUsers;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String schema() {
|
|
||||||
return "n.id as id, n.client_id as clientId, n.loan_id as loanId, n.loan_transaction_id as transactionId, n.note_type_enum as noteTypeEnum, n.note as note, "
|
|
||||||
+ "n.created_date as createdDate, n.createdby_id as createdById, n.lastmodified_date as lastModifiedDate, n.lastmodifiedby_id as lastModifiedById"
|
|
||||||
+ " from m_note n";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public NoteData mapRow(final ResultSet rs, @SuppressWarnings("unused") final int rowNum) throws SQLException {
|
|
||||||
|
|
||||||
Long id = JdbcSupport.getLong(rs, "id");
|
|
||||||
Long clientId = JdbcSupport.getLong(rs, "clientId");
|
|
||||||
Long loanId = JdbcSupport.getLong(rs, "loanId");
|
|
||||||
Long transactionId = JdbcSupport.getLong(rs, "transactionId");
|
|
||||||
Integer noteTypeId = JdbcSupport.getInteger(rs, "noteTypeEnum");
|
|
||||||
EnumOptionData noteType = NoteEnumerations.noteType(noteTypeId);
|
|
||||||
String note = rs.getString("note");
|
|
||||||
|
|
||||||
DateTime createdDate = JdbcSupport.getDateTime(rs, "createdDate");
|
|
||||||
Long createdById = JdbcSupport.getLong(rs, "createdById");
|
|
||||||
String createdByUsername = findUserById(createdById, allUsers);
|
|
||||||
|
|
||||||
DateTime lastModifiedDate = JdbcSupport.getDateTime(rs, "lastModifiedDate");
|
|
||||||
Long lastModifiedById = JdbcSupport.getLong(rs, "lastModifiedById");
|
|
||||||
String updatedByUsername = findUserById(createdById, allUsers);
|
|
||||||
|
|
||||||
return new NoteData(id, clientId, loanId, transactionId, noteType, note, createdDate, createdById, createdByUsername,
|
|
||||||
lastModifiedDate, lastModifiedById, updatedByUsername);
|
|
||||||
}
|
|
||||||
|
|
||||||
private String findUserById(final Long createdById, final Collection<AppUserData> allUsers) {
|
|
||||||
String username = "";
|
|
||||||
for (AppUserData appUserData : allUsers) {
|
|
||||||
if (appUserData.hasIdentifyOf(createdById)) {
|
|
||||||
username = appUserData.username();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return username;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Collection<ClientIdentifierData> retrieveClientIdentifiers(final Long clientId) {
|
public Collection<ClientIdentifierData> retrieveClientIdentifiers(final Long clientId) {
|
||||||
|
|
||||||
|
|||||||
-4
@@ -29,10 +29,6 @@ public interface ClientWritePlatformService {
|
|||||||
@PreAuthorize(value = "hasAnyRole('ALL_FUNCTIONS', 'DELETE_CLIENTIMAGE')")
|
@PreAuthorize(value = "hasAnyRole('ALL_FUNCTIONS', 'DELETE_CLIENTIMAGE')")
|
||||||
CommandProcessingResult deleteClientImage(Long clientId);
|
CommandProcessingResult deleteClientImage(Long clientId);
|
||||||
|
|
||||||
CommandProcessingResult addClientNote(Long clientId, JsonCommand command);
|
|
||||||
|
|
||||||
CommandProcessingResult updateClientNote(Long clientId, Long noteId, JsonCommand command);
|
|
||||||
|
|
||||||
CommandProcessingResult addClientIdentifier(Long clientId, JsonCommand command);
|
CommandProcessingResult addClientIdentifier(Long clientId, JsonCommand command);
|
||||||
|
|
||||||
CommandProcessingResult updateClientIdentifier(Long clientId, Long clientIdentifierId, JsonCommand command);
|
CommandProcessingResult updateClientIdentifier(Long clientId, Long clientIdentifierId, JsonCommand command);
|
||||||
|
|||||||
+1
-56
@@ -26,22 +26,17 @@ import org.mifosplatform.organisation.office.domain.Office;
|
|||||||
import org.mifosplatform.organisation.office.domain.OfficeRepository;
|
import org.mifosplatform.organisation.office.domain.OfficeRepository;
|
||||||
import org.mifosplatform.organisation.office.exception.OfficeNotFoundException;
|
import org.mifosplatform.organisation.office.exception.OfficeNotFoundException;
|
||||||
import org.mifosplatform.portfolio.client.command.ClientIdentifierCommand;
|
import org.mifosplatform.portfolio.client.command.ClientIdentifierCommand;
|
||||||
import org.mifosplatform.portfolio.client.command.ClientNoteCommand;
|
|
||||||
import org.mifosplatform.portfolio.client.domain.AccountNumberGenerator;
|
import org.mifosplatform.portfolio.client.domain.AccountNumberGenerator;
|
||||||
import org.mifosplatform.portfolio.client.domain.AccountNumberGeneratorFactory;
|
import org.mifosplatform.portfolio.client.domain.AccountNumberGeneratorFactory;
|
||||||
import org.mifosplatform.portfolio.client.domain.Client;
|
import org.mifosplatform.portfolio.client.domain.Client;
|
||||||
import org.mifosplatform.portfolio.client.domain.ClientIdentifier;
|
import org.mifosplatform.portfolio.client.domain.ClientIdentifier;
|
||||||
import org.mifosplatform.portfolio.client.domain.ClientIdentifierRepository;
|
import org.mifosplatform.portfolio.client.domain.ClientIdentifierRepository;
|
||||||
import org.mifosplatform.portfolio.client.domain.ClientRepository;
|
import org.mifosplatform.portfolio.client.domain.ClientRepository;
|
||||||
import org.mifosplatform.portfolio.client.domain.Note;
|
|
||||||
import org.mifosplatform.portfolio.client.domain.NoteRepository;
|
|
||||||
import org.mifosplatform.portfolio.client.exception.ClientIdentifierNotFoundException;
|
import org.mifosplatform.portfolio.client.exception.ClientIdentifierNotFoundException;
|
||||||
import org.mifosplatform.portfolio.client.exception.ClientNotFoundException;
|
import org.mifosplatform.portfolio.client.exception.ClientNotFoundException;
|
||||||
import org.mifosplatform.portfolio.client.exception.DuplicateClientIdentifierException;
|
import org.mifosplatform.portfolio.client.exception.DuplicateClientIdentifierException;
|
||||||
import org.mifosplatform.portfolio.client.exception.NoteNotFoundException;
|
|
||||||
import org.mifosplatform.portfolio.client.serialization.ClientCommandFromApiJsonDeserializer;
|
import org.mifosplatform.portfolio.client.serialization.ClientCommandFromApiJsonDeserializer;
|
||||||
import org.mifosplatform.portfolio.client.serialization.ClientIdentifierCommandFromApiJsonDeserializer;
|
import org.mifosplatform.portfolio.client.serialization.ClientIdentifierCommandFromApiJsonDeserializer;
|
||||||
import org.mifosplatform.portfolio.client.serialization.ClientNoteCommandFromApiJsonDeserializer;
|
|
||||||
import org.mifosplatform.portfolio.group.domain.Group;
|
import org.mifosplatform.portfolio.group.domain.Group;
|
||||||
import org.mifosplatform.portfolio.group.domain.GroupRepository;
|
import org.mifosplatform.portfolio.group.domain.GroupRepository;
|
||||||
import org.mifosplatform.portfolio.group.exception.GroupNotFoundException;
|
import org.mifosplatform.portfolio.group.exception.GroupNotFoundException;
|
||||||
@@ -62,19 +57,16 @@ public class ClientWritePlatformServiceJpaRepositoryImpl implements ClientWriteP
|
|||||||
private final ClientIdentifierRepository clientIdentifierRepository;
|
private final ClientIdentifierRepository clientIdentifierRepository;
|
||||||
private final OfficeRepository officeRepository;
|
private final OfficeRepository officeRepository;
|
||||||
private final GroupRepository groupRepository;
|
private final GroupRepository groupRepository;
|
||||||
private final NoteRepository noteRepository;
|
|
||||||
private final CodeValueRepositoryWrapper codeValueRepository;
|
private final CodeValueRepositoryWrapper codeValueRepository;
|
||||||
private final ClientCommandFromApiJsonDeserializer fromApiJsonDeserializer;
|
private final ClientCommandFromApiJsonDeserializer fromApiJsonDeserializer;
|
||||||
private final ClientNoteCommandFromApiJsonDeserializer clientNoteFromApiJsonDeserializer;
|
|
||||||
private final ClientIdentifierCommandFromApiJsonDeserializer clientIdentifierCommandFromApiJsonDeserializer;
|
private final ClientIdentifierCommandFromApiJsonDeserializer clientIdentifierCommandFromApiJsonDeserializer;
|
||||||
private final AccountNumberGeneratorFactory accountIdentifierGeneratorFactory;
|
private final AccountNumberGeneratorFactory accountIdentifierGeneratorFactory;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
public ClientWritePlatformServiceJpaRepositoryImpl(final PlatformSecurityContext context, final ClientRepository clientRepository,
|
public ClientWritePlatformServiceJpaRepositoryImpl(final PlatformSecurityContext context, final ClientRepository clientRepository,
|
||||||
final ClientIdentifierRepository clientIdentifierRepository, final OfficeRepository officeRepository,
|
final ClientIdentifierRepository clientIdentifierRepository, final OfficeRepository officeRepository,
|
||||||
final NoteRepository noteRepository, final CodeValueRepositoryWrapper codeValueRepository,
|
final CodeValueRepositoryWrapper codeValueRepository,
|
||||||
final ClientCommandFromApiJsonDeserializer fromApiJsonDeserializer,
|
final ClientCommandFromApiJsonDeserializer fromApiJsonDeserializer,
|
||||||
final ClientNoteCommandFromApiJsonDeserializer clientNoteFromApiJsonDeserializer,
|
|
||||||
final ClientIdentifierCommandFromApiJsonDeserializer clientIdentifierCommandFromApiJsonDeserializer,
|
final ClientIdentifierCommandFromApiJsonDeserializer clientIdentifierCommandFromApiJsonDeserializer,
|
||||||
final AccountNumberGeneratorFactory accountIdentifierGeneratorFactory,
|
final AccountNumberGeneratorFactory accountIdentifierGeneratorFactory,
|
||||||
final GroupRepository groupRepository) {
|
final GroupRepository groupRepository) {
|
||||||
@@ -82,10 +74,8 @@ public class ClientWritePlatformServiceJpaRepositoryImpl implements ClientWriteP
|
|||||||
this.clientRepository = clientRepository;
|
this.clientRepository = clientRepository;
|
||||||
this.clientIdentifierRepository = clientIdentifierRepository;
|
this.clientIdentifierRepository = clientIdentifierRepository;
|
||||||
this.officeRepository = officeRepository;
|
this.officeRepository = officeRepository;
|
||||||
this.noteRepository = noteRepository;
|
|
||||||
this.codeValueRepository = codeValueRepository;
|
this.codeValueRepository = codeValueRepository;
|
||||||
this.fromApiJsonDeserializer = fromApiJsonDeserializer;
|
this.fromApiJsonDeserializer = fromApiJsonDeserializer;
|
||||||
this.clientNoteFromApiJsonDeserializer = clientNoteFromApiJsonDeserializer;
|
|
||||||
this.clientIdentifierCommandFromApiJsonDeserializer = clientIdentifierCommandFromApiJsonDeserializer;
|
this.clientIdentifierCommandFromApiJsonDeserializer = clientIdentifierCommandFromApiJsonDeserializer;
|
||||||
this.accountIdentifierGeneratorFactory = accountIdentifierGeneratorFactory;
|
this.accountIdentifierGeneratorFactory = accountIdentifierGeneratorFactory;
|
||||||
this.groupRepository = groupRepository;
|
this.groupRepository = groupRepository;
|
||||||
@@ -213,51 +203,6 @@ public class ClientWritePlatformServiceJpaRepositoryImpl implements ClientWriteP
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Transactional
|
|
||||||
@Override
|
|
||||||
public CommandProcessingResult addClientNote(final Long clientId, final JsonCommand command) {
|
|
||||||
|
|
||||||
context.authenticatedUser();
|
|
||||||
|
|
||||||
final ClientNoteCommand clientNoteCommand = this.clientNoteFromApiJsonDeserializer.commandFromApiJson(command.json());
|
|
||||||
clientNoteCommand.validate();
|
|
||||||
|
|
||||||
final Client clientForUpdate = this.clientRepository.findOne(clientId);
|
|
||||||
if (clientForUpdate == null) { throw new ClientNotFoundException(clientId); }
|
|
||||||
|
|
||||||
final Note note = Note.clientNoteFromJson(clientForUpdate, command);
|
|
||||||
|
|
||||||
this.noteRepository.save(note);
|
|
||||||
|
|
||||||
return new CommandProcessingResultBuilder().withCommandId(command.commandId()).withOfficeId(clientForUpdate.getOffice().getId())
|
|
||||||
.withClientId(clientId).withEntityId(note.getId()).build();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Transactional
|
|
||||||
@Override
|
|
||||||
public CommandProcessingResult updateClientNote(final Long clientId, final Long noteId, final JsonCommand command) {
|
|
||||||
|
|
||||||
context.authenticatedUser();
|
|
||||||
|
|
||||||
final ClientNoteCommand clientNoteCommand = this.clientNoteFromApiJsonDeserializer.commandFromApiJson(command.json());
|
|
||||||
clientNoteCommand.validate();
|
|
||||||
|
|
||||||
final Note noteForUpdate = this.noteRepository.findOne(noteId);
|
|
||||||
if (noteForUpdate == null || noteForUpdate.isNotAgainstClientWithIdOf(clientId)) { throw new NoteNotFoundException(noteId,
|
|
||||||
clientId, "client"); }
|
|
||||||
|
|
||||||
final Client client = this.clientRepository.findOne(clientId);
|
|
||||||
|
|
||||||
final Map<String, Object> changes = noteForUpdate.update(command);
|
|
||||||
|
|
||||||
if (!changes.isEmpty()) {
|
|
||||||
this.noteRepository.save(noteForUpdate);
|
|
||||||
}
|
|
||||||
|
|
||||||
return new CommandProcessingResultBuilder().withCommandId(command.commandId()).withOfficeId(client.getOffice().getId())
|
|
||||||
.withClientId(clientId).withEntityId(noteId).with(changes).build();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Transactional
|
@Transactional
|
||||||
@Override
|
@Override
|
||||||
public CommandProcessingResult addClientIdentifier(final Long clientId, final JsonCommand command) {
|
public CommandProcessingResult addClientIdentifier(final Long clientId, final JsonCommand command) {
|
||||||
|
|||||||
+6
@@ -296,4 +296,10 @@ public final class LoanTransaction extends AbstractPersistable<Long> {
|
|||||||
|
|
||||||
return thisTransactionData;
|
return thisTransactionData;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public Loan getLoan() {
|
||||||
|
return this.loan;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
+2
-2
@@ -24,8 +24,6 @@ import org.mifosplatform.portfolio.client.domain.AccountNumberGenerator;
|
|||||||
import org.mifosplatform.portfolio.client.domain.AccountNumberGeneratorFactory;
|
import org.mifosplatform.portfolio.client.domain.AccountNumberGeneratorFactory;
|
||||||
import org.mifosplatform.portfolio.client.domain.Client;
|
import org.mifosplatform.portfolio.client.domain.Client;
|
||||||
import org.mifosplatform.portfolio.client.domain.ClientRepository;
|
import org.mifosplatform.portfolio.client.domain.ClientRepository;
|
||||||
import org.mifosplatform.portfolio.client.domain.Note;
|
|
||||||
import org.mifosplatform.portfolio.client.domain.NoteRepository;
|
|
||||||
import org.mifosplatform.portfolio.client.exception.ClientNotFoundException;
|
import org.mifosplatform.portfolio.client.exception.ClientNotFoundException;
|
||||||
import org.mifosplatform.portfolio.fund.domain.Fund;
|
import org.mifosplatform.portfolio.fund.domain.Fund;
|
||||||
import org.mifosplatform.portfolio.loanaccount.domain.DefaultLoanLifecycleStateMachine;
|
import org.mifosplatform.portfolio.loanaccount.domain.DefaultLoanLifecycleStateMachine;
|
||||||
@@ -49,6 +47,8 @@ import org.mifosplatform.portfolio.loanproduct.domain.LoanProduct;
|
|||||||
import org.mifosplatform.portfolio.loanproduct.domain.LoanProductRepository;
|
import org.mifosplatform.portfolio.loanproduct.domain.LoanProductRepository;
|
||||||
import org.mifosplatform.portfolio.loanproduct.domain.LoanTransactionProcessingStrategy;
|
import org.mifosplatform.portfolio.loanproduct.domain.LoanTransactionProcessingStrategy;
|
||||||
import org.mifosplatform.portfolio.loanproduct.exception.LoanProductNotFoundException;
|
import org.mifosplatform.portfolio.loanproduct.exception.LoanProductNotFoundException;
|
||||||
|
import org.mifosplatform.portfolio.note.domain.Note;
|
||||||
|
import org.mifosplatform.portfolio.note.domain.NoteRepository;
|
||||||
import org.mifosplatform.useradministration.domain.AppUser;
|
import org.mifosplatform.useradministration.domain.AppUser;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|||||||
+2
-2
@@ -25,8 +25,6 @@ import org.mifosplatform.organisation.staff.domain.Staff;
|
|||||||
import org.mifosplatform.portfolio.charge.domain.Charge;
|
import org.mifosplatform.portfolio.charge.domain.Charge;
|
||||||
import org.mifosplatform.portfolio.charge.domain.ChargeRepositoryWrapper;
|
import org.mifosplatform.portfolio.charge.domain.ChargeRepositoryWrapper;
|
||||||
import org.mifosplatform.portfolio.charge.exception.LoanChargeNotFoundException;
|
import org.mifosplatform.portfolio.charge.exception.LoanChargeNotFoundException;
|
||||||
import org.mifosplatform.portfolio.client.domain.Note;
|
|
||||||
import org.mifosplatform.portfolio.client.domain.NoteRepository;
|
|
||||||
import org.mifosplatform.portfolio.loanaccount.command.LoanUpdateCommand;
|
import org.mifosplatform.portfolio.loanaccount.command.LoanUpdateCommand;
|
||||||
import org.mifosplatform.portfolio.loanaccount.domain.DefaultLoanLifecycleStateMachine;
|
import org.mifosplatform.portfolio.loanaccount.domain.DefaultLoanLifecycleStateMachine;
|
||||||
import org.mifosplatform.portfolio.loanaccount.domain.Loan;
|
import org.mifosplatform.portfolio.loanaccount.domain.Loan;
|
||||||
@@ -46,6 +44,8 @@ import org.mifosplatform.portfolio.loanaccount.exception.LoanTransactionNotFound
|
|||||||
import org.mifosplatform.portfolio.loanaccount.serialization.LoanEventApiJsonValidator;
|
import org.mifosplatform.portfolio.loanaccount.serialization.LoanEventApiJsonValidator;
|
||||||
import org.mifosplatform.portfolio.loanaccount.serialization.LoanUpdateCommandFromApiJsonDeserializer;
|
import org.mifosplatform.portfolio.loanaccount.serialization.LoanUpdateCommandFromApiJsonDeserializer;
|
||||||
import org.mifosplatform.portfolio.loanproduct.exception.InvalidCurrencyException;
|
import org.mifosplatform.portfolio.loanproduct.exception.InvalidCurrencyException;
|
||||||
|
import org.mifosplatform.portfolio.note.domain.Note;
|
||||||
|
import org.mifosplatform.portfolio.note.domain.NoteRepository;
|
||||||
import org.mifosplatform.useradministration.domain.AppUser;
|
import org.mifosplatform.useradministration.domain.AppUser;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|||||||
+178
@@ -0,0 +1,178 @@
|
|||||||
|
/**
|
||||||
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
|
* You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
|
*/
|
||||||
|
package org.mifosplatform.portfolio.note.api;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import javax.ws.rs.Consumes;
|
||||||
|
import javax.ws.rs.DELETE;
|
||||||
|
import javax.ws.rs.GET;
|
||||||
|
import javax.ws.rs.POST;
|
||||||
|
import javax.ws.rs.PUT;
|
||||||
|
import javax.ws.rs.Path;
|
||||||
|
import javax.ws.rs.PathParam;
|
||||||
|
import javax.ws.rs.Produces;
|
||||||
|
import javax.ws.rs.core.Context;
|
||||||
|
import javax.ws.rs.core.MediaType;
|
||||||
|
import javax.ws.rs.core.UriInfo;
|
||||||
|
|
||||||
|
import org.mifosplatform.commands.domain.CommandWrapper;
|
||||||
|
import org.mifosplatform.commands.service.CommandWrapperBuilder;
|
||||||
|
import org.mifosplatform.commands.service.PortfolioCommandSourceWritePlatformService;
|
||||||
|
import org.mifosplatform.infrastructure.core.api.ApiRequestParameterHelper;
|
||||||
|
import org.mifosplatform.infrastructure.core.data.CommandProcessingResult;
|
||||||
|
import org.mifosplatform.infrastructure.core.serialization.ApiRequestJsonSerializationSettings;
|
||||||
|
import org.mifosplatform.infrastructure.core.serialization.DefaultToApiJsonSerializer;
|
||||||
|
import org.mifosplatform.infrastructure.security.service.PlatformSecurityContext;
|
||||||
|
import org.mifosplatform.portfolio.note.data.NoteData;
|
||||||
|
import org.mifosplatform.portfolio.note.domain.NoteType;
|
||||||
|
import org.mifosplatform.portfolio.note.service.NoteReadPlatformService;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.context.annotation.Scope;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
@Path("/{resourceType}/{resourceId}/notes")
|
||||||
|
@Component
|
||||||
|
@Scope("singleton")
|
||||||
|
public class NotesApiResource {
|
||||||
|
|
||||||
|
private final Set<String> NOTE_DATA_PARAMETERS = new HashSet<String>(Arrays.asList("id", "clientId", "groupId", "loanId",
|
||||||
|
"loanTransactionId", "depositAccountId", "savingAccountId", "noteType", "note", "createdById", "createdByUsername",
|
||||||
|
"createdOn", "updatedById", "updatedByUsername", "updatedOn"));
|
||||||
|
|
||||||
|
private final PlatformSecurityContext context;
|
||||||
|
private final NoteReadPlatformService readPlatformService;
|
||||||
|
private final DefaultToApiJsonSerializer<NoteData> toApiJsonSerializer;
|
||||||
|
private final ApiRequestParameterHelper apiRequestParameterHelper;
|
||||||
|
private final PortfolioCommandSourceWritePlatformService commandsSourceWritePlatformService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
public NotesApiResource(final PlatformSecurityContext context, final NoteReadPlatformService readPlatformService,
|
||||||
|
final DefaultToApiJsonSerializer<NoteData> toApiJsonSerializer, final ApiRequestParameterHelper apiRequestParameterHelper,
|
||||||
|
final PortfolioCommandSourceWritePlatformService commandsSourceWritePlatformService) {
|
||||||
|
this.context = context;
|
||||||
|
this.readPlatformService = readPlatformService;
|
||||||
|
this.toApiJsonSerializer = toApiJsonSerializer;
|
||||||
|
this.apiRequestParameterHelper = apiRequestParameterHelper;
|
||||||
|
this.commandsSourceWritePlatformService = commandsSourceWritePlatformService;
|
||||||
|
}
|
||||||
|
|
||||||
|
@GET
|
||||||
|
@Consumes({ MediaType.APPLICATION_JSON })
|
||||||
|
@Produces({ MediaType.APPLICATION_JSON })
|
||||||
|
public String retrieveNotesByResource(@PathParam("resourceType") final String resourceType,
|
||||||
|
@PathParam("resourceId") final Long resourceId, @Context final UriInfo uriInfo) {
|
||||||
|
|
||||||
|
NoteType noteType = NoteType.fromApiUrl(resourceType);
|
||||||
|
this.context.authenticatedUser().validateHasReadPermission(getResourceNameForPermissions(noteType));
|
||||||
|
|
||||||
|
final Integer noteTypeId = noteType.getValue();
|
||||||
|
|
||||||
|
final Collection<NoteData> notes = this.readPlatformService.retrieveNotesByResource(resourceId, noteTypeId);
|
||||||
|
|
||||||
|
final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters());
|
||||||
|
return this.toApiJsonSerializer.serialize(settings, notes, this.NOTE_DATA_PARAMETERS);
|
||||||
|
}
|
||||||
|
|
||||||
|
@GET
|
||||||
|
@Path("{noteId}")
|
||||||
|
@Consumes({ MediaType.APPLICATION_JSON })
|
||||||
|
@Produces({ MediaType.APPLICATION_JSON })
|
||||||
|
public String retrieveNote(@PathParam("resourceType") final String resourceType, @PathParam("resourceId") final Long resourceId,
|
||||||
|
@PathParam("noteId") final Long noteId, @Context final UriInfo uriInfo) {
|
||||||
|
|
||||||
|
NoteType noteType = NoteType.fromApiUrl(resourceType);
|
||||||
|
this.context.authenticatedUser().validateHasReadPermission(getResourceNameForPermissions(noteType));
|
||||||
|
|
||||||
|
final Integer noteTypeId = noteType.getValue();
|
||||||
|
|
||||||
|
final NoteData note = this.readPlatformService.retrieveNote(noteId, resourceId, noteTypeId);
|
||||||
|
|
||||||
|
final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters());
|
||||||
|
return this.toApiJsonSerializer.serialize(settings, note, this.NOTE_DATA_PARAMETERS);
|
||||||
|
}
|
||||||
|
|
||||||
|
@POST
|
||||||
|
@Consumes({ MediaType.APPLICATION_JSON })
|
||||||
|
@Produces({ MediaType.APPLICATION_JSON })
|
||||||
|
public String addNewNote(@PathParam("resourceType") final String resourceType, @PathParam("resourceId") final Long resourceId,
|
||||||
|
final String apiRequestBodyAsJson) {
|
||||||
|
|
||||||
|
NoteType noteType = NoteType.fromApiUrl(resourceType);
|
||||||
|
final String resourceNameForPermissions = getResourceNameForPermissions(noteType);
|
||||||
|
final CommandWrapper commandRequest = new CommandWrapperBuilder().createNote(resourceNameForPermissions, resourceType, resourceId)
|
||||||
|
.withJson(apiRequestBodyAsJson).build();
|
||||||
|
|
||||||
|
final CommandProcessingResult result = this.commandsSourceWritePlatformService.logCommandSource(commandRequest);
|
||||||
|
|
||||||
|
return this.toApiJsonSerializer.serialize(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
@PUT
|
||||||
|
@Path("{noteId}")
|
||||||
|
@Consumes({ MediaType.APPLICATION_JSON })
|
||||||
|
@Produces({ MediaType.APPLICATION_JSON })
|
||||||
|
public String updateNote(@PathParam("resourceType") final String resourceType, @PathParam("resourceId") final Long resourceId,
|
||||||
|
@PathParam("noteId") final Long noteId, final String apiRequestBodyAsJson) {
|
||||||
|
|
||||||
|
NoteType noteType = NoteType.fromApiUrl(resourceType);
|
||||||
|
final String resourceNameForPermissions = getResourceNameForPermissions(noteType);
|
||||||
|
|
||||||
|
final CommandWrapper commandRequest = new CommandWrapperBuilder().updateNote(resourceNameForPermissions, resourceType, resourceId, noteId).withJson(apiRequestBodyAsJson).build();
|
||||||
|
|
||||||
|
final CommandProcessingResult result = this.commandsSourceWritePlatformService.logCommandSource(commandRequest);
|
||||||
|
|
||||||
|
return this.toApiJsonSerializer.serialize(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
@DELETE
|
||||||
|
@Path("{noteId}")
|
||||||
|
@Consumes({ MediaType.APPLICATION_JSON })
|
||||||
|
@Produces({ MediaType.APPLICATION_JSON })
|
||||||
|
public String deleteNote(@PathParam("resourceType") final String resourceType, @PathParam("resourceId") final Long resourceId,
|
||||||
|
@PathParam("noteId") final Long noteId) {
|
||||||
|
|
||||||
|
NoteType noteType = NoteType.fromApiUrl(resourceType);
|
||||||
|
final String resourceNameForPermissions = getResourceNameForPermissions(noteType);
|
||||||
|
|
||||||
|
final CommandWrapper commandRequest = new CommandWrapperBuilder().deleteNote(resourceNameForPermissions, resourceType, resourceId, noteId).build();
|
||||||
|
|
||||||
|
final CommandProcessingResult result = this.commandsSourceWritePlatformService.logCommandSource(commandRequest);
|
||||||
|
|
||||||
|
return this.toApiJsonSerializer.serialize(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getResourceNameForPermissions(NoteType type){
|
||||||
|
String resourceNameForPermissions = "INVALIDNOTE";
|
||||||
|
switch(type){
|
||||||
|
case CLIENT:
|
||||||
|
resourceNameForPermissions = "CLIENTNOTE";
|
||||||
|
break;
|
||||||
|
case LOAN:
|
||||||
|
resourceNameForPermissions = "LOANNOTE";
|
||||||
|
break;
|
||||||
|
case LOAN_TRANSACTION:
|
||||||
|
resourceNameForPermissions = "LOANTRANSACTIONNOTE";
|
||||||
|
break;
|
||||||
|
case DEPOSIT:
|
||||||
|
resourceNameForPermissions = "DEPOSITNOTE";
|
||||||
|
break;
|
||||||
|
case SAVING:
|
||||||
|
resourceNameForPermissions = "SAVINGNOTE";
|
||||||
|
break;
|
||||||
|
case GROUP:
|
||||||
|
resourceNameForPermissions = "GROUPNOTE";
|
||||||
|
break;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return resourceNameForPermissions;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
+20
@@ -0,0 +1,20 @@
|
|||||||
|
/**
|
||||||
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
|
* You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
|
*/
|
||||||
|
package org.mifosplatform.portfolio.note.command;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Immutable command used for create or update of notes.
|
||||||
|
*/
|
||||||
|
public class NoteCommand {
|
||||||
|
|
||||||
|
@SuppressWarnings("unused")
|
||||||
|
private final String note;
|
||||||
|
|
||||||
|
public NoteCommand(final String note) {
|
||||||
|
this.note = note;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
+16
-5
@@ -3,13 +3,14 @@
|
|||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
* You can obtain one at http://mozilla.org/MPL/2.0/.
|
* You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
*/
|
*/
|
||||||
package org.mifosplatform.portfolio.client.data;
|
package org.mifosplatform.portfolio.note.data;
|
||||||
|
|
||||||
import org.joda.time.DateTime;
|
import org.joda.time.DateTime;
|
||||||
import org.mifosplatform.infrastructure.core.data.EnumOptionData;
|
import org.mifosplatform.infrastructure.core.data.EnumOptionData;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Immutable data object represent note or case information about a client, loan or loan transaction.
|
* Immutable data object represent note or case information about a client, loan
|
||||||
|
* or loan transaction.
|
||||||
*/
|
*/
|
||||||
public class NoteData {
|
public class NoteData {
|
||||||
|
|
||||||
@@ -18,10 +19,16 @@ public class NoteData {
|
|||||||
@SuppressWarnings("unused")
|
@SuppressWarnings("unused")
|
||||||
private final Long clientId;
|
private final Long clientId;
|
||||||
@SuppressWarnings("unused")
|
@SuppressWarnings("unused")
|
||||||
|
private final Long groupId;
|
||||||
|
@SuppressWarnings("unused")
|
||||||
private final Long loanId;
|
private final Long loanId;
|
||||||
@SuppressWarnings("unused")
|
@SuppressWarnings("unused")
|
||||||
private final Long loanTransactionId;
|
private final Long loanTransactionId;
|
||||||
@SuppressWarnings("unused")
|
@SuppressWarnings("unused")
|
||||||
|
private final Long depositAccountId;
|
||||||
|
@SuppressWarnings("unused")
|
||||||
|
private final Long savingAccountId;
|
||||||
|
@SuppressWarnings("unused")
|
||||||
private final EnumOptionData noteType;
|
private final EnumOptionData noteType;
|
||||||
@SuppressWarnings("unused")
|
@SuppressWarnings("unused")
|
||||||
private final String note;
|
private final String note;
|
||||||
@@ -38,13 +45,17 @@ public class NoteData {
|
|||||||
@SuppressWarnings("unused")
|
@SuppressWarnings("unused")
|
||||||
private final DateTime updatedOn;
|
private final DateTime updatedOn;
|
||||||
|
|
||||||
public NoteData(final Long id, final Long clientId, final Long loanId, final Long transactionId, final EnumOptionData noteType,
|
public NoteData(final Long id, final Long clientId, final Long groupId, final Long loanId, final Long transactionId,
|
||||||
final String note, final DateTime createdDate, final Long createdById, final String createdByUsername,
|
final Long depositAccountId, final Long savingAccountId, final EnumOptionData noteType, final String note,
|
||||||
final DateTime lastModifiedDate, final Long lastModifiedById, final String updatedByUsername) {
|
final DateTime createdDate, final Long createdById, final String createdByUsername, final DateTime lastModifiedDate,
|
||||||
|
final Long lastModifiedById, final String updatedByUsername) {
|
||||||
this.id = id;
|
this.id = id;
|
||||||
this.clientId = clientId;
|
this.clientId = clientId;
|
||||||
|
this.groupId = groupId;
|
||||||
this.loanId = loanId;
|
this.loanId = loanId;
|
||||||
this.loanTransactionId = transactionId;
|
this.loanTransactionId = transactionId;
|
||||||
|
this.depositAccountId = depositAccountId;
|
||||||
|
this.savingAccountId = savingAccountId;
|
||||||
this.noteType = noteType;
|
this.noteType = noteType;
|
||||||
this.note = note;
|
this.note = note;
|
||||||
this.createdOn = createdDate;
|
this.createdOn = createdDate;
|
||||||
+42
-53
@@ -3,7 +3,7 @@
|
|||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
* You can obtain one at http://mozilla.org/MPL/2.0/.
|
* You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
*/
|
*/
|
||||||
package org.mifosplatform.portfolio.client.domain;
|
package org.mifosplatform.portfolio.note.domain;
|
||||||
|
|
||||||
import java.util.LinkedHashMap;
|
import java.util.LinkedHashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
@@ -17,6 +17,8 @@ import javax.persistence.Table;
|
|||||||
import org.apache.commons.lang.StringUtils;
|
import org.apache.commons.lang.StringUtils;
|
||||||
import org.mifosplatform.infrastructure.core.api.JsonCommand;
|
import org.mifosplatform.infrastructure.core.api.JsonCommand;
|
||||||
import org.mifosplatform.infrastructure.core.domain.AbstractAuditableCustom;
|
import org.mifosplatform.infrastructure.core.domain.AbstractAuditableCustom;
|
||||||
|
import org.mifosplatform.portfolio.client.domain.Client;
|
||||||
|
import org.mifosplatform.portfolio.group.domain.Group;
|
||||||
import org.mifosplatform.portfolio.loanaccount.domain.Loan;
|
import org.mifosplatform.portfolio.loanaccount.domain.Loan;
|
||||||
import org.mifosplatform.portfolio.loanaccount.domain.LoanTransaction;
|
import org.mifosplatform.portfolio.loanaccount.domain.LoanTransaction;
|
||||||
import org.mifosplatform.portfolio.savingsaccount.domain.SavingAccount;
|
import org.mifosplatform.portfolio.savingsaccount.domain.SavingAccount;
|
||||||
@@ -28,9 +30,14 @@ import org.mifosplatform.useradministration.domain.AppUser;
|
|||||||
public class Note extends AbstractAuditableCustom<AppUser, Long> {
|
public class Note extends AbstractAuditableCustom<AppUser, Long> {
|
||||||
|
|
||||||
@ManyToOne
|
@ManyToOne
|
||||||
@JoinColumn(name = "client_id", nullable = false)
|
@JoinColumn(name = "client_id", nullable = true)
|
||||||
private final Client client;
|
private final Client client;
|
||||||
|
|
||||||
|
@SuppressWarnings("unused")
|
||||||
|
@ManyToOne
|
||||||
|
@JoinColumn(name = "group_id", nullable = true)
|
||||||
|
private Group group;
|
||||||
|
|
||||||
@SuppressWarnings("unused")
|
@SuppressWarnings("unused")
|
||||||
@ManyToOne
|
@ManyToOne
|
||||||
@JoinColumn(name = "loan_id", nullable = true)
|
@JoinColumn(name = "loan_id", nullable = true)
|
||||||
@@ -46,55 +53,28 @@ public class Note extends AbstractAuditableCustom<AppUser, Long> {
|
|||||||
|
|
||||||
@SuppressWarnings("unused")
|
@SuppressWarnings("unused")
|
||||||
@Column(name = "note_type_enum")
|
@Column(name = "note_type_enum")
|
||||||
private Integer noteTypeId;
|
private final Integer noteTypeId;
|
||||||
|
|
||||||
@SuppressWarnings("unused")
|
@SuppressWarnings("unused")
|
||||||
@ManyToOne
|
@ManyToOne
|
||||||
@JoinColumn(name = "deposit_account_id", nullable = true)
|
@JoinColumn(name = "deposit_account_id", nullable = true)
|
||||||
private DepositAccount depositAccount;
|
private DepositAccount depositAccount;
|
||||||
|
|
||||||
@SuppressWarnings("unused")
|
@SuppressWarnings("unused")
|
||||||
@ManyToOne
|
@ManyToOne
|
||||||
@JoinColumn(name = "saving_account_id", nullable = true)
|
@JoinColumn(name = "saving_account_id", nullable = true)
|
||||||
private SavingAccount savingAccount;
|
private SavingAccount savingAccount;
|
||||||
|
|
||||||
public enum NoteType {
|
|
||||||
CLIENT(100, "noteType.client"), LOAN(200, "noteType.loan"), LOAN_TRANSACTION(300, "noteType.loan.transaction"), DEPOSIT(400,
|
|
||||||
"noteType.deposit"), SAVING(500,"noteType.saving");
|
|
||||||
|
|
||||||
private Integer value;
|
|
||||||
private String code;
|
|
||||||
|
|
||||||
NoteType(final Integer value, final String code) {
|
|
||||||
this.value = value;
|
|
||||||
this.code = code;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Integer getValue() {
|
|
||||||
return value;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getCode() {
|
|
||||||
return code;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static NoteType parse(Integer id) {
|
|
||||||
NoteType right = null; // Default
|
|
||||||
for (NoteType item : NoteType.values()) {
|
|
||||||
if (item.getValue().intValue() == id.intValue()) {
|
|
||||||
right = item;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return right;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Note clientNoteFromJson(final Client client, final JsonCommand command) {
|
public static Note clientNoteFromJson(final Client client, final JsonCommand command) {
|
||||||
final String note = command.stringValueOfParameterNamed("note");
|
final String note = command.stringValueOfParameterNamed("note");
|
||||||
return new Note(client, note);
|
return new Note(client, note);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static Note groupNoteFromJson(final Group group, final JsonCommand command) {
|
||||||
|
final String note = command.stringValueOfParameterNamed("note");
|
||||||
|
return new Note(group, note);
|
||||||
|
}
|
||||||
|
|
||||||
public static Note loanNote(final Loan loan, final String note) {
|
public static Note loanNote(final Loan loan, final String note) {
|
||||||
return new Note(loan, note);
|
return new Note(loan, note);
|
||||||
}
|
}
|
||||||
@@ -103,24 +83,35 @@ public class Note extends AbstractAuditableCustom<AppUser, Long> {
|
|||||||
return new Note(loan, loanTransaction, note);
|
return new Note(loan, loanTransaction, note);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Note depositNote(final DepositAccount account, final String noteText) {
|
public static Note depositNote(final DepositAccount account, final String note) {
|
||||||
return new Note(account, noteText);
|
return new Note(account, note);
|
||||||
}
|
}
|
||||||
|
|
||||||
private Note(Client client, String note) {
|
public static Note savingNote(final SavingAccount account, final String note) {
|
||||||
|
return new Note(account, note);
|
||||||
|
}
|
||||||
|
|
||||||
|
private Note(final Client client, final String note) {
|
||||||
this.client = client;
|
this.client = client;
|
||||||
this.note = note;
|
this.note = note;
|
||||||
this.noteTypeId = NoteType.CLIENT.getValue();
|
this.noteTypeId = NoteType.CLIENT.getValue();
|
||||||
}
|
}
|
||||||
|
|
||||||
private Note(Loan loan, String note) {
|
private Note(final Group group, final String note) {
|
||||||
|
this.group = group;
|
||||||
|
this.note = note;
|
||||||
|
this.client = null;
|
||||||
|
this.noteTypeId = NoteType.GROUP.getValue();
|
||||||
|
}
|
||||||
|
|
||||||
|
private Note(final Loan loan, final String note) {
|
||||||
this.loan = loan;
|
this.loan = loan;
|
||||||
this.client = loan.client();
|
this.client = loan.client();
|
||||||
this.note = note;
|
this.note = note;
|
||||||
this.noteTypeId = NoteType.LOAN.getValue();
|
this.noteTypeId = NoteType.LOAN.getValue();
|
||||||
}
|
}
|
||||||
|
|
||||||
private Note(Loan loan, LoanTransaction loanTransaction, String note) {
|
private Note(final Loan loan, final LoanTransaction loanTransaction, final String note) {
|
||||||
this.loan = loan;
|
this.loan = loan;
|
||||||
this.loanTransaction = loanTransaction;
|
this.loanTransaction = loanTransaction;
|
||||||
this.client = loan.client();
|
this.client = loan.client();
|
||||||
@@ -130,6 +121,7 @@ public class Note extends AbstractAuditableCustom<AppUser, Long> {
|
|||||||
|
|
||||||
protected Note() {
|
protected Note() {
|
||||||
this.client = null;
|
this.client = null;
|
||||||
|
this.group = null;
|
||||||
this.loan = null;
|
this.loan = null;
|
||||||
this.loanTransaction = null;
|
this.loanTransaction = null;
|
||||||
this.note = null;
|
this.note = null;
|
||||||
@@ -143,14 +135,14 @@ public class Note extends AbstractAuditableCustom<AppUser, Long> {
|
|||||||
this.noteTypeId = NoteType.DEPOSIT.getValue();
|
this.noteTypeId = NoteType.DEPOSIT.getValue();
|
||||||
}
|
}
|
||||||
|
|
||||||
public Note(SavingAccount account, String note) {
|
public Note(final SavingAccount account, final String note) {
|
||||||
this.savingAccount = account;
|
this.savingAccount = account;
|
||||||
this.client = account.getClient();
|
this.client = account.getClient();
|
||||||
this.note = note;
|
this.note = note;
|
||||||
this.noteTypeId = NoteType.SAVING.getValue();
|
this.noteTypeId = NoteType.SAVING.getValue();
|
||||||
}
|
}
|
||||||
|
|
||||||
public Map<String, Object> update(final JsonCommand command) {
|
public Map<String, Object> update(final JsonCommand command) {
|
||||||
final Map<String, Object> actualChanges = new LinkedHashMap<String, Object>(7);
|
final Map<String, Object> actualChanges = new LinkedHashMap<String, Object>(7);
|
||||||
|
|
||||||
final String noteParamName = "note";
|
final String noteParamName = "note";
|
||||||
@@ -162,11 +154,8 @@ public class Note extends AbstractAuditableCustom<AppUser, Long> {
|
|||||||
return actualChanges;
|
return actualChanges;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isNotAgainstClientWithIdOf(Long clientId) {
|
public boolean isNotAgainstClientWithIdOf(final Long clientId) {
|
||||||
return !this.client.identifiedBy(clientId);
|
return !this.client.identifiedBy(clientId);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Note savingNote(final SavingAccount account, final String noteText) {
|
|
||||||
return new Note(account, noteText);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
+30
@@ -0,0 +1,30 @@
|
|||||||
|
/**
|
||||||
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
|
* You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
|
*/
|
||||||
|
package org.mifosplatform.portfolio.note.domain;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.springframework.data.jpa.repository.JpaRepository;
|
||||||
|
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
|
||||||
|
|
||||||
|
public interface NoteRepository extends JpaRepository<Note, Long>, JpaSpecificationExecutor<Note> {
|
||||||
|
|
||||||
|
List<Note> findByLoanId(Long id);
|
||||||
|
|
||||||
|
List<Note> findByClientId(Long id);
|
||||||
|
|
||||||
|
Note findByLoanIdAndId(Long loanId, Long id);
|
||||||
|
|
||||||
|
Note findByClientIdAndId(Long clientId, Long id);
|
||||||
|
|
||||||
|
Note findByGroupIdAndId(Long groupId, Long id);
|
||||||
|
|
||||||
|
Note findByLoanTransactionIdAndId(Long loanTransactionId, Long id);
|
||||||
|
|
||||||
|
Note findByDepositAccountIdAndId(Long depositAccountId, Long id);
|
||||||
|
|
||||||
|
Note findBySavingAccountIdAndId(Long savingAccountId, Long id);
|
||||||
|
}
|
||||||
@@ -0,0 +1,81 @@
|
|||||||
|
package org.mifosplatform.portfolio.note.domain;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
public enum NoteType {
|
||||||
|
|
||||||
|
CLIENT(100, "noteType.client", "clients"), LOAN(200, "noteType.loan", "loans"), LOAN_TRANSACTION(300, "noteType.loan.transaction",
|
||||||
|
"loanTransactions"), DEPOSIT(400, "noteType.deposit", "deposits"), SAVING(500, "noteType.saving", "savings"), GROUP(600,
|
||||||
|
"noteType.group", "groups");
|
||||||
|
|
||||||
|
private Integer value;
|
||||||
|
private String code;
|
||||||
|
private String apiUrl;
|
||||||
|
|
||||||
|
NoteType(final Integer value, final String code, final String apiUrl) {
|
||||||
|
this.value = value;
|
||||||
|
this.code = code;
|
||||||
|
this.apiUrl = apiUrl;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getValue() {
|
||||||
|
return this.value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getCode() {
|
||||||
|
return this.code;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static final Map<Integer, NoteType> intToEnumMap = new HashMap<Integer, NoteType>();
|
||||||
|
private static int minValue;
|
||||||
|
private static int maxValue;
|
||||||
|
static {
|
||||||
|
int i = 0;
|
||||||
|
for (final NoteType type : NoteType.values()) {
|
||||||
|
if (i == 0) {
|
||||||
|
minValue = type.value;
|
||||||
|
}
|
||||||
|
intToEnumMap.put(type.value, type);
|
||||||
|
if (minValue >= type.value) {
|
||||||
|
minValue = type.value;
|
||||||
|
}
|
||||||
|
if (maxValue < type.value) {
|
||||||
|
maxValue = type.value;
|
||||||
|
}
|
||||||
|
i = i + 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static NoteType fromInt(final int i) {
|
||||||
|
final NoteType type = intToEnumMap.get(Integer.valueOf(i));
|
||||||
|
return type;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int getMinValue() {
|
||||||
|
return minValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int getMaxValue() {
|
||||||
|
return maxValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return name().toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static final Map<String, NoteType> apiUrlToEnumMap = new HashMap<String, NoteType>();
|
||||||
|
|
||||||
|
static {
|
||||||
|
for (final NoteType type : NoteType.values()) {
|
||||||
|
apiUrlToEnumMap.put(type.apiUrl, type);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static NoteType fromApiUrl(final String url) {
|
||||||
|
final NoteType type = apiUrlToEnumMap.get(url);
|
||||||
|
return type;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
+5
-4
@@ -3,7 +3,7 @@
|
|||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
* You can obtain one at http://mozilla.org/MPL/2.0/.
|
* You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
*/
|
*/
|
||||||
package org.mifosplatform.portfolio.client.exception;
|
package org.mifosplatform.portfolio.note.exception;
|
||||||
|
|
||||||
import org.mifosplatform.infrastructure.core.exception.AbstractPlatformResourceNotFoundException;
|
import org.mifosplatform.infrastructure.core.exception.AbstractPlatformResourceNotFoundException;
|
||||||
|
|
||||||
@@ -12,12 +12,13 @@ import org.mifosplatform.infrastructure.core.exception.AbstractPlatformResourceN
|
|||||||
*/
|
*/
|
||||||
public class NoteNotFoundException extends AbstractPlatformResourceNotFoundException {
|
public class NoteNotFoundException extends AbstractPlatformResourceNotFoundException {
|
||||||
|
|
||||||
public NoteNotFoundException(Long id) {
|
public NoteNotFoundException(final Long id) {
|
||||||
super("error.msg.note.id.invalid", "Note with identifier " + id + " does not exist", id);
|
super("error.msg.note.id.invalid", "Note with identifier " + id + " does not exist", id);
|
||||||
}
|
}
|
||||||
|
|
||||||
public NoteNotFoundException(Long id, Long clientId, final String resource) {
|
public NoteNotFoundException(final Long id, final Long resourceId, final String resource) {
|
||||||
super("error.msg." + resource + ".note.id.invalid", "Note with identifier " + id + " does not exist for " + resource
|
super("error.msg." + resource + ".note.id.invalid", "Note with identifier " + id + " does not exist for " + resource
|
||||||
+ " with identifier " + clientId, id, clientId);
|
+ " with identifier " + resourceId, id, resourceId);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
+9
-9
@@ -3,30 +3,30 @@
|
|||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
* You can obtain one at http://mozilla.org/MPL/2.0/.
|
* You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
*/
|
*/
|
||||||
package org.mifosplatform.portfolio.client.handler;
|
package org.mifosplatform.portfolio.note.handler;
|
||||||
|
|
||||||
import org.mifosplatform.commands.handler.NewCommandSourceHandler;
|
import org.mifosplatform.commands.handler.NewCommandSourceHandler;
|
||||||
import org.mifosplatform.infrastructure.core.api.JsonCommand;
|
import org.mifosplatform.infrastructure.core.api.JsonCommand;
|
||||||
import org.mifosplatform.infrastructure.core.data.CommandProcessingResult;
|
import org.mifosplatform.infrastructure.core.data.CommandProcessingResult;
|
||||||
import org.mifosplatform.portfolio.client.service.ClientWritePlatformService;
|
import org.mifosplatform.portfolio.note.service.NoteWritePlatformService;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
@Service
|
@Service
|
||||||
public class UpdateClientNoteCommandHandler implements NewCommandSourceHandler {
|
public class CreateNoteCommandHandler implements NewCommandSourceHandler {
|
||||||
|
|
||||||
private final ClientWritePlatformService clientWritePlatformService;
|
private final NoteWritePlatformService writePlatformService;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
public UpdateClientNoteCommandHandler(final ClientWritePlatformService clientWritePlatformService) {
|
public CreateNoteCommandHandler(final NoteWritePlatformService writePlatformService) {
|
||||||
this.clientWritePlatformService = clientWritePlatformService;
|
this.writePlatformService = writePlatformService;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Transactional
|
@Transactional
|
||||||
@Override
|
@Override
|
||||||
public CommandProcessingResult processCommand(final JsonCommand command) {
|
public CommandProcessingResult processCommand(final JsonCommand command) {
|
||||||
|
return this.writePlatformService.createNote(command);
|
||||||
return this.clientWritePlatformService.updateClientNote(command.getClientId(), command.entityId(), command);
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
}
|
||||||
+7
-8
@@ -3,30 +3,29 @@
|
|||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
* You can obtain one at http://mozilla.org/MPL/2.0/.
|
* You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
*/
|
*/
|
||||||
package org.mifosplatform.portfolio.client.handler;
|
package org.mifosplatform.portfolio.note.handler;
|
||||||
|
|
||||||
import org.mifosplatform.commands.handler.NewCommandSourceHandler;
|
import org.mifosplatform.commands.handler.NewCommandSourceHandler;
|
||||||
import org.mifosplatform.infrastructure.core.api.JsonCommand;
|
import org.mifosplatform.infrastructure.core.api.JsonCommand;
|
||||||
import org.mifosplatform.infrastructure.core.data.CommandProcessingResult;
|
import org.mifosplatform.infrastructure.core.data.CommandProcessingResult;
|
||||||
import org.mifosplatform.portfolio.client.service.ClientWritePlatformService;
|
import org.mifosplatform.portfolio.note.service.NoteWritePlatformService;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
@Service
|
@Service
|
||||||
public class CreateClientNoteCommandHandler implements NewCommandSourceHandler {
|
public class DeleteNoteCommandHandler implements NewCommandSourceHandler {
|
||||||
|
|
||||||
private final ClientWritePlatformService clientWritePlatformService;
|
private final NoteWritePlatformService writePlatformService;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
public CreateClientNoteCommandHandler(final ClientWritePlatformService clientWritePlatformService) {
|
public DeleteNoteCommandHandler(final NoteWritePlatformService writePlatformService) {
|
||||||
this.clientWritePlatformService = clientWritePlatformService;
|
this.writePlatformService = writePlatformService;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Transactional
|
@Transactional
|
||||||
@Override
|
@Override
|
||||||
public CommandProcessingResult processCommand(final JsonCommand command) {
|
public CommandProcessingResult processCommand(final JsonCommand command) {
|
||||||
|
return this.writePlatformService.deleteNote(command);
|
||||||
return this.clientWritePlatformService.addClientNote(command.getClientId(), command);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+28
@@ -0,0 +1,28 @@
|
|||||||
|
package org.mifosplatform.portfolio.note.handler;
|
||||||
|
|
||||||
|
import org.mifosplatform.commands.handler.NewCommandSourceHandler;
|
||||||
|
import org.mifosplatform.infrastructure.core.api.JsonCommand;
|
||||||
|
import org.mifosplatform.infrastructure.core.data.CommandProcessingResult;
|
||||||
|
import org.mifosplatform.portfolio.note.service.NoteWritePlatformService;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
public class UpdateNoteCommandHandler implements NewCommandSourceHandler {
|
||||||
|
|
||||||
|
private final NoteWritePlatformService writePlatformService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
public UpdateNoteCommandHandler(final NoteWritePlatformService noteWritePlatformService) {
|
||||||
|
this.writePlatformService = noteWritePlatformService;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Transactional
|
||||||
|
@Override
|
||||||
|
public CommandProcessingResult processCommand(final JsonCommand command) {
|
||||||
|
|
||||||
|
return this.writePlatformService.updateNote(command);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
+82
@@ -0,0 +1,82 @@
|
|||||||
|
/**
|
||||||
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
|
* You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
|
*/
|
||||||
|
package org.mifosplatform.portfolio.note.serialization;
|
||||||
|
|
||||||
|
import java.lang.reflect.Type;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import org.apache.commons.lang.StringUtils;
|
||||||
|
import org.mifosplatform.infrastructure.core.data.ApiParameterError;
|
||||||
|
import org.mifosplatform.infrastructure.core.data.DataValidatorBuilder;
|
||||||
|
import org.mifosplatform.infrastructure.core.exception.InvalidJsonException;
|
||||||
|
import org.mifosplatform.infrastructure.core.exception.PlatformApiDataValidationException;
|
||||||
|
import org.mifosplatform.infrastructure.core.serialization.AbstractFromApiJsonDeserializer;
|
||||||
|
import org.mifosplatform.infrastructure.core.serialization.FromApiJsonDeserializer;
|
||||||
|
import org.mifosplatform.infrastructure.core.serialization.FromJsonHelper;
|
||||||
|
import org.mifosplatform.portfolio.note.command.NoteCommand;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import com.google.gson.JsonElement;
|
||||||
|
import com.google.gson.reflect.TypeToken;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Implementation of {@link FromApiJsonDeserializer} for {@link NoteCommand}
|
||||||
|
* 's.
|
||||||
|
*/
|
||||||
|
@Component
|
||||||
|
public final class NoteCommandFromApiJsonDeserializer extends AbstractFromApiJsonDeserializer<NoteCommand> {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The parameters supported for this command.
|
||||||
|
*/
|
||||||
|
private final Set<String> supportedParameters = new HashSet<String>(Arrays.asList("note"));
|
||||||
|
|
||||||
|
private final FromJsonHelper fromApiJsonHelper;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
public NoteCommandFromApiJsonDeserializer(final FromJsonHelper fromApiJsonHelper) {
|
||||||
|
this.fromApiJsonHelper = fromApiJsonHelper;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public NoteCommand commandFromApiJson(final String json) {
|
||||||
|
|
||||||
|
if (StringUtils.isBlank(json)) { throw new InvalidJsonException(); }
|
||||||
|
|
||||||
|
final Type typeOfMap = new TypeToken<Map<String, Object>>() {}.getType();
|
||||||
|
this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, this.supportedParameters);
|
||||||
|
|
||||||
|
final JsonElement element = this.fromApiJsonHelper.parse(json);
|
||||||
|
final String note = this.fromApiJsonHelper.extractStringNamed("note", element);
|
||||||
|
|
||||||
|
return new NoteCommand(note);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void validateNote(final String json) {
|
||||||
|
if (StringUtils.isBlank(json)) { throw new InvalidJsonException(); }
|
||||||
|
|
||||||
|
final Type typeOfMap = new TypeToken<Map<String, Object>>() {}.getType();
|
||||||
|
this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, this.supportedParameters);
|
||||||
|
final JsonElement element = this.fromApiJsonHelper.parse(json);
|
||||||
|
|
||||||
|
final List<ApiParameterError> dataValidationErrors = new ArrayList<ApiParameterError>();
|
||||||
|
|
||||||
|
final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource("note");
|
||||||
|
|
||||||
|
final String note = this.fromApiJsonHelper.extractStringNamed("note", element);
|
||||||
|
baseDataValidator.reset().parameter("note").value(note).notBlank().notExceedingLengthOf(1000);
|
||||||
|
|
||||||
|
if (!dataValidationErrors.isEmpty()) { throw new PlatformApiDataValidationException("validation.msg.validation.errors.exist",
|
||||||
|
"Validation errors exist.", dataValidationErrors); }
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
+45
@@ -0,0 +1,45 @@
|
|||||||
|
/**
|
||||||
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
|
* You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
|
*/
|
||||||
|
package org.mifosplatform.portfolio.note.service;
|
||||||
|
|
||||||
|
import org.mifosplatform.infrastructure.core.data.EnumOptionData;
|
||||||
|
import org.mifosplatform.portfolio.note.domain.NoteType;
|
||||||
|
|
||||||
|
public class NoteEnumerations {
|
||||||
|
|
||||||
|
public static EnumOptionData noteType(final Integer id) {
|
||||||
|
return noteType(NoteType.fromInt(id));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static EnumOptionData noteType(final NoteType type) {
|
||||||
|
EnumOptionData optionData = null;
|
||||||
|
switch (type) {
|
||||||
|
case CLIENT:
|
||||||
|
optionData = new EnumOptionData(type.getValue().longValue(), type.getCode(), "Client note");
|
||||||
|
break;
|
||||||
|
case LOAN:
|
||||||
|
optionData = new EnumOptionData(type.getValue().longValue(), type.getCode(), "Loan note");
|
||||||
|
break;
|
||||||
|
case LOAN_TRANSACTION:
|
||||||
|
optionData = new EnumOptionData(type.getValue().longValue(), type.getCode(), "Loan transaction note");
|
||||||
|
break;
|
||||||
|
case DEPOSIT:
|
||||||
|
optionData = new EnumOptionData(type.getValue().longValue(), type.getCode(), "Deposit transaction note");
|
||||||
|
break;
|
||||||
|
case SAVING:
|
||||||
|
optionData = new EnumOptionData(type.getValue().longValue(), type.getCode(), "Saving transaction note");
|
||||||
|
break;
|
||||||
|
case GROUP:
|
||||||
|
optionData = new EnumOptionData(type.getValue().longValue(), type.getCode(), "Group note");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
|
||||||
|
}
|
||||||
|
return optionData;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
+17
@@ -0,0 +1,17 @@
|
|||||||
|
/**
|
||||||
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
|
* You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
|
*/
|
||||||
|
package org.mifosplatform.portfolio.note.service;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
|
|
||||||
|
import org.mifosplatform.portfolio.note.data.NoteData;
|
||||||
|
|
||||||
|
public interface NoteReadPlatformService {
|
||||||
|
|
||||||
|
NoteData retrieveNote(final Long noteId, Long resourceId, Integer noteTypeId);
|
||||||
|
|
||||||
|
Collection<NoteData> retrieveNotesByResource(final Long resourceId, final Integer noteTypeId);
|
||||||
|
}
|
||||||
+120
@@ -0,0 +1,120 @@
|
|||||||
|
package org.mifosplatform.portfolio.note.service;
|
||||||
|
|
||||||
|
import java.sql.ResultSet;
|
||||||
|
import java.sql.SQLException;
|
||||||
|
import java.util.Collection;
|
||||||
|
|
||||||
|
import org.apache.commons.lang.StringUtils;
|
||||||
|
import org.joda.time.DateTime;
|
||||||
|
import org.mifosplatform.infrastructure.core.data.EnumOptionData;
|
||||||
|
import org.mifosplatform.infrastructure.core.domain.JdbcSupport;
|
||||||
|
import org.mifosplatform.infrastructure.core.service.TenantAwareRoutingDataSource;
|
||||||
|
import org.mifosplatform.portfolio.note.data.NoteData;
|
||||||
|
import org.mifosplatform.portfolio.note.domain.NoteType;
|
||||||
|
import org.mifosplatform.portfolio.note.exception.NoteNotFoundException;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.dao.EmptyResultDataAccessException;
|
||||||
|
import org.springframework.jdbc.core.JdbcTemplate;
|
||||||
|
import org.springframework.jdbc.core.RowMapper;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
public class NoteReadPlatformServiceImpl implements NoteReadPlatformService {
|
||||||
|
|
||||||
|
private final JdbcTemplate jdbcTemplate;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
public NoteReadPlatformServiceImpl(final TenantAwareRoutingDataSource dataSource) {
|
||||||
|
this.jdbcTemplate = new JdbcTemplate(dataSource);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static final class NoteMapper implements RowMapper<NoteData> {
|
||||||
|
|
||||||
|
public String schema() {
|
||||||
|
return " select n.id as id, n.client_id as clientId, n.group_id as groupId, n.loan_id as loanId, n.loan_transaction_id as transactionId, n.deposit_account_id as depositAccountId, "
|
||||||
|
+ " n.saving_account_id as savingAccountId, n.note_type_enum as noteTypeEnum, n.note as note, n.created_date as createdDate, n.createdby_id as createdById, "
|
||||||
|
+ " cb.username as createdBy, n.lastmodified_date as lastModifiedDate, n.lastmodifiedby_id as lastModifiedById, mb.username as modifiedBy "
|
||||||
|
+ " from m_note n left join m_appuser cb on cb.id=n.createdby_id left join m_appuser mb on mb.id=n.lastmodifiedby_id ";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public NoteData mapRow(final ResultSet rs, @SuppressWarnings("unused") final int rowNum) throws SQLException {
|
||||||
|
|
||||||
|
final Long id = JdbcSupport.getLong(rs, "id");
|
||||||
|
final Long clientId = JdbcSupport.getLong(rs, "clientId");
|
||||||
|
final Long groupId = JdbcSupport.getLong(rs, "groupId");
|
||||||
|
final Long loanId = JdbcSupport.getLong(rs, "loanId");
|
||||||
|
final Long transactionId = JdbcSupport.getLong(rs, "transactionId");
|
||||||
|
final Long depositAccountId = JdbcSupport.getLong(rs, "depositAccountId");
|
||||||
|
final Long savingAccountId = JdbcSupport.getLong(rs, "savingAccountId");
|
||||||
|
final Integer noteTypeId = JdbcSupport.getInteger(rs, "noteTypeEnum");
|
||||||
|
final EnumOptionData noteType = NoteEnumerations.noteType(noteTypeId);
|
||||||
|
final String note = rs.getString("note");
|
||||||
|
final DateTime createdDate = JdbcSupport.getDateTime(rs, "createdDate");
|
||||||
|
final Long createdById = JdbcSupport.getLong(rs, "createdById");
|
||||||
|
final DateTime lastModifiedDate = JdbcSupport.getDateTime(rs, "lastModifiedDate");
|
||||||
|
final Long lastModifiedById = JdbcSupport.getLong(rs, "lastModifiedById");
|
||||||
|
final String createdByUsername = rs.getString("createdBy");
|
||||||
|
final String updatedByUsername = rs.getString("modifiedBy");
|
||||||
|
return new NoteData(id, clientId, groupId, loanId, transactionId, depositAccountId, savingAccountId, noteType, note,
|
||||||
|
createdDate, createdById, createdByUsername, lastModifiedDate, lastModifiedById, updatedByUsername);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public NoteData retrieveNote(final Long noteId, final Long resourceId, final Integer noteTypeId) {
|
||||||
|
final NoteType noteType = NoteType.fromInt(noteTypeId);
|
||||||
|
try {
|
||||||
|
final NoteMapper rm = new NoteMapper();
|
||||||
|
String conditionSql = getResourceCondition(noteType);
|
||||||
|
if (StringUtils.isNotBlank(conditionSql)) {
|
||||||
|
conditionSql = " and " + conditionSql;
|
||||||
|
}
|
||||||
|
|
||||||
|
final String sql = rm.schema() + " where n.id = ? " + conditionSql + " order by n.created_date DESC";
|
||||||
|
|
||||||
|
return this.jdbcTemplate.queryForObject(sql, rm, new Object[] { noteId, resourceId });
|
||||||
|
} catch (final EmptyResultDataAccessException e) {
|
||||||
|
throw new NoteNotFoundException(noteId, resourceId, noteType.name().toLowerCase());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Collection<NoteData> retrieveNotesByResource(final Long resourceId, final Integer noteTypeId) {
|
||||||
|
final NoteType noteType = NoteType.fromInt(noteTypeId);
|
||||||
|
final NoteMapper rm = new NoteMapper();
|
||||||
|
String conditionSql = getResourceCondition(noteType);
|
||||||
|
|
||||||
|
final String sql = rm.schema() + " where " + conditionSql + " order by n.created_date DESC";
|
||||||
|
|
||||||
|
return this.jdbcTemplate.query(sql, rm, new Object[] { resourceId });
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String getResourceCondition(final NoteType noteType) {
|
||||||
|
String conditionSql = "";
|
||||||
|
switch (noteType) {
|
||||||
|
case CLIENT:
|
||||||
|
conditionSql = " n.client_id = ? ";
|
||||||
|
break;
|
||||||
|
case LOAN:
|
||||||
|
conditionSql = " n.loan_id = ? ";
|
||||||
|
break;
|
||||||
|
case LOAN_TRANSACTION:
|
||||||
|
conditionSql = " n.loan_transaction_id = ? ";
|
||||||
|
break;
|
||||||
|
case DEPOSIT:
|
||||||
|
conditionSql = " n.deposit_account_id = ? ";
|
||||||
|
break;
|
||||||
|
case SAVING:
|
||||||
|
conditionSql = " n.saving_account_id = ? ";
|
||||||
|
break;
|
||||||
|
case GROUP:
|
||||||
|
conditionSql = " n.group_id = ? ";
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return conditionSql;
|
||||||
|
}
|
||||||
|
}
|
||||||
+13
@@ -0,0 +1,13 @@
|
|||||||
|
package org.mifosplatform.portfolio.note.service;
|
||||||
|
|
||||||
|
import org.mifosplatform.infrastructure.core.api.JsonCommand;
|
||||||
|
import org.mifosplatform.infrastructure.core.data.CommandProcessingResult;
|
||||||
|
|
||||||
|
public interface NoteWritePlatformService {
|
||||||
|
|
||||||
|
CommandProcessingResult createNote(JsonCommand command);
|
||||||
|
|
||||||
|
CommandProcessingResult updateNote(JsonCommand command);
|
||||||
|
|
||||||
|
CommandProcessingResult deleteNote(JsonCommand command);
|
||||||
|
}
|
||||||
+198
@@ -0,0 +1,198 @@
|
|||||||
|
/**
|
||||||
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
|
* You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
|
*/
|
||||||
|
package org.mifosplatform.portfolio.note.service;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import org.mifosplatform.infrastructure.core.api.JsonCommand;
|
||||||
|
import org.mifosplatform.infrastructure.core.data.CommandProcessingResult;
|
||||||
|
import org.mifosplatform.infrastructure.core.data.CommandProcessingResultBuilder;
|
||||||
|
import org.mifosplatform.portfolio.client.domain.Client;
|
||||||
|
import org.mifosplatform.portfolio.client.domain.ClientRepository;
|
||||||
|
import org.mifosplatform.portfolio.client.exception.ClientNotFoundException;
|
||||||
|
import org.mifosplatform.portfolio.group.domain.Group;
|
||||||
|
import org.mifosplatform.portfolio.group.domain.GroupRepository;
|
||||||
|
import org.mifosplatform.portfolio.group.exception.GroupNotFoundException;
|
||||||
|
import org.mifosplatform.portfolio.loanaccount.domain.Loan;
|
||||||
|
import org.mifosplatform.portfolio.loanaccount.domain.LoanRepository;
|
||||||
|
import org.mifosplatform.portfolio.loanaccount.domain.LoanTransaction;
|
||||||
|
import org.mifosplatform.portfolio.loanaccount.domain.LoanTransactionRepository;
|
||||||
|
import org.mifosplatform.portfolio.loanaccount.exception.LoanNotFoundException;
|
||||||
|
import org.mifosplatform.portfolio.loanaccount.exception.LoanTransactionNotFoundException;
|
||||||
|
import org.mifosplatform.portfolio.note.domain.Note;
|
||||||
|
import org.mifosplatform.portfolio.note.domain.NoteRepository;
|
||||||
|
import org.mifosplatform.portfolio.note.domain.NoteType;
|
||||||
|
import org.mifosplatform.portfolio.note.exception.NoteNotFoundException;
|
||||||
|
import org.mifosplatform.portfolio.note.serialization.NoteCommandFromApiJsonDeserializer;
|
||||||
|
import org.mifosplatform.portfolio.savingsaccount.domain.SavingAccount;
|
||||||
|
import org.mifosplatform.portfolio.savingsaccount.domain.SavingAccountRepository;
|
||||||
|
import org.mifosplatform.portfolio.savingsaccount.exception.SavingAccountNotFoundException;
|
||||||
|
import org.mifosplatform.portfolio.savingsdepositaccount.domain.DepositAccount;
|
||||||
|
import org.mifosplatform.portfolio.savingsdepositaccount.domain.DepositAccountRepository;
|
||||||
|
import org.mifosplatform.portfolio.savingsdepositaccount.exception.DepositAccountNotFoundException;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
public class NoteWritePlatformServiceJpaRepositoryImpl implements NoteWritePlatformService {
|
||||||
|
|
||||||
|
private final NoteRepository noteRepository;
|
||||||
|
private final ClientRepository clientRepository;
|
||||||
|
private final GroupRepository groupRepository;
|
||||||
|
private final DepositAccountRepository depositAccountRepository;
|
||||||
|
private final SavingAccountRepository savingAccountRepository;
|
||||||
|
private final LoanRepository loanRepository;
|
||||||
|
private final LoanTransactionRepository loanTransactionRepository;
|
||||||
|
private final NoteCommandFromApiJsonDeserializer fromApiJsonDeserializer;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
public NoteWritePlatformServiceJpaRepositoryImpl(final NoteRepository noteRepository, final ClientRepository clientRepository,
|
||||||
|
final GroupRepository groupRepository, final DepositAccountRepository depositAccountRepository,
|
||||||
|
final SavingAccountRepository savingAccountRepository, final LoanRepository loanRepository,
|
||||||
|
final LoanTransactionRepository loanTransactionRepository, final NoteCommandFromApiJsonDeserializer fromApiJsonDeserializer) {
|
||||||
|
this.noteRepository = noteRepository;
|
||||||
|
this.clientRepository = clientRepository;
|
||||||
|
this.groupRepository = groupRepository;
|
||||||
|
this.depositAccountRepository = depositAccountRepository;
|
||||||
|
this.savingAccountRepository = savingAccountRepository;
|
||||||
|
this.loanRepository = loanRepository;
|
||||||
|
this.loanTransactionRepository = loanTransactionRepository;
|
||||||
|
this.fromApiJsonDeserializer = fromApiJsonDeserializer;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public CommandProcessingResult createNote(final JsonCommand command) {
|
||||||
|
|
||||||
|
this.fromApiJsonDeserializer.validateNote(command.json());
|
||||||
|
|
||||||
|
final Note newNote = getNewNote(command);
|
||||||
|
|
||||||
|
this.noteRepository.save(newNote);
|
||||||
|
return new CommandProcessingResultBuilder() //
|
||||||
|
.withCommandId(command.commandId()) //
|
||||||
|
.withEntityId(newNote.getId()) //
|
||||||
|
.build();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public CommandProcessingResult updateNote(final JsonCommand command) {
|
||||||
|
|
||||||
|
this.fromApiJsonDeserializer.validateNote(command.json());
|
||||||
|
|
||||||
|
final Note noteForUpdate = getNoteForUpdate(command);
|
||||||
|
|
||||||
|
final Map<String, Object> changes = noteForUpdate.update(command);
|
||||||
|
|
||||||
|
if (!changes.isEmpty()) {
|
||||||
|
this.noteRepository.saveAndFlush(noteForUpdate);
|
||||||
|
}
|
||||||
|
|
||||||
|
return new CommandProcessingResultBuilder() //
|
||||||
|
.withCommandId(command.commandId()) //
|
||||||
|
.withEntityId(noteForUpdate.getId()) //
|
||||||
|
.with(changes) //
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public CommandProcessingResult deleteNote(JsonCommand command) {
|
||||||
|
|
||||||
|
final Note noteForDelete = getNoteForUpdate(command);
|
||||||
|
|
||||||
|
this.noteRepository.delete(noteForDelete);
|
||||||
|
return new CommandProcessingResultBuilder() //
|
||||||
|
.withCommandId(null) //
|
||||||
|
.withEntityId(command.entityId()) //
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
private Note getNewNote(final JsonCommand command) {
|
||||||
|
final String resourceUrl = command.getSupportedEntityType();
|
||||||
|
final Long resourceId = command.getSupportedEntityId();
|
||||||
|
final NoteType type = NoteType.fromApiUrl(resourceUrl);
|
||||||
|
Note newNote = null;
|
||||||
|
final String note = command.stringValueOfParameterNamed("note");
|
||||||
|
switch (type) {
|
||||||
|
case CLIENT: {
|
||||||
|
final Client client = this.clientRepository.findOne(resourceId);
|
||||||
|
if (client == null) { throw new ClientNotFoundException(resourceId); }
|
||||||
|
newNote = Note.clientNoteFromJson(client, command);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case DEPOSIT: {
|
||||||
|
final DepositAccount depositAccount = this.depositAccountRepository.findOne(resourceId);
|
||||||
|
if (depositAccount == null) { throw new DepositAccountNotFoundException(resourceId); }
|
||||||
|
newNote = Note.depositNote(depositAccount, note);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case GROUP: {
|
||||||
|
final Group group = this.groupRepository.findOne(resourceId);
|
||||||
|
if (group == null) { throw new GroupNotFoundException(resourceId); }
|
||||||
|
newNote = Note.groupNoteFromJson(group, command);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case LOAN: {
|
||||||
|
final Loan loan = this.loanRepository.findOne(resourceId);
|
||||||
|
if (loan == null) { throw new LoanNotFoundException(resourceId); }
|
||||||
|
newNote = Note.loanNote(loan, note);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case LOAN_TRANSACTION: {
|
||||||
|
final LoanTransaction loanTransaction = this.loanTransactionRepository.findOne(resourceId);
|
||||||
|
if (loanTransaction == null) { throw new LoanTransactionNotFoundException(resourceId); }
|
||||||
|
final Loan loan = loanTransaction.getLoan();
|
||||||
|
newNote = Note.loanTransactionNote(loan, loanTransaction, note);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case SAVING: {
|
||||||
|
final SavingAccount savingAccount = this.savingAccountRepository.findOne(resourceId);
|
||||||
|
if (savingAccount == null) { throw new SavingAccountNotFoundException(resourceId); }
|
||||||
|
newNote = Note.savingNote(savingAccount, note);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return newNote;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Note getNoteForUpdate(final JsonCommand command) {
|
||||||
|
final String resourceUrl = command.getSupportedEntityType();
|
||||||
|
final Long resourceId = command.getSupportedEntityId();
|
||||||
|
final Long noteId = command.entityId();
|
||||||
|
final NoteType type = NoteType.fromApiUrl(resourceUrl);
|
||||||
|
Note noteForUpdate = null;
|
||||||
|
switch (type) {
|
||||||
|
case CLIENT: {
|
||||||
|
noteForUpdate = this.noteRepository.findByClientIdAndId(resourceId, noteId);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case DEPOSIT: {
|
||||||
|
noteForUpdate = this.noteRepository.findByDepositAccountIdAndId(resourceId, noteId);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case GROUP: {
|
||||||
|
noteForUpdate = this.noteRepository.findByGroupIdAndId(resourceId, noteId);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case LOAN: {
|
||||||
|
noteForUpdate = this.noteRepository.findByLoanIdAndId(resourceId, noteId);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case LOAN_TRANSACTION: {
|
||||||
|
noteForUpdate = this.noteRepository.findByLoanTransactionIdAndId(resourceId, noteId);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case SAVING: {
|
||||||
|
noteForUpdate = this.noteRepository.findBySavingAccountIdAndId(resourceId, noteId);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (noteForUpdate == null) { throw new NoteNotFoundException(noteId, resourceId, type.name().toLowerCase()); }
|
||||||
|
return noteForUpdate;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
+2
-2
@@ -18,8 +18,8 @@ import org.mifosplatform.infrastructure.core.data.CommandProcessingResult;
|
|||||||
import org.mifosplatform.infrastructure.core.data.CommandProcessingResultBuilder;
|
import org.mifosplatform.infrastructure.core.data.CommandProcessingResultBuilder;
|
||||||
import org.mifosplatform.infrastructure.core.exception.PlatformDataIntegrityException;
|
import org.mifosplatform.infrastructure.core.exception.PlatformDataIntegrityException;
|
||||||
import org.mifosplatform.infrastructure.security.service.PlatformSecurityContext;
|
import org.mifosplatform.infrastructure.security.service.PlatformSecurityContext;
|
||||||
import org.mifosplatform.portfolio.client.domain.Note;
|
import org.mifosplatform.portfolio.note.domain.Note;
|
||||||
import org.mifosplatform.portfolio.client.domain.NoteRepository;
|
import org.mifosplatform.portfolio.note.domain.NoteRepository;
|
||||||
import org.mifosplatform.portfolio.savingsaccount.data.SavingAccountForLookup;
|
import org.mifosplatform.portfolio.savingsaccount.data.SavingAccountForLookup;
|
||||||
import org.mifosplatform.portfolio.savingsaccount.domain.SavingAccount;
|
import org.mifosplatform.portfolio.savingsaccount.domain.SavingAccount;
|
||||||
import org.mifosplatform.portfolio.savingsaccount.domain.SavingAccountRepository;
|
import org.mifosplatform.portfolio.savingsaccount.domain.SavingAccountRepository;
|
||||||
|
|||||||
+2
-2
@@ -21,8 +21,8 @@ import org.mifosplatform.infrastructure.core.exception.PlatformDataIntegrityExce
|
|||||||
import org.mifosplatform.infrastructure.security.exception.NoAuthorizationException;
|
import org.mifosplatform.infrastructure.security.exception.NoAuthorizationException;
|
||||||
import org.mifosplatform.infrastructure.security.service.PlatformSecurityContext;
|
import org.mifosplatform.infrastructure.security.service.PlatformSecurityContext;
|
||||||
import org.mifosplatform.organisation.monetary.domain.Money;
|
import org.mifosplatform.organisation.monetary.domain.Money;
|
||||||
import org.mifosplatform.portfolio.client.domain.Note;
|
import org.mifosplatform.portfolio.note.domain.Note;
|
||||||
import org.mifosplatform.portfolio.client.domain.NoteRepository;
|
import org.mifosplatform.portfolio.note.domain.NoteRepository;
|
||||||
import org.mifosplatform.portfolio.savingsdepositaccount.data.DepositAccountsForLookup;
|
import org.mifosplatform.portfolio.savingsdepositaccount.data.DepositAccountsForLookup;
|
||||||
import org.mifosplatform.portfolio.savingsdepositaccount.domain.DepositAccount;
|
import org.mifosplatform.portfolio.savingsdepositaccount.domain.DepositAccount;
|
||||||
import org.mifosplatform.portfolio.savingsdepositaccount.domain.DepositAccountRepository;
|
import org.mifosplatform.portfolio.savingsdepositaccount.domain.DepositAccountRepository;
|
||||||
|
|||||||
Reference in New Issue
Block a user