diff --git a/fineract-core/src/main/java/org/apache/fineract/portfolio/account/command/AccountRefundByTransferCommand.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/account/command/AccountRefundByTransferCommand.java new file mode 100644 index 00000000000..272275aa722 --- /dev/null +++ b/fineract-core/src/main/java/org/apache/fineract/portfolio/account/command/AccountRefundByTransferCommand.java @@ -0,0 +1,33 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.fineract.portfolio.account.command; + +import java.io.Serial; +import lombok.Getter; +import lombok.Setter; +import org.apache.fineract.command.core.Command; +import org.apache.fineract.portfolio.account.data.RefundByTransferRequest; + +@Getter +@Setter +public class AccountRefundByTransferCommand extends Command { + + @Serial + private static final long serialVersionUID = 1L; +} diff --git a/fineract-core/src/main/java/org/apache/fineract/portfolio/account/command/AccountTransferCreateCommand.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/account/command/AccountTransferCreateCommand.java new file mode 100644 index 00000000000..a991065eea2 --- /dev/null +++ b/fineract-core/src/main/java/org/apache/fineract/portfolio/account/command/AccountTransferCreateCommand.java @@ -0,0 +1,33 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.fineract.portfolio.account.command; + +import java.io.Serial; +import lombok.Getter; +import lombok.Setter; +import org.apache.fineract.command.core.Command; +import org.apache.fineract.portfolio.account.data.AccountTransferRequest; + +@Getter +@Setter +public class AccountTransferCreateCommand extends Command { + + @Serial + private static final long serialVersionUID = 1L; +} diff --git a/fineract-core/src/main/java/org/apache/fineract/portfolio/account/command/StandingInstructionCreateCommand.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/account/command/StandingInstructionCreateCommand.java new file mode 100644 index 00000000000..77f193cea30 --- /dev/null +++ b/fineract-core/src/main/java/org/apache/fineract/portfolio/account/command/StandingInstructionCreateCommand.java @@ -0,0 +1,33 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.fineract.portfolio.account.command; + +import java.io.Serial; +import lombok.Getter; +import lombok.Setter; +import org.apache.fineract.command.core.Command; +import org.apache.fineract.portfolio.account.data.StandingInstructionCreateRequest; + +@Getter +@Setter +public class StandingInstructionCreateCommand extends Command { + + @Serial + private static final long serialVersionUID = 1L; +} diff --git a/fineract-core/src/main/java/org/apache/fineract/portfolio/account/command/StandingInstructionUpdateCommand.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/account/command/StandingInstructionUpdateCommand.java new file mode 100644 index 00000000000..231d2e23f41 --- /dev/null +++ b/fineract-core/src/main/java/org/apache/fineract/portfolio/account/command/StandingInstructionUpdateCommand.java @@ -0,0 +1,15 @@ +package org.apache.fineract.portfolio.account.command; + +import java.io.Serial; +import lombok.Getter; +import lombok.Setter; +import org.apache.fineract.command.core.Command; +import org.apache.fineract.portfolio.account.data.StandingInstructionUpdateRequest; + +@Getter +@Setter +public class StandingInstructionUpdateCommand extends Command { + + @Serial + private static final long serialVersionUID = 1L; +} diff --git a/fineract-core/src/main/java/org/apache/fineract/portfolio/account/data/AccountTransferRequest.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/account/data/AccountTransferRequest.java new file mode 100644 index 00000000000..839119f0ea6 --- /dev/null +++ b/fineract-core/src/main/java/org/apache/fineract/portfolio/account/data/AccountTransferRequest.java @@ -0,0 +1,79 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.fineract.portfolio.account.data; + +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.Size; +import java.io.Serial; +import java.io.Serializable; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import org.apache.fineract.validation.constraints.Locale; + +@Getter +@Setter +@NoArgsConstructor +public class AccountTransferRequest implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + @NotBlank(message = "{org.apache.fineract.portfolio.account.data.transfer.description.not.blank}") + @Size(max = 200, message = "{org.apache.fineract.portfolio.account.data.transfer.description.size}") + private String transferDescription; + + @NotBlank(message = "{org.apache.fineract.portfolio.account.data.to.office.id.not.blank}") + private String toOfficeId; + + @NotBlank(message = "{org.apache.fineract.portfolio.account.data.to.account.type.not.blank}") + private String toAccountType; + + @NotBlank(message = "{org.apache.fineract.portfolio.account.data.date.format.not.blank}") + private String dateFormat; + + @NotBlank(message = "{org.apache.fineract.portfolio.account.data.transfer.amount.not.blank}") + private String transferAmount; + + @NotBlank(message = "{org.apache.fineract.portfolio.account.data.to.account.id.not.blank}") + private String toAccountId; + + @NotBlank(message = "{org.apache.fineract.portfolio.account.data.from.client.id.not.blank}") + private String fromClientId; + + @NotBlank(message = "{org.apache.fineract.portfolio.account.data.locale.not.blank}") + @Size(max = 50, message = "{org.apache.fineract.portfolio.account.data.locale.size}") + @Locale + private String locale; + + @NotBlank(message = "{org.apache.fineract.portfolio.account.data.transfer.date.not.blank}") + private String transferDate; + + @NotBlank(message = "{org.apache.fineract.portfolio.account.data.from.account.type.not.blank}") + private String fromAccountType; + + @NotBlank(message = "{org.apache.fineract.portfolio.account.data.to.client.id.not.blank}") + private String toClientId; + + @NotBlank(message = "{org.apache.fineract.portfolio.account.data.from.account.id.not.blank}") + private String fromAccountId; + + @NotBlank(message = "{org.apache.fineract.portfolio.account.data.from.office.id.not.blank}") + private String fromOfficeId; +} diff --git a/fineract-core/src/main/java/org/apache/fineract/portfolio/account/data/AccountTransferResponse.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/account/data/AccountTransferResponse.java new file mode 100644 index 00000000000..545fbd7043b --- /dev/null +++ b/fineract-core/src/main/java/org/apache/fineract/portfolio/account/data/AccountTransferResponse.java @@ -0,0 +1,42 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.fineract.portfolio.account.data; + +import java.io.Serial; +import java.io.Serializable; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class AccountTransferResponse implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + private Long savingsId; + private Long loanId; + private Long resourceId; +} diff --git a/fineract-core/src/main/java/org/apache/fineract/portfolio/account/data/RefundByTransferRequest.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/account/data/RefundByTransferRequest.java new file mode 100644 index 00000000000..aa256a5a7ad --- /dev/null +++ b/fineract-core/src/main/java/org/apache/fineract/portfolio/account/data/RefundByTransferRequest.java @@ -0,0 +1,73 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.fineract.portfolio.account.data; + +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.Size; +import java.io.Serial; +import java.io.Serializable; +import org.apache.fineract.validation.constraints.Locale; + +public class RefundByTransferRequest implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + @NotBlank(message = "{org.apache.fineract.portfolio.account.data.transfer.description.not.blank}") + @Size(max = 200, message = "{org.apache.fineract.portfolio.account.data.transfer.description.size}") + private String transferDescription; + + @NotBlank(message = "{org.apache.fineract.portfolio.account.data.to.office.id.not.blank}") + private String toOfficeId; + + @NotBlank(message = "{org.apache.fineract.portfolio.account.data.to.account.type.not.blank}") + private String toAccountType; + + @NotBlank(message = "{org.apache.fineract.portfolio.account.data.date.format.not.blank}") + private String dateFormat; + + @NotBlank(message = "{org.apache.fineract.portfolio.account.data.transfer.amount.not.blank}") + private String transferAmount; + + @NotBlank(message = "{org.apache.fineract.portfolio.account.data.to.account.id.not.blank}") + private String toAccountId; + + @NotBlank(message = "{org.apache.fineract.portfolio.account.data.from.client.id.not.blank}") + private String fromClientId; + + @NotBlank(message = "{org.apache.fineract.portfolio.account.data.locale.not.blank}") + @Size(max = 50, message = "{org.apache.fineract.portfolio.account.data.locale.size}") + @Locale + private String locale; + + @NotBlank(message = "{org.apache.fineract.portfolio.account.data.transfer.date.not.blank}") + private String transferDate; + + @NotBlank(message = "{org.apache.fineract.portfolio.account.data.from.account.type.not.blank}") + private String fromAccountType; + + @NotBlank(message = "{org.apache.fineract.portfolio.account.data.to.client.id.not.blank}") + private String toClientId; + + @NotBlank(message = "{org.apache.fineract.portfolio.account.data.from.account.id.not.blank}") + private String fromAccountId; + + @NotBlank(message = "{org.apache.fineract.portfolio.account.data.from.office.id.not.blank}") + private String fromOfficeId; +} diff --git a/fineract-core/src/main/java/org/apache/fineract/portfolio/account/data/RefundByTransferResponse.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/account/data/RefundByTransferResponse.java new file mode 100644 index 00000000000..c819c225627 --- /dev/null +++ b/fineract-core/src/main/java/org/apache/fineract/portfolio/account/data/RefundByTransferResponse.java @@ -0,0 +1,39 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.fineract.portfolio.account.data; + +import java.io.Serial; +import java.io.Serializable; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +public class RefundByTransferResponse implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + private Long savingsId; + private Long resourceId; +} diff --git a/fineract-core/src/main/java/org/apache/fineract/portfolio/account/data/StandingInstructionCreateRequest.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/account/data/StandingInstructionCreateRequest.java new file mode 100644 index 00000000000..a51352ae71d --- /dev/null +++ b/fineract-core/src/main/java/org/apache/fineract/portfolio/account/data/StandingInstructionCreateRequest.java @@ -0,0 +1,108 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.fineract.portfolio.account.data; + +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.Size; +import java.io.Serial; +import java.io.Serializable; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import org.apache.fineract.validation.constraints.Locale; + +@Getter +@Setter +@NoArgsConstructor +public class StandingInstructionCreateRequest implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + @NotBlank(message = "{org.apache.fineract.portfolio.account.data.to.office.id.not.blank}") + private String toOfficeId; + + @NotBlank(message = "{org.apache.fineract.portfolio.account.data.transfer.amount.not.blank}") + private String amount; + + @NotBlank(message = "{org.apache.fineract.portfolio.account.data.valid.till.not.blank}") + private String validTill; + + @NotBlank(message = "{org.apache.fineract.portfolio.account.data.to.account.type.not.blank}") + private String toAccountType; + + @NotBlank(message = "{org.apache.fineract.portfolio.account.data.date.format.not.blank}") + private String dateFormat; + + @NotBlank(message = "{org.apache.fineract.portfolio.account.data.recurrence.on.month.not.blank}") + private String recurrenceOnMonthDay; + + @NotBlank(message = "{org.apache.fineract.portfolio.account.data.to.account.id.not.blank}") + private String toAccountId; + + @NotBlank(message = "{org.apache.fineract.portfolio.account.data.from.client.id.not.blank}") + private String fromClientId; + + @NotBlank(message = "{org.apache.fineract.portfolio.account.data.valid.from.not.blank}") + private String validFrom; + + @NotBlank(message = "{org.apache.fineract.portfolio.account.data.locale.not.blank}") + @Size(max = 50, message = "{org.apache.fineract.portfolio.account.data.locale.size}") + @Locale + private String locale; + + @NotBlank(message = "{org.apache.fineract.portfolio.account.priority.not.blank}") + private String priority; + + @NotBlank(message = "{org.apache.fineract.portfolio.account.recurrence.type.not.blank}") + private String recurrenceType; + + @NotBlank(message = "{org.apache.fineract.portfolio.account.from.account.type.not.blank}") + private String fromAccountType; + + @NotBlank(message = "{org.apache.fineract.portfolio.account.recurrence.interval.not.blank}") + private String recurrenceInterval; + + @NotBlank(message = "{org.apache.fineract.portfolio.account.month.day.format.not.blank}") + private String monthDayFormat; + + @NotBlank(message = "{org.apache.fineract.portfolio.account.data.to.client.id.not.blank}") + private String toClientId; + + @NotBlank(message = "{org.apache.fineract.portfolio.account.data.instruction.type.not.blank}") + private String instructionType; + + @NotBlank(message = "{org.apache.fineract.portfolio.account.data.from.account.id.not.blank}") + private String fromAccountId; + + @NotBlank(message = "{org.apache.fineract.portfolio.account.data.recurrence.frequency.not.blank}") + private String recurrenceFrequency; + + @NotBlank(message = "{org.apache.fineract.portfolio.account.data.from.office.id.not.blank}") + private String fromOfficeId; + + @NotBlank(message = "{org.apache.fineract.portfolio.account.data.name.not.blank}") + private String name; + + @NotBlank(message = "{org.apache.fineract.portfolio.account.data.transfer.type.not.blank}") + private String transferType; + + @NotBlank(message = "{org.apache.fineract.portfolio.account.data.status.not.blank}") + private String status; +} diff --git a/fineract-core/src/main/java/org/apache/fineract/portfolio/account/data/StandingInstructionCreateResponse.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/account/data/StandingInstructionCreateResponse.java new file mode 100644 index 00000000000..715d1b6d3ef --- /dev/null +++ b/fineract-core/src/main/java/org/apache/fineract/portfolio/account/data/StandingInstructionCreateResponse.java @@ -0,0 +1,31 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.fineract.portfolio.account.data; + +import java.io.Serial; +import java.io.Serializable; + +public class StandingInstructionCreateResponse implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + private Long clientId; + private Long resourceId; +} diff --git a/fineract-core/src/main/java/org/apache/fineract/portfolio/account/data/StandingInstructionUpdateRequest.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/account/data/StandingInstructionUpdateRequest.java new file mode 100644 index 00000000000..396c5e93ddc --- /dev/null +++ b/fineract-core/src/main/java/org/apache/fineract/portfolio/account/data/StandingInstructionUpdateRequest.java @@ -0,0 +1,70 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.fineract.portfolio.account.data; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import jakarta.validation.constraints.Size; +import java.io.Serial; +import java.io.Serializable; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import org.apache.fineract.portfolio.account.mapper.StandingInstructionUpdateRequestMapper; +import org.apache.fineract.validation.constraints.Locale; + +@Getter +@Setter +@NoArgsConstructor +public class StandingInstructionUpdateRequest implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + private String amount; + private String validTill; + private String dateFormat; + private String recurrenceOnMonthDay; + private String validFrom; + @Size(max = 50, message = "{org.apache.fineract.portfolio.account.data.locale.size}") + @Locale + private String locale; + private String priority; + private String recurrenceType; + private String recurrenceInterval; + private String monthDayFormat; + private String instructionType; + private String recurrenceFrequency; + private String status; + + @JsonIgnore + private Long standingInstructionId; + + @JsonIgnore + private String commandParam; + + public static StandingInstructionUpdateRequest withCommandParamAndStandingInstructionId(String commandParam, Long standingInstructionId, + StandingInstructionUpdateRequest request) { + final StandingInstructionUpdateRequest result = StandingInstructionUpdateRequestMapper.INSTANCE.copy(request); + + result.setCommandParam(commandParam); + result.setStandingInstructionId(standingInstructionId); + + return result; + } +} diff --git a/fineract-core/src/main/java/org/apache/fineract/portfolio/account/data/StandingInstructionUpdateResponse.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/account/data/StandingInstructionUpdateResponse.java new file mode 100644 index 00000000000..ec109852f47 --- /dev/null +++ b/fineract-core/src/main/java/org/apache/fineract/portfolio/account/data/StandingInstructionUpdateResponse.java @@ -0,0 +1,40 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.fineract.portfolio.account.data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Map; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +public class StandingInstructionUpdateResponse implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + private Long resourceId; + private Map changes; +} diff --git a/fineract-core/src/main/java/org/apache/fineract/portfolio/account/mapper/StandingInstructionUpdateRequestMapper.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/account/mapper/StandingInstructionUpdateRequestMapper.java new file mode 100644 index 00000000000..55a7ab76eca --- /dev/null +++ b/fineract-core/src/main/java/org/apache/fineract/portfolio/account/mapper/StandingInstructionUpdateRequestMapper.java @@ -0,0 +1,43 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.fineract.portfolio.account.mapper; + +import org.apache.fineract.infrastructure.core.config.MapstructMapperConfig; +import org.apache.fineract.portfolio.account.data.StandingInstructionUpdateRequest; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.MappingTarget; +import org.mapstruct.factory.Mappers; + +@Mapper(config = MapstructMapperConfig.class) +public interface StandingInstructionUpdateRequestMapper { + + StandingInstructionUpdateRequestMapper INSTANCE = Mappers.getMapper(StandingInstructionUpdateRequestMapper.class); + + // Copy everything from source to target + StandingInstructionUpdateRequest copy(StandingInstructionUpdateRequest source); + + // Update existing target object with source values + void updateFrom(@MappingTarget StandingInstructionUpdateRequest target, StandingInstructionUpdateRequest source); + + // Map everything except @JsonIgnore fields + @Mapping(target = "commandParam", ignore = true) + @Mapping(target = "standingInstructionId", ignore = true) + StandingInstructionUpdateRequest toServiceRequest(StandingInstructionUpdateRequest source); +} diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/account/handler/AccountRefundByTransferCommandHandler.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/account/handler/AccountRefundByTransferCommandHandler.java new file mode 100644 index 00000000000..7fa861aa49c --- /dev/null +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/account/handler/AccountRefundByTransferCommandHandler.java @@ -0,0 +1,36 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.fineract.portfolio.account.handler; + +import lombok.RequiredArgsConstructor; +import org.apache.fineract.command.core.Command; +import org.apache.fineract.command.core.CommandHandler; +import org.apache.fineract.portfolio.account.data.RefundByTransferRequest; +import org.apache.fineract.portfolio.account.data.RefundByTransferResponse; +import org.springframework.stereotype.Component; + +@Component +@RequiredArgsConstructor +public class AccountRefundByTransferCommandHandler implements CommandHandler { + + @Override + public RefundByTransferResponse handle(Command command) { + return null; + } +} diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/account/handler/AccountTransferCreateCommandHandler.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/account/handler/AccountTransferCreateCommandHandler.java new file mode 100644 index 00000000000..0360cba72bb --- /dev/null +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/account/handler/AccountTransferCreateCommandHandler.java @@ -0,0 +1,40 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.fineract.portfolio.account.handler; + +import lombok.RequiredArgsConstructor; +import org.apache.fineract.command.core.Command; +import org.apache.fineract.command.core.CommandHandler; +import org.apache.fineract.portfolio.account.data.AccountTransferRequest; +import org.apache.fineract.portfolio.account.data.AccountTransferResponse; +import org.apache.fineract.portfolio.account.service.AccountTransferWritePlatformService; +import org.springframework.stereotype.Component; + +@Component +@RequiredArgsConstructor +public class AccountTransferCreateCommandHandler implements CommandHandler { + + private final AccountTransferWritePlatformService accountTransferWritePlatformService; + + @Override + public AccountTransferResponse handle(Command command) { + + return accountTransferWritePlatformService.create(command); + } +} diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/account/handler/StandingInstructionCreateCommandHandler.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/account/handler/StandingInstructionCreateCommandHandler.java new file mode 100644 index 00000000000..1950c7a7552 --- /dev/null +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/account/handler/StandingInstructionCreateCommandHandler.java @@ -0,0 +1,37 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.fineract.portfolio.account.handler; + +import lombok.RequiredArgsConstructor; +import org.apache.fineract.command.core.Command; +import org.apache.fineract.command.core.CommandHandler; +import org.apache.fineract.portfolio.account.data.StandingInstructionCreateRequest; +import org.apache.fineract.portfolio.account.data.StandingInstructionCreateResponse; +import org.springframework.stereotype.Component; + +@Component +@RequiredArgsConstructor +public class StandingInstructionCreateCommandHandler + implements CommandHandler { + + @Override + public StandingInstructionCreateResponse handle(Command command) { + return null; + } +} diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/account/handler/StandingInstructionUpdateCommandHandler.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/account/handler/StandingInstructionUpdateCommandHandler.java new file mode 100644 index 00000000000..5c465061170 --- /dev/null +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/account/handler/StandingInstructionUpdateCommandHandler.java @@ -0,0 +1,37 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.fineract.portfolio.account.handler; + +import lombok.RequiredArgsConstructor; +import org.apache.fineract.command.core.Command; +import org.apache.fineract.command.core.CommandHandler; +import org.apache.fineract.portfolio.account.data.StandingInstructionUpdateRequest; +import org.apache.fineract.portfolio.account.data.StandingInstructionUpdateResponse; +import org.springframework.stereotype.Component; + +@Component +@RequiredArgsConstructor +public class StandingInstructionUpdateCommandHandler + implements CommandHandler { + + @Override + public StandingInstructionUpdateResponse handle(Command command) { + return null; + } +} diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/account/service/AccountTransferWritePlatformService.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/account/service/AccountTransferWritePlatformService.java new file mode 100644 index 00000000000..c518d535ef5 --- /dev/null +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/account/service/AccountTransferWritePlatformService.java @@ -0,0 +1,28 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.fineract.portfolio.account.service; + +import org.apache.fineract.command.core.Command; +import org.apache.fineract.portfolio.account.data.AccountTransferRequest; +import org.apache.fineract.portfolio.account.data.AccountTransferResponse; + +public interface AccountTransferWritePlatformService { + + public AccountTransferResponse create(Command command); +} diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/account/service/AccountTransferWritePlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/account/service/AccountTransferWritePlatformServiceImpl.java new file mode 100644 index 00000000000..cacec4fb9ed --- /dev/null +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/account/service/AccountTransferWritePlatformServiceImpl.java @@ -0,0 +1,178 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.fineract.portfolio.account.service; + +import lombok.RequiredArgsConstructor; +import org.apache.fineract.command.core.Command; +import org.apache.fineract.infrastructure.core.data.CommandProcessingResultBuilder; +import org.apache.fineract.infrastructure.core.domain.ExternalId; +import org.apache.fineract.portfolio.account.PortfolioAccountType; +import org.apache.fineract.portfolio.account.data.AccountTransferRequest; +import org.apache.fineract.portfolio.account.data.AccountTransferResponse; +import org.apache.fineract.portfolio.account.domain.AccountTransferDetails; +import org.apache.fineract.portfolio.account.exception.DifferentCurrenciesException; +import org.apache.fineract.portfolio.loanaccount.data.HolidayDetailDTO; +import org.apache.fineract.portfolio.loanaccount.domain.Loan; +import org.apache.fineract.portfolio.loanaccount.domain.LoanTransaction; +import org.apache.fineract.portfolio.loanaccount.domain.LoanTransactionType; +import org.apache.fineract.portfolio.paymentdetail.domain.PaymentDetail; +import org.apache.fineract.portfolio.savings.SavingsTransactionBooleanValues; +import org.apache.fineract.portfolio.savings.domain.SavingsAccount; +import org.apache.fineract.portfolio.savings.domain.SavingsAccountTransaction; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.Locale; + +import static org.apache.fineract.portfolio.account.AccountDetailConstants.fromAccountIdParamName; +import static org.apache.fineract.portfolio.account.AccountDetailConstants.fromAccountTypeParamName; +import static org.apache.fineract.portfolio.account.AccountDetailConstants.toAccountIdParamName; +import static org.apache.fineract.portfolio.account.AccountDetailConstants.toAccountTypeParamName; +import static org.apache.fineract.portfolio.account.api.AccountTransfersApiConstants.transferAmountParamName; +import static org.apache.fineract.portfolio.account.api.AccountTransfersApiConstants.transferDateParamName; + +@Service +@RequiredArgsConstructor +public class AccountTransferWritePlatformServiceImpl implements AccountTransferWritePlatformService { + + @Override + public AccountTransferResponse create(Command command) { + + final AccountTransferRequest request = command.getPayload(); + boolean isRegularTransaction = true; + + final DateTimeFormatter fmt = DateTimeFormatter.ofPattern(request.getDateFormat()).withLocale(Locale.of(request.getLocale())); + final PortfolioAccountType fromAccountType = PortfolioAccountType.fromInt(Integer.valueOf(request.getFromAccountType())); + final PortfolioAccountType toAccountType = PortfolioAccountType.fromInt(Integer.valueOf(request.getToAccountType())); + + final PaymentDetail paymentDetail = null; + Long fromSavingsAccountId = null; + Long transferDetailId = null; + boolean isInterestTransfer = false; + boolean isAccountTransfer = true; + Long fromLoanAccountId = null; + boolean isWithdrawBalance = false; + final boolean backdatedTxnsAllowedTill = false; + + if (isSavingsToSavingsAccountTransfer(fromAccountType, toAccountType)) { + + fromSavingsAccountId = Long.valueOf(request.getFromAccountId()); // command.longValueOfParameterNamed(fromAccountIdParamName); + final SavingsAccount fromSavingsAccount = this.savingsAccountAssembler.assembleFrom(fromSavingsAccountId, + backdatedTxnsAllowedTill); + + final SavingsTransactionBooleanValues transactionBooleanValues = new SavingsTransactionBooleanValues(isAccountTransfer, + isRegularTransaction, fromSavingsAccount.isWithdrawalFeeApplicableForTransfer(), isInterestTransfer, isWithdrawBalance); + final SavingsAccountTransaction withdrawal = this.savingsAccountDomainService.handleWithdrawal(fromSavingsAccount, fmt, + transactionDate, transactionAmount, paymentDetail, transactionBooleanValues, backdatedTxnsAllowedTill); + + final SavingsAccount toSavingsAccount = this.savingsAccountAssembler.assembleFrom(request.getToAccountId(), backdatedTxnsAllowedTill); + + final SavingsAccountTransaction deposit = this.savingsAccountDomainService.handleDeposit(toSavingsAccount, fmt, transactionDate, + transactionAmount, paymentDetail, isAccountTransfer, isRegularTransaction, backdatedTxnsAllowedTill); + + if (!fromSavingsAccount.getCurrency().getCode().equals(toSavingsAccount.getCurrency().getCode())) { + throw new DifferentCurrenciesException(fromSavingsAccount.getCurrency().getCode(), + toSavingsAccount.getCurrency().getCode()); + } + + final AccountTransferDetails accountTransferDetails = this.accountTransferAssembler.assembleSavingsToSavingsTransfer(command, + fromSavingsAccount, toSavingsAccount, withdrawal, deposit); + this.accountTransferDetailRepository.saveAndFlush(accountTransferDetails); + transferDetailId = accountTransferDetails.getId(); + + } else if (isSavingsToLoanAccountTransfer(fromAccountType, toAccountType)) { + + final SavingsAccount fromSavingsAccount = this.savingsAccountAssembler.assembleFrom(request.getFromAccountId(), + backdatedTxnsAllowedTill); + + final SavingsTransactionBooleanValues transactionBooleanValues = new SavingsTransactionBooleanValues(isAccountTransfer, + isRegularTransaction, fromSavingsAccount.isWithdrawalFeeApplicableForTransfer(), isInterestTransfer, isWithdrawBalance); + final SavingsAccountTransaction withdrawal = this.savingsAccountDomainService.handleWithdrawal(fromSavingsAccount, fmt, + transactionDate, transactionAmount, paymentDetail, transactionBooleanValues, backdatedTxnsAllowedTill); + + final Long toLoanAccountId = command.longValueOfParameterNamed(toAccountIdParamName); + Loan toLoanAccount = this.loanAccountAssembler.assembleFrom(toLoanAccountId); + + final Boolean isHolidayValidationDone = false; + final HolidayDetailDTO holidayDetailDto = null; + final boolean isRecoveryRepayment = false; + final String chargeRefundChargeType = null; + + ExternalId externalId = externalIdFactory.create(); + final LoanTransaction loanRepaymentTransaction = this.loanAccountDomainService.makeRepayment(LoanTransactionType.REPAYMENT, + toLoanAccount, transactionDate, transactionAmount, paymentDetail, null, externalId, isRecoveryRepayment, + chargeRefundChargeType, isAccountTransfer, holidayDetailDto, isHolidayValidationDone); + toLoanAccount = loanRepaymentTransaction.getLoan(); + final AccountTransferDetails accountTransferDetails = this.accountTransferAssembler.assembleSavingsToLoanTransfer(command, + fromSavingsAccount, toLoanAccount, withdrawal, loanRepaymentTransaction); + this.accountTransferDetailRepository.saveAndFlush(accountTransferDetails); + transferDetailId = accountTransferDetails.getId(); + + } else if (isLoanToSavingsAccountTransfer(fromAccountType, toAccountType)) { + // FIXME - kw - ADD overpaid loan to savings account transfer + // support. + + fromLoanAccountId = command.longValueOfParameterNamed(fromAccountIdParamName); + final Loan fromLoanAccount = this.loanAccountAssembler.assembleFrom(fromLoanAccountId); + ExternalId externalId = externalIdFactory.create(); + final LoanTransaction loanRefundTransaction = this.loanAccountDomainService.makeRefund(fromLoanAccountId, + new CommandProcessingResultBuilder(), transactionDate, transactionAmount, paymentDetail, null, externalId); + + final Long toSavingsAccountId = command.longValueOfParameterNamed(toAccountIdParamName); + final SavingsAccount toSavingsAccount = this.savingsAccountAssembler.assembleFrom(toSavingsAccountId, backdatedTxnsAllowedTill); + + final SavingsAccountTransaction deposit = this.savingsAccountDomainService.handleDeposit(toSavingsAccount, fmt, transactionDate, + transactionAmount, paymentDetail, isAccountTransfer, isRegularTransaction, backdatedTxnsAllowedTill); + + final AccountTransferDetails accountTransferDetails = this.accountTransferAssembler.assembleLoanToSavingsTransfer(command, + fromLoanAccount, toSavingsAccount, deposit, loanRefundTransaction); + this.accountTransferDetailRepository.saveAndFlush(accountTransferDetails); + transferDetailId = accountTransferDetails.getId(); + } + + final CommandProcessingResultBuilder builder = new CommandProcessingResultBuilder().withEntityId(transferDetailId); + + if (fromAccountType.isSavingsAccount()) { + builder.withSavingsId(fromSavingsAccountId); + } + if (fromAccountType.isLoanAccount()) { + builder.withLoanId(fromLoanAccountId); + } + + return AccountTransferResponse.builder() + .savingsId(fromSavingsAccountId) + .loanId(fromLoanAccountId) + .resourceId(transferDetailId).build(); + } + + private boolean isLoanToSavingsAccountTransfer(final PortfolioAccountType fromAccountType, final PortfolioAccountType toAccountType) { + return fromAccountType == PortfolioAccountType.LOAN && toAccountType == PortfolioAccountType.SAVINGS; + } + + private boolean isSavingsToLoanAccountTransfer(final PortfolioAccountType fromAccountType, final PortfolioAccountType toAccountType) { + return fromAccountType == PortfolioAccountType.SAVINGS && toAccountType == PortfolioAccountType.LOAN; + } + + private boolean isSavingsToSavingsAccountTransfer(final PortfolioAccountType fromAccountType, + final PortfolioAccountType toAccountType) { + return fromAccountType == PortfolioAccountType.SAVINGS && toAccountType == PortfolioAccountType.SAVINGS; + } +} diff --git a/fineract-validation/src/main/resources/ValidationMessages.properties b/fineract-validation/src/main/resources/ValidationMessages.properties index d8d01b20a7f..568b665eadb 100644 --- a/fineract-validation/src/main/resources/ValidationMessages.properties +++ b/fineract-validation/src/main/resources/ValidationMessages.properties @@ -43,3 +43,103 @@ org.apache.fineract.cache.cache-type.not-null=The parameter 'cacheType' is manda org.apache.fineract.organisation.monetary.currencies.not-null=The parameter 'currencies' is mandatory. org.apache.fineract.organisation.monetary.currencies.not-empty=The parameter 'currencies' cannot be empty. + +# Account + +org.apache.fineract.portfolio.account.data.transfer.description.not.blank=The parameter \ + `transferDescription` is mandatory. + +org.apache.fineract.portfolio.account.data.transfer.description.size=The Maximum size of \ + the parameter `transferDescription` must not be more than {max} characters. + +org.apache.fineract.portfolio.account.data.to.office.id.not.blank=The parameter \ + `toOfficeId` is mandatory. + +org.apache.fineract.portfolio.account.data.to.account.type.not.blank=The parameter \ + `toAccountType` is mandatory. + +org.apache.fineract.portfolio.account.data.date.format.not.blank=The parameter \ + `dateFormat` is mandatory. + +org.apache.fineract.portfolio.account.data.transfer.amount.not.blank=The parameter \ + 'transferAmount' is mandatory. + +org.apache.fineract.portfolio.account.data.to.account.id.not.blank=The parameter `toAccountId` is\ + \ mandatory. + +org.apache.fineract.portfolio.account.data.from.client.id.not.blank=The parameter `fromClientId` \ + is mandatory. + +org.apache.fineract.portfolio.account.data.locale.not.blank=The parameter `locale` is mandatory. + +org.apache.fineract.portfolio.account.data.locale.size = The parameter `locale` size cannot \ + exceed 50 characters. + +org.apache.fineract.portfolio.account.data.transfer.date.not.blank=The parameter `transferDate` \ + is mandatory. + +org.apache.fineract.portfolio.account.data.from.account.type.not.blank=The parameter \ + `fromAccountType` is mandatory. + +org.apache.fineract.portfolio.account.data.to.client.id.not.blank=The parameter `toClientId` \ + is mandatory. + +org.apache.fineract.portfolio.account.data.from.account.id.not.blank=The parameter `fromAccountId` \ + is mandatory. + +org.apache.fineract.portfolio.account.data.from.office.id.not.blank=The parameter `fromOfficeId` \ + is mandatory. + +# Standing Instructions + +org.apache.fineract.portfolio.account.data.valid.till.not.blank=The parameter `validTill` is \ + mandatory. + +org.apache.fineract.portfolio.account.data.recurrence.on.month.not.blank=The parameter \ + `recurrenceOnMonthDay` is mandatory. + +org.apache.fineract.portfolio.account.data.valid.from.not.blank=The parameter `validFrom` is \ + mandatory. + +org.apache.fineract.portfolio.account.priority.not.blank=The parameter `priority` is mandatory. + +org.apache.fineract.portfolio.account.recurrence.type.not.blank=The parameter `recurrenceType` is\ + \ mandatory. + +org.apache.fineract.portfolio.account.from.account.type.not.blank=The parameter `fromAccountType`\ + \ is mandatory. + +org.apache.fineract.portfolio.account.recurrence.interval.not.blank=The parameter \ + `recurrenceInterval` is mandatory. + +org.apache.fineract.portfolio.account.month.day.format.not.blank=The parameter `monthDayFormat` \ + is mandatory. + +org.apache.fineract.portfolio.account.data.instruction.type.not.blank=The parameter \ + `instructionType` is mandatory. + +org.apache.fineract.portfolio.account.data.recurrence.frequency.not.blank=The parameter \ + `recurrenceFrequency` is mandatory. + +org.apache.fineract.portfolio.account.data.name.not.blank=The parameter `name` is mandatory. + +org.apache.fineract.portfolio.account.data.transfer.type.not.blank=The parameter `transferType` \ + is mandatory. + +org.apache.fineract.portfolio.account.data.status.not.blank=The parameter `status` is mandatory. + + +org.apache.fineract.portfolio.account.data.standing.instruction.id.notnull=The parameter \ + `standingInstructionId` is mandatory. + +org.apache.fineract.portfolio.account.data.standing.instruction.id.positiveOrZero=The parameter \ + `standingInstructionId` must be a positive number. + +org.apache.fineract.portfolio.account.standing.instruction.id.digits=The parameter `standingInstructionId`\ + \ digits must not exceed {integer} digits. + +org.apache.fineract.portfolio.account.standing.instruction.command.param.notblank=The parameter \ + `commandParam` is mandatory. + +org.apache.fineract.portfolio.account.command.param.pattern=The parameter `commandParam` can \ + either be `update` or `delete` without leading or trailing spaces.