This is an automated email from the ASF dual-hosted git repository.

arnold pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/fineract.git


The following commit(s) were added to refs/heads/develop by this push:
     new 81d9e4a96 FINERACT-1694: Extending MessageV1 and BulkMessageV1 with 
businessDate + fixing bulk event handling for publication + mapstruct mapper 
fixes to be more strict
81d9e4a96 is described below

commit 81d9e4a961e896ed7f7cfd00ee94be42cd7920be
Author: Arnold Galovics <[email protected]>
AuthorDate: Wed Oct 19 16:16:53 2022 +0200

    FINERACT-1694: Extending MessageV1 and BulkMessageV1 with businessDate + 
fixing bulk event handling for publication + mapstruct mapper fixes to be more 
strict
---
 .../src/main/avro/BulkMessageV1.avsc               | 42 ----------------------
 fineract-avro-schemas/src/main/avro/MessageV1.avsc |  5 +++
 .../fineract/cob/service/BusinessStepMapper.java   |  3 +-
 .../businessdate/mapper/BusinessDateMapper.java    |  5 +--
 .../config/MapstructMapperConfig.java}             |  4 +--
 .../event/business/domain/BulkBusinessEvent.java   |  2 +-
 .../service/BusinessEventNotifierServiceImpl.java  | 13 +++++--
 .../jobs/SendAsynchronousEventsTasklet.java        |  6 ++--
 .../service/ExternalEventsConfigurationMapper.java |  4 +--
 .../external/service/message/MessageFactory.java   | 36 ++++++++-----------
 .../domain/MessageBusinessDate.java}               | 20 +++++++----
 .../domain/MessageCreatedAt.java}                  | 20 +++++++----
 .../mapper/DelinquencyBucketMapper.java            |  6 ++--
 .../delinquency/mapper/DelinquencyRangeMapper.java |  8 ++---
 .../mapper/LoanDelinquencyTagMapper.java           |  7 ++--
 .../mapper/LoanTransactionRelationMapper.java      |  4 +--
 .../paymenttype/mapper/PaymentTypeMapper.java      | 10 ++----
 .../validator/BusinessDateValidatorTest.java       |  2 +-
 .../BusinessEventNotifierServiceImplTest.java      | 39 +++++++++++++++++++-
 .../jobs/SendAsynchronousEventsTaskletTest.java    | 24 ++++++-------
 20 files changed, 131 insertions(+), 129 deletions(-)

diff --git a/fineract-avro-schemas/src/main/avro/BulkMessageV1.avsc 
b/fineract-avro-schemas/src/main/avro/BulkMessageV1.avsc
deleted file mode 100644
index f8ed90813..000000000
--- a/fineract-avro-schemas/src/main/avro/BulkMessageV1.avsc
+++ /dev/null
@@ -1,42 +0,0 @@
-{
-    "name": "BulkMessageV1",
-    "namespace": "org.apache.fineract.avro",
-    "type": "record",
-    "fields": [
-        {
-            "name": "id",
-            "doc": "The ID of the message to be sent",
-            "type": "int"
-        },
-        {
-            "name": "source",
-            "doc": "A unique identifier of the source service",
-            "type": "string"
-        },
-        {
-            "name": "type",
-            "doc": "The type of event the payload refers to. For example 
LoanApprovedBusinessEvent",
-            "type": "string"
-        },
-        {
-            "name": "createdAt",
-            "doc": "The UTC time of when the event has been raised; in 
ISO_LOCAL_DATE_TIME format. For example 2011-12-03T10:15:30",
-            "type": "string"
-        },
-        {
-            "name": "tenantId",
-            "doc": "The tenantId that the event has been sent from. For 
example default",
-            "type": "string"
-        },
-        {
-            "name": "idempotencyKey",
-            "doc": "The idempotency key for this particular event for consumer 
de-duplication",
-            "type": "string"
-        },
-        {
-            "name": "data",
-            "doc": "The payload for this bulk message",
-            "type": "org.apache.fineract.avro.BulkMessagePayloadV1"
-        }
-    ]
-}
diff --git a/fineract-avro-schemas/src/main/avro/MessageV1.avsc 
b/fineract-avro-schemas/src/main/avro/MessageV1.avsc
index df7679820..7dfe5b2c3 100644
--- a/fineract-avro-schemas/src/main/avro/MessageV1.avsc
+++ b/fineract-avro-schemas/src/main/avro/MessageV1.avsc
@@ -28,6 +28,11 @@
             "doc": "The UTC time of when the event has been raised; in 
ISO_LOCAL_DATE_TIME format. For example 2011-12-03T10:15:30",
             "type": "string"
         },
+        {
+            "name": "businessDate",
+            "doc": "The business date when the event has been raised; in 
ISO_LOCAL_DATE format. For example 2011-12-03",
+            "type": "string"
+        },
         {
             "name": "tenantId",
             "doc": "The tenantId that the event has been sent from. For 
example default",
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/cob/service/BusinessStepMapper.java
 
b/fineract-provider/src/main/java/org/apache/fineract/cob/service/BusinessStepMapper.java
index 030c29e7e..56c6b8f7a 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/cob/service/BusinessStepMapper.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/cob/service/BusinessStepMapper.java
@@ -21,11 +21,12 @@ package org.apache.fineract.cob.service;
 import java.util.List;
 import org.apache.fineract.cob.data.BusinessStep;
 import org.apache.fineract.cob.domain.BatchBusinessStep;
+import org.apache.fineract.infrastructure.core.config.MapstructMapperConfig;
 import org.mapstruct.Mapper;
 import org.mapstruct.Mapping;
 import org.mapstruct.Mappings;
 
-@Mapper(componentModel = "spring")
+@Mapper(config = MapstructMapperConfig.class)
 public interface BusinessStepMapper {
 
     @Mappings({ @Mapping(target = "order", source = "source.stepOrder") })
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/businessdate/mapper/BusinessDateMapper.java
 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/businessdate/mapper/BusinessDateMapper.java
index fe07a4209..48f068566 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/businessdate/mapper/BusinessDateMapper.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/businessdate/mapper/BusinessDateMapper.java
@@ -21,14 +21,15 @@ package 
org.apache.fineract.infrastructure.businessdate.mapper;
 import java.util.List;
 import org.apache.fineract.infrastructure.businessdate.data.BusinessDateData;
 import org.apache.fineract.infrastructure.businessdate.domain.BusinessDate;
+import org.apache.fineract.infrastructure.core.config.MapstructMapperConfig;
 import org.mapstruct.Mapper;
 import org.mapstruct.Mapping;
 import org.mapstruct.Mappings;
 
-@Mapper(componentModel = "spring")
+@Mapper(config = MapstructMapperConfig.class)
 public interface BusinessDateMapper {
 
-    @Mappings({ @Mapping(target = "type", source = "source.type"), 
@Mapping(target = "date", source = "source.date") })
+    @Mappings({ @Mapping(target = "description", source = 
"source.type.description") })
     BusinessDateData map(BusinessDate source);
 
     List<BusinessDateData> map(List<BusinessDate> sources);
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/event/external/service/support/ExternalEventMapperConfig.java
 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/config/MapstructMapperConfig.java
similarity index 90%
copy from 
fineract-provider/src/main/java/org/apache/fineract/infrastructure/event/external/service/support/ExternalEventMapperConfig.java
copy to 
fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/config/MapstructMapperConfig.java
index 8d1894a19..653659c2d 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/event/external/service/support/ExternalEventMapperConfig.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/config/MapstructMapperConfig.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.fineract.infrastructure.event.external.service.support;
+package org.apache.fineract.infrastructure.core.config;
 
 import org.mapstruct.Builder;
 import org.mapstruct.MapperConfig;
@@ -24,4 +24,4 @@ import org.mapstruct.MappingConstants;
 import org.mapstruct.ReportingPolicy;
 
 @MapperConfig(componentModel = MappingConstants.ComponentModel.SPRING, 
unmappedTargetPolicy = ReportingPolicy.ERROR, builder = @Builder(disableBuilder 
= true))
-public class ExternalEventMapperConfig {}
+public class MapstructMapperConfig {}
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/event/business/domain/BulkBusinessEvent.java
 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/event/business/domain/BulkBusinessEvent.java
index 91e5839ea..32f842dc6 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/event/business/domain/BulkBusinessEvent.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/event/business/domain/BulkBusinessEvent.java
@@ -23,7 +23,7 @@ import java.util.List;
 public class BulkBusinessEvent extends 
AbstractBusinessEvent<List<BusinessEvent<?>>> {
 
     private static final String CATEGORY = "Bulk";
-    private static final String TYPE = "BulkBusinessEvent";
+    public static final String TYPE = "BulkBusinessEvent";
 
     public BulkBusinessEvent(List<BusinessEvent<?>> value) {
         super(value);
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/event/business/service/BusinessEventNotifierServiceImpl.java
 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/event/business/service/BusinessEventNotifierServiceImpl.java
index 10ac52aca..e1369b22f 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/event/business/service/BusinessEventNotifierServiceImpl.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/event/business/service/BusinessEventNotifierServiceImpl.java
@@ -139,8 +139,17 @@ public class BusinessEventNotifierServiceImpl implements 
BusinessEventNotifierSe
         try {
             List<BusinessEvent<?>> recordedBusinessEvents = 
recordedEvents.get();
             if (isExternalEventPostingEnabled()) {
-                log.debug("Posting the BulkBusinessEvent for the recorded {} 
events", recordedBusinessEvents.size());
-                externalEventService.postEvent(new 
BulkBusinessEvent(recordedBusinessEvents));
+                if (recordedBusinessEvents.isEmpty()) {
+                    log.debug("Not posting a BulkBusinessEvent since there 
were no events recorded");
+                } else {
+                    if (recordedBusinessEvents.size() == 1) {
+                        log.debug("Posting a singular event instead of a 
BulkBusinessEvent since there was only a single event recorded");
+                        
externalEventService.postEvent(recordedBusinessEvents.get(0));
+                    } else {
+                        log.debug("Posting the BulkBusinessEvent for the 
recorded {} events", recordedBusinessEvents.size());
+                        externalEventService.postEvent(new 
BulkBusinessEvent(recordedBusinessEvents));
+                    }
+                }
             }
         } finally {
             recordedEvents.remove();
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/event/external/jobs/SendAsynchronousEventsTasklet.java
 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/event/external/jobs/SendAsynchronousEventsTasklet.java
index 30492db6c..4209f0eb7 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/event/external/jobs/SendAsynchronousEventsTasklet.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/event/external/jobs/SendAsynchronousEventsTasklet.java
@@ -70,14 +70,14 @@ public class SendAsynchronousEventsTasklet implements 
Tasklet {
     private List<ExternalEvent> getQueuedEventsBatch() {
         int readBatchSize = getBatchSize();
         Pageable batchSize = PageRequest.ofSize(readBatchSize);
-        List<ExternalEvent> events = 
repository.findByStatusOrderById(ExternalEventStatus.TO_BE_SENT, batchSize);
-        return events;
+        return 
repository.findByStatusOrderById(ExternalEventStatus.TO_BE_SENT, batchSize);
     }
 
     private void processEvents(List<ExternalEvent> queuedEvents) throws 
IOException {
         for (ExternalEvent event : queuedEvents) {
             MessageV1 message = messageFactory.createMessage(event);
-            
eventProducer.sendEvent(byteBufferConverter.convert(message.toByteBuffer()));
+            byte[] byteMessage = 
byteBufferConverter.convert(message.toByteBuffer());
+            eventProducer.sendEvent(byteMessage);
             event.setStatus(ExternalEventStatus.SENT);
             event.setSentAt(DateUtils.getOffsetDateTimeOfTenant());
             repository.save(event);
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/event/external/service/ExternalEventsConfigurationMapper.java
 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/event/external/service/ExternalEventsConfigurationMapper.java
index 4214e5182..c6dd4b705 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/event/external/service/ExternalEventsConfigurationMapper.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/event/external/service/ExternalEventsConfigurationMapper.java
@@ -19,12 +19,12 @@
 package org.apache.fineract.infrastructure.event.external.service;
 
 import java.util.List;
+import org.apache.fineract.infrastructure.core.config.MapstructMapperConfig;
 import 
org.apache.fineract.infrastructure.event.external.data.ExternalEventConfigurationItemData;
 import 
org.apache.fineract.infrastructure.event.external.repository.domain.ExternalEventConfiguration;
-import 
org.apache.fineract.infrastructure.event.external.service.support.ExternalEventMapperConfig;
 import org.mapstruct.Mapper;
 
-@Mapper(config = ExternalEventMapperConfig.class)
+@Mapper(config = MapstructMapperConfig.class)
 public interface ExternalEventsConfigurationMapper {
 
     List<ExternalEventConfigurationItemData> 
map(List<ExternalEventConfiguration> source);
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/event/external/service/message/MessageFactory.java
 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/event/external/service/message/MessageFactory.java
index f1d492f29..2218cd458 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/event/external/service/message/MessageFactory.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/event/external/service/message/MessageFactory.java
@@ -18,19 +18,19 @@
  */
 package org.apache.fineract.infrastructure.event.external.service.message;
 
+import java.time.LocalDate;
 import java.time.OffsetDateTime;
 import java.time.ZoneOffset;
 import java.time.format.DateTimeFormatter;
 import java.util.UUID;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
-import org.apache.fineract.avro.BulkMessageV1;
 import org.apache.fineract.avro.MessageV1;
-import org.apache.fineract.infrastructure.core.service.DateUtils;
 import org.apache.fineract.infrastructure.core.service.ThreadLocalContextUtil;
 import 
org.apache.fineract.infrastructure.event.external.repository.domain.ExternalEvent;
-import 
org.apache.fineract.infrastructure.event.external.service.message.domain.BulkMessageData;
+import 
org.apache.fineract.infrastructure.event.external.service.message.domain.MessageBusinessDate;
 import 
org.apache.fineract.infrastructure.event.external.service.message.domain.MessageCategory;
+import 
org.apache.fineract.infrastructure.event.external.service.message.domain.MessageCreatedAt;
 import 
org.apache.fineract.infrastructure.event.external.service.message.domain.MessageData;
 import 
org.apache.fineract.infrastructure.event.external.service.message.domain.MessageDataSchema;
 import 
org.apache.fineract.infrastructure.event.external.service.message.domain.MessageId;
@@ -50,13 +50,15 @@ public class MessageFactory implements InitializingBean {
     private static final String SOURCE_UUID = UUID.randomUUID().toString();
 
     public MessageV1 createMessage(MessageId id, MessageSource source, 
MessageType type, MessageCategory category,
-            MessageIdempotencyKey idempotencyKey, MessageDataSchema 
dataSchema, MessageData data) {
+            MessageCreatedAt createdAt, MessageBusinessDate businessDate, 
MessageIdempotencyKey idempotencyKey,
+            MessageDataSchema dataSchema, MessageData data) {
         MessageV1 result = new MessageV1();
         result.setId(id.getId());
         result.setSource(source.getSource());
         result.setType(type.getType());
         result.setCategory(category.getCategory());
-        result.setCreatedAt(getMessageCreatedAt());
+        result.setCreatedAt(getMessageCreatedAt(createdAt.getCreatedAt()));
+        
result.setBusinessDate(getMessageBusinessDate(businessDate.getBusinessDate()));
         result.setTenantId(getTenantId());
         result.setIdempotencyKey(idempotencyKey.getIdempotencyKey());
         result.setDataschema(dataSchema.getDataSchema());
@@ -64,39 +66,31 @@ public class MessageFactory implements InitializingBean {
         return result;
     }
 
-    public BulkMessageV1 createBulkMessage(MessageId id, MessageSource source, 
MessageType type, BulkMessageData data) {
-
-        BulkMessageV1 result = new BulkMessageV1();
-        result.setId(id.getId());
-        result.setSource(source.getSource());
-        result.setType(type.getType());
-        result.setCreatedAt(getMessageCreatedAt());
-        result.setTenantId(getTenantId());
-        result.setData(data.getData());
-        return result;
-    }
-
     public MessageV1 createMessage(ExternalEvent event) {
         MessageId id = new MessageId(event.getId().intValue());
         MessageSource source = new MessageSource(SOURCE_UUID);
         MessageType type = new MessageType(event.getType());
         MessageCategory category = new MessageCategory(event.getCategory());
+        MessageCreatedAt createdAt = new 
MessageCreatedAt(event.getCreatedAt());
+        MessageBusinessDate businessDate = new 
MessageBusinessDate(event.getBusinessDate());
         MessageIdempotencyKey idempotencyKey = new 
MessageIdempotencyKey(event.getIdempotencyKey());
         MessageDataSchema dataSchema = new 
MessageDataSchema(event.getSchema());
         MessageData data = new 
MessageData(byteBufferConverter.convert(event.getData()));
-        MessageV1 message = createMessage(id, source, type, category, 
idempotencyKey, dataSchema, data);
-        return message;
+        return createMessage(id, source, type, category, createdAt, 
businessDate, idempotencyKey, dataSchema, data);
     }
 
     private String getTenantId() {
         return ThreadLocalContextUtil.getTenant().getTenantIdentifier();
     }
 
-    private String getMessageCreatedAt() {
-        OffsetDateTime createdAt = DateUtils.getOffsetDateTimeOfTenant();
+    private String getMessageCreatedAt(OffsetDateTime createdAt) {
         return 
createdAt.withOffsetSameInstant(ZoneOffset.UTC).toLocalDateTime().format(DateTimeFormatter.ISO_LOCAL_DATE_TIME);
     }
 
+    private String getMessageBusinessDate(LocalDate businessDate) {
+        return businessDate.format(DateTimeFormatter.ISO_LOCAL_DATE);
+    }
+
     @Override
     public void afterPropertiesSet() throws Exception {
         log.info("Message source set to {}", SOURCE_UUID);
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/event/external/service/support/ExternalEventMapperConfig.java
 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/event/external/service/message/domain/MessageBusinessDate.java
similarity index 70%
copy from 
fineract-provider/src/main/java/org/apache/fineract/infrastructure/event/external/service/support/ExternalEventMapperConfig.java
copy to 
fineract-provider/src/main/java/org/apache/fineract/infrastructure/event/external/service/message/domain/MessageBusinessDate.java
index 8d1894a19..9cfb8d316 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/event/external/service/support/ExternalEventMapperConfig.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/event/external/service/message/domain/MessageBusinessDate.java
@@ -16,12 +16,18 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.fineract.infrastructure.event.external.service.support;
+package 
org.apache.fineract.infrastructure.event.external.service.message.domain;
 
-import org.mapstruct.Builder;
-import org.mapstruct.MapperConfig;
-import org.mapstruct.MappingConstants;
-import org.mapstruct.ReportingPolicy;
+import java.time.LocalDate;
+import java.util.Objects;
+import lombok.Getter;
 
-@MapperConfig(componentModel = MappingConstants.ComponentModel.SPRING, 
unmappedTargetPolicy = ReportingPolicy.ERROR, builder = @Builder(disableBuilder 
= true))
-public class ExternalEventMapperConfig {}
+@Getter
+public class MessageBusinessDate {
+
+    private LocalDate businessDate;
+
+    public MessageBusinessDate(LocalDate businessDate) {
+        this.businessDate = Objects.requireNonNull(businessDate, "businessDate 
cannot be null");
+    }
+}
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/event/external/service/support/ExternalEventMapperConfig.java
 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/event/external/service/message/domain/MessageCreatedAt.java
similarity index 70%
rename from 
fineract-provider/src/main/java/org/apache/fineract/infrastructure/event/external/service/support/ExternalEventMapperConfig.java
rename to 
fineract-provider/src/main/java/org/apache/fineract/infrastructure/event/external/service/message/domain/MessageCreatedAt.java
index 8d1894a19..1387ee687 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/event/external/service/support/ExternalEventMapperConfig.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/event/external/service/message/domain/MessageCreatedAt.java
@@ -16,12 +16,18 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.fineract.infrastructure.event.external.service.support;
+package 
org.apache.fineract.infrastructure.event.external.service.message.domain;
 
-import org.mapstruct.Builder;
-import org.mapstruct.MapperConfig;
-import org.mapstruct.MappingConstants;
-import org.mapstruct.ReportingPolicy;
+import java.time.OffsetDateTime;
+import java.util.Objects;
+import lombok.Getter;
 
-@MapperConfig(componentModel = MappingConstants.ComponentModel.SPRING, 
unmappedTargetPolicy = ReportingPolicy.ERROR, builder = @Builder(disableBuilder 
= true))
-public class ExternalEventMapperConfig {}
+@Getter
+public class MessageCreatedAt {
+
+    private OffsetDateTime createdAt;
+
+    public MessageCreatedAt(OffsetDateTime createdAt) {
+        this.createdAt = Objects.requireNonNull(createdAt, "createdAt cannot 
be null");
+    }
+}
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/delinquency/mapper/DelinquencyBucketMapper.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/delinquency/mapper/DelinquencyBucketMapper.java
index cf306ff93..4b207c91a 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/delinquency/mapper/DelinquencyBucketMapper.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/delinquency/mapper/DelinquencyBucketMapper.java
@@ -19,16 +19,14 @@
 package org.apache.fineract.portfolio.delinquency.mapper;
 
 import java.util.List;
+import org.apache.fineract.infrastructure.core.config.MapstructMapperConfig;
 import org.apache.fineract.portfolio.delinquency.data.DelinquencyBucketData;
 import org.apache.fineract.portfolio.delinquency.domain.DelinquencyBucket;
 import org.mapstruct.Mapper;
-import org.mapstruct.Mapping;
-import org.mapstruct.Mappings;
 
-@Mapper(componentModel = "spring")
+@Mapper(config = MapstructMapperConfig.class)
 public interface DelinquencyBucketMapper {
 
-    @Mappings({ @Mapping(target = "id", source = "source.id"), @Mapping(target 
= "name", source = "source.name") })
     DelinquencyBucketData map(DelinquencyBucket source);
 
     List<DelinquencyBucketData> map(List<DelinquencyBucket> sources);
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/delinquency/mapper/DelinquencyRangeMapper.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/delinquency/mapper/DelinquencyRangeMapper.java
index 8717e9e3e..c7a772728 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/delinquency/mapper/DelinquencyRangeMapper.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/delinquency/mapper/DelinquencyRangeMapper.java
@@ -19,18 +19,14 @@
 package org.apache.fineract.portfolio.delinquency.mapper;
 
 import java.util.List;
+import org.apache.fineract.infrastructure.core.config.MapstructMapperConfig;
 import org.apache.fineract.portfolio.delinquency.data.DelinquencyRangeData;
 import org.apache.fineract.portfolio.delinquency.domain.DelinquencyRange;
 import org.mapstruct.Mapper;
-import org.mapstruct.Mapping;
-import org.mapstruct.Mappings;
 
-@Mapper(componentModel = "spring")
+@Mapper(config = MapstructMapperConfig.class)
 public interface DelinquencyRangeMapper {
 
-    @Mappings({ @Mapping(target = "id", source = "source.id"), @Mapping(target 
= "classification", source = "source.classification"),
-            @Mapping(target = "minimumAgeDays", source = 
"source.minimumAgeDays"),
-            @Mapping(target = "maximumAgeDays", source = 
"source.maximumAgeDays") })
     DelinquencyRangeData map(DelinquencyRange source);
 
     List<DelinquencyRangeData> map(List<DelinquencyRange> sources);
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/delinquency/mapper/LoanDelinquencyTagMapper.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/delinquency/mapper/LoanDelinquencyTagMapper.java
index f4fff90ce..c7c6b0f47 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/delinquency/mapper/LoanDelinquencyTagMapper.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/delinquency/mapper/LoanDelinquencyTagMapper.java
@@ -19,19 +19,16 @@
 package org.apache.fineract.portfolio.delinquency.mapper;
 
 import java.util.List;
+import org.apache.fineract.infrastructure.core.config.MapstructMapperConfig;
 import 
org.apache.fineract.portfolio.delinquency.data.LoanDelinquencyTagHistoryData;
 import 
org.apache.fineract.portfolio.delinquency.domain.LoanDelinquencyTagHistory;
 import org.mapstruct.Mapper;
 import org.mapstruct.Mapping;
 
-@Mapper(componentModel = "spring", uses = DelinquencyRangeMapper.class)
+@Mapper(config = MapstructMapperConfig.class, uses = 
DelinquencyRangeMapper.class)
 public interface LoanDelinquencyTagMapper {
 
-    @Mapping(target = "id", source = "source.id")
     @Mapping(target = "loanId", source = "source.loan.id")
-    @Mapping(target = "delinquencyRange", source = "source.delinquencyRange")
-    @Mapping(target = "addedOnDate", source = "source.addedOnDate")
-    @Mapping(target = "liftedOnDate", source = "source.liftedOnDate")
     LoanDelinquencyTagHistoryData map(LoanDelinquencyTagHistory source);
 
     List<LoanDelinquencyTagHistoryData> map(List<LoanDelinquencyTagHistory> 
sources);
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/mapper/LoanTransactionRelationMapper.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/mapper/LoanTransactionRelationMapper.java
index 37f524e50..7ff3f8ae1 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/mapper/LoanTransactionRelationMapper.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/mapper/LoanTransactionRelationMapper.java
@@ -19,17 +19,17 @@
 package org.apache.fineract.portfolio.loanaccount.mapper;
 
 import java.util.List;
+import org.apache.fineract.infrastructure.core.config.MapstructMapperConfig;
 import 
org.apache.fineract.portfolio.loanaccount.data.LoanTransactionRelationData;
 import 
org.apache.fineract.portfolio.loanaccount.domain.LoanTransactionRelation;
 import org.mapstruct.Mapper;
 import org.mapstruct.Mapping;
 
-@Mapper(componentModel = "spring")
+@Mapper(config = MapstructMapperConfig.class)
 public interface LoanTransactionRelationMapper {
 
     @Mapping(target = "fromLoanTransaction", source = 
"source.fromTransaction.id")
     @Mapping(target = "toLoanTransaction", source = "source.toTransaction.id")
-    @Mapping(target = "relationType", source = "source.relationType")
     @Mapping(target = "amount", source = "source.toTransaction.amount")
     @Mapping(target = "paymentType", source = 
"source.toTransaction.paymentDetail.paymentType.name")
     LoanTransactionRelationData map(LoanTransactionRelation source);
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/paymenttype/mapper/PaymentTypeMapper.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/paymenttype/mapper/PaymentTypeMapper.java
index af48e1336..7a42d5b18 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/paymenttype/mapper/PaymentTypeMapper.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/paymenttype/mapper/PaymentTypeMapper.java
@@ -19,20 +19,14 @@
 package org.apache.fineract.portfolio.paymenttype.mapper;
 
 import java.util.List;
+import org.apache.fineract.infrastructure.core.config.MapstructMapperConfig;
 import org.apache.fineract.portfolio.paymenttype.data.PaymentTypeData;
 import org.apache.fineract.portfolio.paymenttype.domain.PaymentType;
 import org.mapstruct.Mapper;
-import org.mapstruct.Mapping;
 
-@Mapper(componentModel = "spring")
+@Mapper(config = MapstructMapperConfig.class)
 public interface PaymentTypeMapper {
 
-    @Mapping(target = "id", source = "source.id")
-    @Mapping(target = "name", source = "source.name")
-    @Mapping(target = "description", source = "source.description")
-    @Mapping(target = "isCashPayment", source = "source.isCashPayment")
-    @Mapping(target = "codeName", source = "source.codeName")
-    @Mapping(target = "isSystemDefined", source = "source.isSystemDefined")
     PaymentTypeData map(PaymentType source);
 
     List<PaymentTypeData> map(List<PaymentType> sources);
diff --git 
a/fineract-provider/src/test/java/org/apache/fineract/infrastructure/businessdate/validator/BusinessDateValidatorTest.java
 
b/fineract-provider/src/test/java/org/apache/fineract/infrastructure/businessdate/validator/BusinessDateValidatorTest.java
index 206c85bdf..bd308c0d6 100644
--- 
a/fineract-provider/src/test/java/org/apache/fineract/infrastructure/businessdate/validator/BusinessDateValidatorTest.java
+++ 
b/fineract-provider/src/test/java/org/apache/fineract/infrastructure/businessdate/validator/BusinessDateValidatorTest.java
@@ -109,7 +109,7 @@ public class BusinessDateValidatorTest {
     }
 
     @Test
-    public void validateAndParseUpdateWithRighDate() {
+    public void validateAndParseUpdateWithRightDate() {
         String json = "{\"type\":\"COB_DATE\", 
\"locale\":\"hu\",\"dateFormat\":\"yyyy-MM-dd\",\"date\":\"2022-06-11\"}";
         JsonCommand command = JsonCommand.from(json);
         BusinessDateData result = 
businessDateDataParserAndValidator.validateAndParseUpdate(command);
diff --git 
a/fineract-provider/src/test/java/org/apache/fineract/infrastructure/event/business/service/BusinessEventNotifierServiceImplTest.java
 
b/fineract-provider/src/test/java/org/apache/fineract/infrastructure/event/business/service/BusinessEventNotifierServiceImplTest.java
index 6cf961ab4..81da91e2f 100644
--- 
a/fineract-provider/src/test/java/org/apache/fineract/infrastructure/event/business/service/BusinessEventNotifierServiceImplTest.java
+++ 
b/fineract-provider/src/test/java/org/apache/fineract/infrastructure/event/business/service/BusinessEventNotifierServiceImplTest.java
@@ -19,8 +19,10 @@
 package org.apache.fineract.infrastructure.event.business.service;
 
 import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.BDDMockito.given;
 import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.verifyNoInteractions;
 import static org.mockito.Mockito.when;
@@ -92,6 +94,37 @@ class BusinessEventNotifierServiceImplTest {
         verify(externalEventService).postEvent(event);
     }
 
+    @Test
+    public void 
testNotifyPostBusinessEventShouldNotPostAnythingWhenNoEventWasRaisedExternalEventWhenRecordingEnabled()
 {
+        // given
+        configureExternalEventsProperties(true);
+        
when(externalEventConfigurationRepository.findExternalEventConfigurationByTypeWithNotFoundDetection(Mockito.any()))
+                .thenReturn(new ExternalEventConfiguration("aType", true));
+        underTest.startExternalEventRecording();
+        // when
+        underTest.stopExternalEventRecording();
+        // then
+        verify(externalEventService, never()).postEvent(any());
+    }
+
+    @Test
+    public void 
testNotifyPostBusinessEventShouldNotifyPostListenersAndPostARegularExternalEventWhenRecordingEnabled()
 {
+        // given
+        configureExternalEventsProperties(true);
+        
when(externalEventConfigurationRepository.findExternalEventConfigurationByTypeWithNotFoundDetection(Mockito.any()))
+                .thenReturn(new ExternalEventConfiguration("aType", true));
+        MockBusinessEvent event = new MockBusinessEvent();
+        BusinessEventListener<MockBusinessEvent> postListener = mockListener();
+        underTest.addPostBusinessEventListener(MockBusinessEvent.class, 
postListener);
+        underTest.startExternalEventRecording();
+        underTest.notifyPostBusinessEvent(event);
+        // when
+        underTest.stopExternalEventRecording();
+        // then
+        verify(postListener).onBusinessEvent(event);
+        verify(externalEventService).postEvent(event);
+    }
+
     @Test
     public void 
testNotifyPostBusinessEventShouldNotifyPostListenersAndPostAnBulkExternalEventWhenRecordingEnabled()
 {
         // given
@@ -99,20 +132,24 @@ class BusinessEventNotifierServiceImplTest {
         
when(externalEventConfigurationRepository.findExternalEventConfigurationByTypeWithNotFoundDetection(Mockito.any()))
                 .thenReturn(new ExternalEventConfiguration("aType", true));
         MockBusinessEvent event = new MockBusinessEvent();
+        MockBusinessEvent event2 = new MockBusinessEvent();
         BusinessEventListener<MockBusinessEvent> postListener = mockListener();
         underTest.addPostBusinessEventListener(MockBusinessEvent.class, 
postListener);
         underTest.startExternalEventRecording();
         underTest.notifyPostBusinessEvent(event);
+        underTest.notifyPostBusinessEvent(event2);
         // when
         underTest.stopExternalEventRecording();
         // then
         verify(postListener).onBusinessEvent(event);
+        verify(postListener).onBusinessEvent(event2);
 
         ArgumentCaptor<BulkBusinessEvent> argumentCaptor = 
ArgumentCaptor.forClass(BulkBusinessEvent.class);
         verify(externalEventService).postEvent(argumentCaptor.capture());
         BulkBusinessEvent capturedEvent = argumentCaptor.getValue();
-        assertThat(capturedEvent.get()).hasSize(1);
+        assertThat(capturedEvent.get()).hasSize(2);
         assertThat(capturedEvent.get().get(0)).isEqualTo(event);
+        assertThat(capturedEvent.get().get(1)).isEqualTo(event2);
     }
 
     @Test
diff --git 
a/fineract-provider/src/test/java/org/apache/fineract/infrastructure/event/external/jobs/SendAsynchronousEventsTaskletTest.java
 
b/fineract-provider/src/test/java/org/apache/fineract/infrastructure/event/external/jobs/SendAsynchronousEventsTaskletTest.java
index 3db6b3497..42eb13510 100644
--- 
a/fineract-provider/src/test/java/org/apache/fineract/infrastructure/event/external/jobs/SendAsynchronousEventsTaskletTest.java
+++ 
b/fineract-provider/src/test/java/org/apache/fineract/infrastructure/event/external/jobs/SendAsynchronousEventsTaskletTest.java
@@ -102,11 +102,11 @@ class SendAsynchronousEventsTaskletTest {
     @Test
     public void givenBatchSize2WhenTaskExecutionThenSend2Events() throws 
Exception {
         // given
-        List<ExternalEvent> events = Arrays.asList(new ExternalEvent("aType", 
"aCategory", "aSchema", new byte[0], "aIdemtpotencyKey"),
-                new ExternalEvent("aType", "aCategory", "aSchema", new 
byte[0], "aIdemtpotencyKey"));
+        List<ExternalEvent> events = Arrays.asList(new ExternalEvent("aType", 
"aCategory", "aSchema", new byte[0], "aIdempotencyKey"),
+                new ExternalEvent("aType", "aCategory", "aSchema", new 
byte[0], "aIdempotencyKey"));
         // Dummy Message
-        MessageV1 dummyMessage = new MessageV1(1, "aSource", "aType", 
"nocategory", "aCreateDate", "aTennantId", "anidempotencyKey",
-                "aSchema", Mockito.mock(ByteBuffer.class));
+        MessageV1 dummyMessage = new MessageV1(1, "aSource", "aType", 
"nocategory", "aCreateDate", "aBusinessDate", "aTenantId",
+                "anidempotencyKey", "aSchema", Mockito.mock(ByteBuffer.class));
 
         when(repository.findByStatusOrderById(Mockito.any(), 
Mockito.any())).thenReturn(events);
         
when(messageFactory.createMessage(Mockito.any())).thenReturn(dummyMessage);
@@ -123,10 +123,10 @@ class SendAsynchronousEventsTaskletTest {
     @Test
     public void givenBatchSize2WhenEventSendFailsThenExecutionStops() throws 
Exception {
         // given
-        List<ExternalEvent> events = Arrays.asList(new ExternalEvent("aType", 
"aCategory", "aSchema", new byte[0], "aIdemtpotencyKey"),
-                new ExternalEvent("aType", "aCategory", "aSchema", new 
byte[0], "aIdemtpotencyKey"));
-        MessageV1 dummyMessage = new MessageV1(1, "aSource", "aType", 
"nocategory", "aCreateDate", "aTennantId", "anidempotencyKey",
-                "aSchema", Mockito.mock(ByteBuffer.class));
+        List<ExternalEvent> events = Arrays.asList(new ExternalEvent("aType", 
"aCategory", "aSchema", new byte[0], "aIdempotencyKey"),
+                new ExternalEvent("aType", "aCategory", "aSchema", new 
byte[0], "aIdempotencyKey"));
+        MessageV1 dummyMessage = new MessageV1(1, "aSource", "aType", 
"nocategory", "aCreateDate", "aBusinessDate", "aTenantId",
+                "anidempotencyKey", "aSchema", Mockito.mock(ByteBuffer.class));
         when(repository.findByStatusOrderById(Mockito.any(), 
Mockito.any())).thenReturn(events);
         
when(messageFactory.createMessage(Mockito.any())).thenReturn(dummyMessage);
         
when(byteBufferConverter.convert(Mockito.any(ByteBuffer.class))).thenReturn(new 
byte[0]);
@@ -143,9 +143,9 @@ class SendAsynchronousEventsTaskletTest {
     public void givenOneEventWhenEventSentThenEventStatusUpdates() throws 
Exception {
         // given
         ArgumentCaptor<ExternalEvent> externalEventArgumentCaptor = 
ArgumentCaptor.forClass(ExternalEvent.class);
-        List<ExternalEvent> events = Arrays.asList(new ExternalEvent("aType", 
"aCategory", "aSchema", new byte[0], "aIdemtpotencyKey"));
-        MessageV1 dummyMessage = new MessageV1(1, "aSource", "aType", 
"nocategory", "aCreateDate", "aTennantId", "anidempotencyKey",
-                "aSchema", Mockito.mock(ByteBuffer.class));
+        List<ExternalEvent> events = Arrays.asList(new ExternalEvent("aType", 
"aCategory", "aSchema", new byte[0], "aIdempotencyKey"));
+        MessageV1 dummyMessage = new MessageV1(1, "aSource", "aType", 
"nocategory", "aCreateDate", "aBusinessDate", "aTenantId",
+                "anidempotencyKey", "aSchema", Mockito.mock(ByteBuffer.class));
         when(repository.findByStatusOrderById(Mockito.any(), 
Mockito.any())).thenReturn(events);
         
when(messageFactory.createMessage(Mockito.any())).thenReturn(dummyMessage);
         
when(byteBufferConverter.convert(Mockito.any(ByteBuffer.class))).thenReturn(new 
byte[0]);
@@ -153,10 +153,10 @@ class SendAsynchronousEventsTaskletTest {
         // when
         resultStatus = this.underTest.execute(stepContribution, chunkContext);
         // then
+        verify(messageFactory).createMessage(Mockito.any());
         verify(repository).save(externalEventArgumentCaptor.capture());
         ExternalEvent externalEvent = externalEventArgumentCaptor.getValue();
         
assertThat(externalEvent.getStatus()).isEqualTo(ExternalEventStatus.SENT);
         assertEquals(RepeatStatus.FINISHED, resultStatus);
     }
-
 }


Reply via email to