From 4f3cfeef25c451c8755a302f10ad504c0c45ab16 Mon Sep 17 00:00:00 2001 From: saba_zedginidze Date: Thu, 12 Dec 2024 18:48:07 +0400 Subject: [PATCH 01/17] [MODEXPW-529] Rename and restructure converters and mapper --- .../config/EdifactPurchaseOrderConfig.java | 11 ++++++----- .../edifact/jobs/MapToEdifactClaimsTasklet.java | 12 ++++++------ .../edifact/jobs/MapToEdifactOrdersTasklet.java | 12 ++++++------ .../edifact/jobs/MapToEdifactTasklet.java | 12 ++++++------ .../EdifactMapper.java} | 13 +++++-------- .../edifact/mapper/ExportResourceMapper.java | 16 ++++++++++++++++ .../converter}/CompositePOConverter.java | 2 +- .../converter}/CompositePOLineConverter.java | 2 +- ...difactExportHolder.java => ExportHolder.java} | 2 +- .../edifact/MappingOrdersToEdifactTest.java | 15 +++++++++------ .../jobs/MapToEdifactClaimsTaskletTest.java | 2 +- .../jobs/MapToEdifactOrderTaskletTest.java | 6 +++--- .../jobs/MapToEdifactTaskletAbstractTest.java | 4 ++-- 13 files changed, 63 insertions(+), 46 deletions(-) rename src/main/java/org/folio/dew/batch/acquisitions/edifact/{PurchaseOrdersToEdifactMapper.java => mapper/EdifactMapper.java} (86%) create mode 100644 src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/ExportResourceMapper.java rename src/main/java/org/folio/dew/batch/acquisitions/edifact/{ => mapper/converter}/CompositePOConverter.java (99%) rename src/main/java/org/folio/dew/batch/acquisitions/edifact/{ => mapper/converter}/CompositePOLineConverter.java (99%) rename src/main/java/org/folio/dew/domain/dto/acquisitions/edifact/{EdifactExportHolder.java => ExportHolder.java} (65%) diff --git a/src/main/java/org/folio/dew/batch/acquisitions/edifact/config/EdifactPurchaseOrderConfig.java b/src/main/java/org/folio/dew/batch/acquisitions/edifact/config/EdifactPurchaseOrderConfig.java index f7dbbf7c..300c0b82 100644 --- a/src/main/java/org/folio/dew/batch/acquisitions/edifact/config/EdifactPurchaseOrderConfig.java +++ b/src/main/java/org/folio/dew/batch/acquisitions/edifact/config/EdifactPurchaseOrderConfig.java @@ -1,8 +1,9 @@ package org.folio.dew.batch.acquisitions.edifact.config; -import org.folio.dew.batch.acquisitions.edifact.CompositePOConverter; -import org.folio.dew.batch.acquisitions.edifact.CompositePOLineConverter; -import org.folio.dew.batch.acquisitions.edifact.PurchaseOrdersToEdifactMapper; +import org.folio.dew.batch.acquisitions.edifact.mapper.ExportResourceMapper; +import org.folio.dew.batch.acquisitions.edifact.mapper.converter.CompositePOConverter; +import org.folio.dew.batch.acquisitions.edifact.mapper.converter.CompositePOLineConverter; +import org.folio.dew.batch.acquisitions.edifact.mapper.EdifactMapper; import org.folio.dew.batch.acquisitions.edifact.services.ConfigurationService; import org.folio.dew.batch.acquisitions.edifact.services.ExpenseClassService; import org.folio.dew.batch.acquisitions.edifact.services.HoldingService; @@ -28,7 +29,7 @@ CompositePOConverter compositePurchaseOrderConverter(CompositePOLineConverter co } @Bean - PurchaseOrdersToEdifactMapper mappingOrdersToEdifact(CompositePOConverter compositePOConverter) { - return new PurchaseOrdersToEdifactMapper(compositePOConverter); + ExportResourceMapper mappingOrdersToEdifact(CompositePOConverter compositePOConverter) { + return new EdifactMapper(compositePOConverter); } } diff --git a/src/main/java/org/folio/dew/batch/acquisitions/edifact/jobs/MapToEdifactClaimsTasklet.java b/src/main/java/org/folio/dew/batch/acquisitions/edifact/jobs/MapToEdifactClaimsTasklet.java index a45ffa5f..47f5eeb7 100644 --- a/src/main/java/org/folio/dew/batch/acquisitions/edifact/jobs/MapToEdifactClaimsTasklet.java +++ b/src/main/java/org/folio/dew/batch/acquisitions/edifact/jobs/MapToEdifactClaimsTasklet.java @@ -6,11 +6,11 @@ import java.util.Map; import org.apache.commons.collections4.CollectionUtils; -import org.folio.dew.batch.acquisitions.edifact.PurchaseOrdersToEdifactMapper; +import org.folio.dew.batch.acquisitions.edifact.mapper.EdifactMapper; import org.folio.dew.batch.acquisitions.edifact.services.OrdersService; import org.folio.dew.domain.dto.Piece; import org.folio.dew.domain.dto.VendorEdiOrdersExportConfig; -import org.folio.dew.domain.dto.acquisitions.edifact.EdifactExportHolder; +import org.folio.dew.domain.dto.acquisitions.edifact.ExportHolder; import org.folio.dew.error.NotFoundException; import org.springframework.batch.core.configuration.annotation.StepScope; import org.springframework.batch.core.scope.context.ChunkContext; @@ -25,8 +25,8 @@ public class MapToEdifactClaimsTasklet extends MapToEdifactTasklet { public static final String CLAIM_PIECE_IDS = "claimPieceIds"; public MapToEdifactClaimsTasklet(ObjectMapper ediObjectMapper, OrdersService ordersService, - PurchaseOrdersToEdifactMapper purchaseOrdersToEdifactMapper) { - super(ediObjectMapper, ordersService, purchaseOrdersToEdifactMapper); + EdifactMapper edifactMapper) { + super(ediObjectMapper, ordersService, edifactMapper); } protected List getExportConfigMissingFields(VendorEdiOrdersExportConfig ediOrdersExportConfig) { @@ -36,7 +36,7 @@ protected List getExportConfigMissingFields(VendorEdiOrdersExportConfig } @Override - protected EdifactExportHolder buildEdifactExportHolder(ChunkContext chunkContext, VendorEdiOrdersExportConfig ediExportConfig, Map jobParameters) { + protected ExportHolder buildEdifactExportHolder(ChunkContext chunkContext, VendorEdiOrdersExportConfig ediExportConfig, Map jobParameters) { var pieces = ordersService.getPiecesByIdsAndReceivingStatus(ediExportConfig.getClaimPieceIds(), Piece.ReceivingStatusEnum.LATE); if (pieces.isEmpty()) { throw new NotFoundException(Piece.class); @@ -44,7 +44,7 @@ protected EdifactExportHolder buildEdifactExportHolder(ChunkContext chunkContext var poLineQuery = convertIdsToCqlQuery(pieces.stream().map(Piece::getPoLineId).toList()); var compOrders = getCompositeOrders(poLineQuery); - return new EdifactExportHolder(compOrders, pieces); + return new ExportHolder(compOrders, pieces); } } diff --git a/src/main/java/org/folio/dew/batch/acquisitions/edifact/jobs/MapToEdifactOrdersTasklet.java b/src/main/java/org/folio/dew/batch/acquisitions/edifact/jobs/MapToEdifactOrdersTasklet.java index f78df6a0..90e2c29c 100644 --- a/src/main/java/org/folio/dew/batch/acquisitions/edifact/jobs/MapToEdifactOrdersTasklet.java +++ b/src/main/java/org/folio/dew/batch/acquisitions/edifact/jobs/MapToEdifactOrdersTasklet.java @@ -13,13 +13,13 @@ import java.util.stream.Collectors; import org.apache.commons.collections4.CollectionUtils; -import org.folio.dew.batch.acquisitions.edifact.PurchaseOrdersToEdifactMapper; +import org.folio.dew.batch.acquisitions.edifact.mapper.EdifactMapper; import org.folio.dew.batch.acquisitions.edifact.services.OrdersService; import org.folio.dew.client.DataExportSpringClient; import org.folio.dew.domain.dto.ExportConfigCollection; import org.folio.dew.domain.dto.ExportType; import org.folio.dew.domain.dto.VendorEdiOrdersExportConfig; -import org.folio.dew.domain.dto.acquisitions.edifact.EdifactExportHolder; +import org.folio.dew.domain.dto.acquisitions.edifact.ExportHolder; import org.springframework.batch.core.configuration.annotation.StepScope; import org.springframework.batch.core.scope.context.ChunkContext; import org.springframework.stereotype.Component; @@ -37,8 +37,8 @@ public class MapToEdifactOrdersTasklet extends MapToEdifactTasklet { public MapToEdifactOrdersTasklet(ObjectMapper ediObjectMapper, OrdersService ordersService, DataExportSpringClient dataExportSpringClient, - PurchaseOrdersToEdifactMapper purchaseOrdersToEdifactMapper) { - super(ediObjectMapper, ordersService, purchaseOrdersToEdifactMapper); + EdifactMapper edifactMapper) { + super(ediObjectMapper, ordersService, edifactMapper); this.dataExportSpringClient = dataExportSpringClient; } @@ -47,10 +47,10 @@ protected List getExportConfigMissingFields(VendorEdiOrdersExportConfig } @Override - protected EdifactExportHolder buildEdifactExportHolder(ChunkContext chunkContext, VendorEdiOrdersExportConfig ediExportConfig, Map jobParameters) { + protected ExportHolder buildEdifactExportHolder(ChunkContext chunkContext, VendorEdiOrdersExportConfig ediExportConfig, Map jobParameters) { var poLineQuery = getPoLineQuery(ediExportConfig); var compOrders = getCompositeOrders(poLineQuery); - return new EdifactExportHolder(compOrders, List.of()); + return new ExportHolder(compOrders, List.of()); } protected String getPoLineQuery(VendorEdiOrdersExportConfig ediConfig) { diff --git a/src/main/java/org/folio/dew/batch/acquisitions/edifact/jobs/MapToEdifactTasklet.java b/src/main/java/org/folio/dew/batch/acquisitions/edifact/jobs/MapToEdifactTasklet.java index d5fcd6b1..3b47edf2 100644 --- a/src/main/java/org/folio/dew/batch/acquisitions/edifact/jobs/MapToEdifactTasklet.java +++ b/src/main/java/org/folio/dew/batch/acquisitions/edifact/jobs/MapToEdifactTasklet.java @@ -11,7 +11,7 @@ import org.apache.commons.lang3.StringUtils; import org.folio.dew.batch.ExecutionContextUtils; -import org.folio.dew.batch.acquisitions.edifact.PurchaseOrdersToEdifactMapper; +import org.folio.dew.batch.acquisitions.edifact.mapper.EdifactMapper; import org.folio.dew.batch.acquisitions.edifact.exceptions.CompositeOrderMappingException; import org.folio.dew.batch.acquisitions.edifact.exceptions.EdifactException; import org.folio.dew.batch.acquisitions.edifact.services.OrdersService; @@ -21,7 +21,7 @@ import org.folio.dew.domain.dto.PoLine; import org.folio.dew.domain.dto.PurchaseOrder; import org.folio.dew.domain.dto.VendorEdiOrdersExportConfig; -import org.folio.dew.domain.dto.acquisitions.edifact.EdifactExportHolder; +import org.folio.dew.domain.dto.acquisitions.edifact.ExportHolder; import org.folio.dew.error.NotFoundException; import org.springframework.batch.core.StepContribution; import org.springframework.batch.core.scope.context.ChunkContext; @@ -41,7 +41,7 @@ public abstract class MapToEdifactTasklet implements Tasklet { private final ObjectMapper ediObjectMapper; protected final OrdersService ordersService; - private final PurchaseOrdersToEdifactMapper purchaseOrdersToEdifactMapper; + private final EdifactMapper edifactMapper; @Override public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception { @@ -54,7 +54,7 @@ public RepeatStatus execute(StepContribution contribution, ChunkContext chunkCon persistPoLineIds(chunkContext, holder.orders()); String jobName = jobParameters.get(JobParameterNames.JOB_NAME).toString(); - var edifactStringResult = purchaseOrdersToEdifactMapper.convertOrdersToEdifact(holder.orders(), holder.pieces(), ediExportConfig, jobName); + var edifactStringResult = edifactMapper.convertForExport(holder.orders(), holder.pieces(), ediExportConfig, jobName); // save edifact file content in memory ExecutionContextUtils.addToJobExecutionContext(chunkContext.getStepContext().getStepExecution(), "edifactOrderAsString", edifactStringResult, ""); @@ -124,7 +124,7 @@ private T convertTo(Object value, Class c) { protected abstract List getExportConfigMissingFields(VendorEdiOrdersExportConfig ediOrdersExportConfig); - protected abstract EdifactExportHolder buildEdifactExportHolder(ChunkContext chunkContext, VendorEdiOrdersExportConfig ediExportConfig, - Map jobParameters) throws JsonProcessingException, EDIStreamException; + protected abstract ExportHolder buildEdifactExportHolder(ChunkContext chunkContext, VendorEdiOrdersExportConfig ediExportConfig, + Map jobParameters) throws JsonProcessingException, EDIStreamException; } diff --git a/src/main/java/org/folio/dew/batch/acquisitions/edifact/PurchaseOrdersToEdifactMapper.java b/src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/EdifactMapper.java similarity index 86% rename from src/main/java/org/folio/dew/batch/acquisitions/edifact/PurchaseOrdersToEdifactMapper.java rename to src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/EdifactMapper.java index 3d4443cd..72c3cff0 100644 --- a/src/main/java/org/folio/dew/batch/acquisitions/edifact/PurchaseOrdersToEdifactMapper.java +++ b/src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/EdifactMapper.java @@ -1,4 +1,4 @@ -package org.folio.dew.batch.acquisitions.edifact; +package org.folio.dew.batch.acquisitions.edifact.mapper; import static java.util.stream.Collectors.groupingBy; @@ -8,6 +8,7 @@ import java.util.List; import org.apache.commons.lang3.StringUtils; +import org.folio.dew.batch.acquisitions.edifact.mapper.converter.CompositePOConverter; import org.folio.dew.domain.dto.CompositePurchaseOrder; import io.xlate.edi.stream.EDIOutputFactory; @@ -18,18 +19,14 @@ import org.folio.dew.domain.dto.VendorEdiOrdersExportConfig; import org.folio.dew.domain.dto.acquisitions.edifact.EdiFileConfig; -public class PurchaseOrdersToEdifactMapper { +public class EdifactMapper implements ExportResourceMapper { private final CompositePOConverter compositePOConverter; - public PurchaseOrdersToEdifactMapper(CompositePOConverter compositePOConverter) { + public EdifactMapper(CompositePOConverter compositePOConverter) { this.compositePOConverter = compositePOConverter; } - public String convertOrdersToEdifact(List compPOs, VendorEdiOrdersExportConfig ediExportConfig, String jobName) throws EDIStreamException { - return convertOrdersToEdifact(compPOs, List.of(), ediExportConfig, jobName); - } - - public String convertOrdersToEdifact(List compPOs, List pieces, VendorEdiOrdersExportConfig ediExportConfig, String jobName) throws EDIStreamException { + public String convertForExport(List compPOs, List pieces, VendorEdiOrdersExportConfig ediExportConfig, String jobName) throws EDIStreamException { ByteArrayOutputStream stream = new ByteArrayOutputStream(); EDIOutputFactory factory = EDIOutputFactory.newFactory(); diff --git a/src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/ExportResourceMapper.java b/src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/ExportResourceMapper.java new file mode 100644 index 00000000..3cc4397b --- /dev/null +++ b/src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/ExportResourceMapper.java @@ -0,0 +1,16 @@ +package org.folio.dew.batch.acquisitions.edifact.mapper; + +import java.util.List; + +import org.folio.dew.domain.dto.CompositePurchaseOrder; +import org.folio.dew.domain.dto.Piece; +import org.folio.dew.domain.dto.VendorEdiOrdersExportConfig; + +import io.xlate.edi.stream.EDIStreamException; + +public interface ExportResourceMapper { + + String convertForExport(List compPOs, List pieces, + VendorEdiOrdersExportConfig ediExportConfig, String jobName) throws EDIStreamException; + +} diff --git a/src/main/java/org/folio/dew/batch/acquisitions/edifact/CompositePOConverter.java b/src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/converter/CompositePOConverter.java similarity index 99% rename from src/main/java/org/folio/dew/batch/acquisitions/edifact/CompositePOConverter.java rename to src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/converter/CompositePOConverter.java index 0b7e8b92..7253cd46 100644 --- a/src/main/java/org/folio/dew/batch/acquisitions/edifact/CompositePOConverter.java +++ b/src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/converter/CompositePOConverter.java @@ -1,4 +1,4 @@ -package org.folio.dew.batch.acquisitions.edifact; +package org.folio.dew.batch.acquisitions.edifact.mapper.converter; import io.xlate.edi.stream.EDIStreamException; import io.xlate.edi.stream.EDIStreamWriter; diff --git a/src/main/java/org/folio/dew/batch/acquisitions/edifact/CompositePOLineConverter.java b/src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/converter/CompositePOLineConverter.java similarity index 99% rename from src/main/java/org/folio/dew/batch/acquisitions/edifact/CompositePOLineConverter.java rename to src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/converter/CompositePOLineConverter.java index cb09bac3..49a953c5 100644 --- a/src/main/java/org/folio/dew/batch/acquisitions/edifact/CompositePOLineConverter.java +++ b/src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/converter/CompositePOLineConverter.java @@ -1,4 +1,4 @@ -package org.folio.dew.batch.acquisitions.edifact; +package org.folio.dew.batch.acquisitions.edifact.mapper.converter; import static org.folio.dew.domain.dto.ReferenceNumberItem.RefNumberTypeEnum.ORDER_REFERENCE_NUMBER; diff --git a/src/main/java/org/folio/dew/domain/dto/acquisitions/edifact/EdifactExportHolder.java b/src/main/java/org/folio/dew/domain/dto/acquisitions/edifact/ExportHolder.java similarity index 65% rename from src/main/java/org/folio/dew/domain/dto/acquisitions/edifact/EdifactExportHolder.java rename to src/main/java/org/folio/dew/domain/dto/acquisitions/edifact/ExportHolder.java index 8108aed5..6fc6b79e 100644 --- a/src/main/java/org/folio/dew/domain/dto/acquisitions/edifact/EdifactExportHolder.java +++ b/src/main/java/org/folio/dew/domain/dto/acquisitions/edifact/ExportHolder.java @@ -5,6 +5,6 @@ import org.folio.dew.domain.dto.CompositePurchaseOrder; import org.folio.dew.domain.dto.Piece; -public record EdifactExportHolder(List orders, List pieces) { +public record ExportHolder(List orders, List pieces) { } diff --git a/src/test/java/org/folio/dew/batch/acquisitions/edifact/MappingOrdersToEdifactTest.java b/src/test/java/org/folio/dew/batch/acquisitions/edifact/MappingOrdersToEdifactTest.java index 2d92ef9e..c815d8f0 100644 --- a/src/test/java/org/folio/dew/batch/acquisitions/edifact/MappingOrdersToEdifactTest.java +++ b/src/test/java/org/folio/dew/batch/acquisitions/edifact/MappingOrdersToEdifactTest.java @@ -22,6 +22,9 @@ import java.util.stream.Stream; import lombok.extern.log4j.Log4j2; import org.apache.commons.io.IOUtils; +import org.folio.dew.batch.acquisitions.edifact.mapper.converter.CompositePOConverter; +import org.folio.dew.batch.acquisitions.edifact.mapper.converter.CompositePOLineConverter; +import org.folio.dew.batch.acquisitions.edifact.mapper.EdifactMapper; import org.folio.dew.batch.acquisitions.edifact.services.ConfigurationService; import org.folio.dew.batch.acquisitions.edifact.services.ExpenseClassService; import org.folio.dew.batch.acquisitions.edifact.services.HoldingService; @@ -52,7 +55,7 @@ class MappingOrdersToEdifactTest { ); private ObjectMapper objectMapper; - private PurchaseOrdersToEdifactMapper purchaseOrdersToEdifactMapper; + private EdifactMapper edifactMapper; @Mock private IdentifierTypeService identifierTypeService; @@ -71,7 +74,7 @@ class MappingOrdersToEdifactTest { void setUp() { var compositePOLineConverter = new CompositePOLineConverter(identifierTypeService, materialTypeService, expenseClassService, locationService, holdingService); var compositePOConverter = new CompositePOConverter(compositePOLineConverter, configurationService); - purchaseOrdersToEdifactMapper = new PurchaseOrdersToEdifactMapper(compositePOConverter); + edifactMapper = new EdifactMapper(compositePOConverter); objectMapper = new JacksonConfiguration().objectMapper(); } @@ -87,14 +90,14 @@ void convertOrdersToEdifact(ExportType type) throws Exception { String ediOrder; if (type == EDIFACT_ORDERS_EXPORT) { - ediOrder = purchaseOrdersToEdifactMapper.convertOrdersToEdifact(compPOs, getTestEdiConfig(), jobName); + ediOrder = edifactMapper.convertForExport(compPOs, List.of(), getTestEdiConfig(), jobName); } else { var piecePoLineIds = pieces.stream().map(Piece::getPoLineId).toList(); compPOs = compPOs.stream() .peek(po -> po.getCompositePoLines().stream().filter(line -> piecePoLineIds.contains(line.getId())).toList()) .filter(po -> !po.getCompositePoLines().isEmpty()) .toList(); - ediOrder = purchaseOrdersToEdifactMapper.convertOrdersToEdifact(compPOs, pieces, getTestEdiConfig(), jobName); + ediOrder = edifactMapper.convertForExport(compPOs, pieces, getTestEdiConfig(), jobName); } assertFalse(ediOrder.isEmpty()); @@ -112,9 +115,9 @@ void convertOrdersToEdifactByteArray(ExportType type) throws Exception { byte[] ediOrder; if (type == EDIFACT_ORDERS_EXPORT) { - ediOrder = purchaseOrdersToEdifactMapper.convertOrdersToEdifact(compPOs, getTestEdiConfig(), jobName).getBytes(StandardCharsets.UTF_8); + ediOrder = edifactMapper.convertForExport(compPOs, List.of(), getTestEdiConfig(), jobName).getBytes(StandardCharsets.UTF_8); } else { - ediOrder = purchaseOrdersToEdifactMapper.convertOrdersToEdifact(compPOs, pieces, getTestEdiConfig(), jobName).getBytes(StandardCharsets.UTF_8); + ediOrder = edifactMapper.convertForExport(compPOs, pieces, getTestEdiConfig(), jobName).getBytes(StandardCharsets.UTF_8); } assertNotNull(ediOrder); diff --git a/src/test/java/org/folio/dew/batch/acquisitions/edifact/jobs/MapToEdifactClaimsTaskletTest.java b/src/test/java/org/folio/dew/batch/acquisitions/edifact/jobs/MapToEdifactClaimsTaskletTest.java index 5f05296c..7fcc88db 100644 --- a/src/test/java/org/folio/dew/batch/acquisitions/edifact/jobs/MapToEdifactClaimsTaskletTest.java +++ b/src/test/java/org/folio/dew/batch/acquisitions/edifact/jobs/MapToEdifactClaimsTaskletTest.java @@ -66,7 +66,7 @@ void testEdifactClaimsExport() throws Exception { doReturn(poLines).when(ordersService).getPoLinesByQuery(poLineQuery); doReturn(orders).when(ordersService).getPurchaseOrdersByIds(anyList()); - doReturn("test1").when(purchaseOrdersToEdifactMapper).convertOrdersToEdifact(any(), any(), anyString()); + doReturn("test1").when(edifactMapper).convertForExport(any(), any(), any(), anyString()); var exportConfig = getEdifactExportConfig(SAMPLE_EDI_ORDERS_EXPORT, pieceIds); JobExecution jobExecution = testLauncher.launchStep(MAP_TO_EDIFACT_STEP, getJobParameters(exportConfig)); diff --git a/src/test/java/org/folio/dew/batch/acquisitions/edifact/jobs/MapToEdifactOrderTaskletTest.java b/src/test/java/org/folio/dew/batch/acquisitions/edifact/jobs/MapToEdifactOrderTaskletTest.java index cbd9b14b..34b39d13 100644 --- a/src/test/java/org/folio/dew/batch/acquisitions/edifact/jobs/MapToEdifactOrderTaskletTest.java +++ b/src/test/java/org/folio/dew/batch/acquisitions/edifact/jobs/MapToEdifactOrderTaskletTest.java @@ -61,7 +61,7 @@ void testEdifactOrdersExport() throws Exception { " AND (vendorDetail.vendorAccount==(\"BRXXXXX-01\"))"; doReturn(poLines).when(ordersService).getPoLinesByQuery(cqlString); doReturn(orders).when(ordersService).getPurchaseOrdersByIds(anyList()); - doReturn("test1").when(purchaseOrdersToEdifactMapper).convertOrdersToEdifact(any(), any(), anyString()); + doReturn("test1").when(edifactMapper).convertForExport(any(), any(), any(), anyString()); JobExecution jobExecution = testLauncher.launchStep(MAP_TO_EDIFACT_STEP, getJobParameters(getEdifactExportConfig(SAMPLE_EDI_ORDERS_EXPORT))); @@ -86,7 +86,7 @@ void testEdifactOrdersExportDefaultConfig() throws Exception { doReturn(poLines).when(ordersService).getPoLinesByQuery(cqlString); doReturn(exportConfigCollection).when(dataExportSpringClient).getExportConfigs(configSql); doReturn(orders).when(ordersService).getPurchaseOrdersByIds(anyList()); - doReturn("test1").when(purchaseOrdersToEdifactMapper).convertOrdersToEdifact(any(), any(), anyString()); + doReturn("test1").when(edifactMapper).convertForExport(any(), any(), any(), anyString()); var exportConfig = getEdifactExportConfig(SAMPLE_EDI_ORDERS_EXPORT, true); JobExecution jobExecution = testLauncher.launchStep(MAP_TO_EDIFACT_STEP, getJobParameters(exportConfig)); @@ -112,7 +112,7 @@ void testEdifactOrdersExportDefaultConfigWithTwoExportConfigs() throws Exception doReturn(poLines).when(ordersService).getPoLinesByQuery(cqlString); doReturn(exportConfigCollection).when(dataExportSpringClient).getExportConfigs(configSql); doReturn(orders).when(ordersService).getPurchaseOrdersByIds(anyList()); - doReturn("test1").when(purchaseOrdersToEdifactMapper).convertOrdersToEdifact(any(), any(), anyString()); + doReturn("test1").when(edifactMapper).convertForExport(any(), any(), any(), anyString()); var exportConfig = getEdifactExportConfig(SAMPLE_EDI_ORDERS_EXPORT, true); JobExecution jobExecution = testLauncher.launchStep(MAP_TO_EDIFACT_STEP, getJobParameters(exportConfig)); diff --git a/src/test/java/org/folio/dew/batch/acquisitions/edifact/jobs/MapToEdifactTaskletAbstractTest.java b/src/test/java/org/folio/dew/batch/acquisitions/edifact/jobs/MapToEdifactTaskletAbstractTest.java index 00a9b075..d56699dc 100644 --- a/src/test/java/org/folio/dew/batch/acquisitions/edifact/jobs/MapToEdifactTaskletAbstractTest.java +++ b/src/test/java/org/folio/dew/batch/acquisitions/edifact/jobs/MapToEdifactTaskletAbstractTest.java @@ -14,7 +14,7 @@ import java.util.UUID; import org.folio.dew.BaseBatchTest; -import org.folio.dew.batch.acquisitions.edifact.PurchaseOrdersToEdifactMapper; +import org.folio.dew.batch.acquisitions.edifact.mapper.EdifactMapper; import org.folio.dew.batch.acquisitions.edifact.services.OrdersService; import org.folio.dew.client.DataExportSpringClient; import org.junit.jupiter.api.Test; @@ -46,7 +46,7 @@ abstract class MapToEdifactTaskletAbstractTest extends BaseBatchTest { @MockBean protected DataExportSpringClient dataExportSpringClient; @MockBean - protected PurchaseOrdersToEdifactMapper purchaseOrdersToEdifactMapper; + protected EdifactMapper edifactMapper; @Autowired protected ObjectMapper objectMapper; protected Job edifactExportJob; From 2b100ac9b11f1a261ca558329faa4f71e6110ee3 Mon Sep 17 00:00:00 2001 From: saba_zedginidze Date: Thu, 12 Dec 2024 18:50:10 +0400 Subject: [PATCH 02/17] [MODEXPW-529] Rename converters --- .../config/EdifactPurchaseOrderConfig.java | 18 +++++++++--------- .../edifact/mapper/EdifactMapper.java | 10 +++++----- ...nverter.java => CompOrderEdiConverter.java} | 10 +++++----- ...verter.java => CompPoLineEdiConverter.java} | 6 +++--- .../edifact/MappingOrdersToEdifactTest.java | 8 ++++---- 5 files changed, 26 insertions(+), 26 deletions(-) rename src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/converter/{CompositePOConverter.java => CompOrderEdiConverter.java} (95%) rename src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/converter/{CompositePOLineConverter.java => CompPoLineEdiConverter.java} (98%) diff --git a/src/main/java/org/folio/dew/batch/acquisitions/edifact/config/EdifactPurchaseOrderConfig.java b/src/main/java/org/folio/dew/batch/acquisitions/edifact/config/EdifactPurchaseOrderConfig.java index 300c0b82..7aa1b786 100644 --- a/src/main/java/org/folio/dew/batch/acquisitions/edifact/config/EdifactPurchaseOrderConfig.java +++ b/src/main/java/org/folio/dew/batch/acquisitions/edifact/config/EdifactPurchaseOrderConfig.java @@ -1,8 +1,8 @@ package org.folio.dew.batch.acquisitions.edifact.config; import org.folio.dew.batch.acquisitions.edifact.mapper.ExportResourceMapper; -import org.folio.dew.batch.acquisitions.edifact.mapper.converter.CompositePOConverter; -import org.folio.dew.batch.acquisitions.edifact.mapper.converter.CompositePOLineConverter; +import org.folio.dew.batch.acquisitions.edifact.mapper.converter.CompOrderEdiConverter; +import org.folio.dew.batch.acquisitions.edifact.mapper.converter.CompPoLineEdiConverter; import org.folio.dew.batch.acquisitions.edifact.mapper.EdifactMapper; import org.folio.dew.batch.acquisitions.edifact.services.ConfigurationService; import org.folio.dew.batch.acquisitions.edifact.services.ExpenseClassService; @@ -18,18 +18,18 @@ @ComponentScan({ "org.folio.dew.batch.acquisitions.edifact" }) public class EdifactPurchaseOrderConfig { @Bean - CompositePOLineConverter compositePOLineConverter(IdentifierTypeService identifierTypeService, MaterialTypeService materialTypeService, - ExpenseClassService expenseClassService, LocationService locationService, HoldingService holdingService) { - return new CompositePOLineConverter(identifierTypeService, materialTypeService, expenseClassService, locationService, holdingService); + CompPoLineEdiConverter compositePOLineConverter(IdentifierTypeService identifierTypeService, MaterialTypeService materialTypeService, + ExpenseClassService expenseClassService, LocationService locationService, HoldingService holdingService) { + return new CompPoLineEdiConverter(identifierTypeService, materialTypeService, expenseClassService, locationService, holdingService); } @Bean - CompositePOConverter compositePurchaseOrderConverter(CompositePOLineConverter compositePOLineConverter, ConfigurationService configurationService) { - return new CompositePOConverter(compositePOLineConverter, configurationService); + CompOrderEdiConverter compositePurchaseOrderConverter(CompPoLineEdiConverter compPoLineEdiConverter, ConfigurationService configurationService) { + return new CompOrderEdiConverter(compPoLineEdiConverter, configurationService); } @Bean - ExportResourceMapper mappingOrdersToEdifact(CompositePOConverter compositePOConverter) { - return new EdifactMapper(compositePOConverter); + ExportResourceMapper mappingOrdersToEdifact(CompOrderEdiConverter compOrderEdiConverter) { + return new EdifactMapper(compOrderEdiConverter); } } diff --git a/src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/EdifactMapper.java b/src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/EdifactMapper.java index 72c3cff0..a20d4ca5 100644 --- a/src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/EdifactMapper.java +++ b/src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/EdifactMapper.java @@ -8,7 +8,7 @@ import java.util.List; import org.apache.commons.lang3.StringUtils; -import org.folio.dew.batch.acquisitions.edifact.mapper.converter.CompositePOConverter; +import org.folio.dew.batch.acquisitions.edifact.mapper.converter.CompOrderEdiConverter; import org.folio.dew.domain.dto.CompositePurchaseOrder; import io.xlate.edi.stream.EDIOutputFactory; @@ -20,10 +20,10 @@ import org.folio.dew.domain.dto.acquisitions.edifact.EdiFileConfig; public class EdifactMapper implements ExportResourceMapper { - private final CompositePOConverter compositePOConverter; + private final CompOrderEdiConverter compOrderEdiConverter; - public EdifactMapper(CompositePOConverter compositePOConverter) { - this.compositePOConverter = compositePOConverter; + public EdifactMapper(CompOrderEdiConverter compOrderEdiConverter) { + this.compOrderEdiConverter = compOrderEdiConverter; } public String convertForExport(List compPOs, List pieces, VendorEdiOrdersExportConfig ediExportConfig, String jobName) throws EDIStreamException { @@ -51,7 +51,7 @@ public String convertForExport(List compPOs, List var poLineIdToPieces = pieces.stream().collect(groupingBy(Piece::getPoLineId)); // Purchase orders for (CompositePurchaseOrder compPO : compPOs) { - compositePOConverter.convertPOtoEdifact(writer, compPO, poLineIdToPieces, ediFileConfig); + compOrderEdiConverter.convertPOtoEdifact(writer, compPO, poLineIdToPieces, ediFileConfig); messageCount++; } diff --git a/src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/converter/CompositePOConverter.java b/src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/converter/CompOrderEdiConverter.java similarity index 95% rename from src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/converter/CompositePOConverter.java rename to src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/converter/CompOrderEdiConverter.java index 7253cd46..8b8641b2 100644 --- a/src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/converter/CompositePOConverter.java +++ b/src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/converter/CompOrderEdiConverter.java @@ -16,15 +16,15 @@ import java.util.List; import java.util.Map; -public class CompositePOConverter { +public class CompOrderEdiConverter { private static final String RUSH_ORDER = "224"; private static final String NOT_RUSH_ORDER = "220"; - private final CompositePOLineConverter compositePOLineConverter; + private final CompPoLineEdiConverter compPoLineEdiConverter; private final ConfigurationService configurationService; - public CompositePOConverter(CompositePOLineConverter compositePOLineConverter, ConfigurationService configurationService) { - this.compositePOLineConverter = compositePOLineConverter; + public CompOrderEdiConverter(CompPoLineEdiConverter compPoLineEdiConverter, ConfigurationService configurationService) { + this.compPoLineEdiConverter = compPoLineEdiConverter; this.configurationService = configurationService; } @@ -70,7 +70,7 @@ public void convertPOtoEdifact(EDIStreamWriter writer, CompositePurchaseOrder co for (CompositePoLine poLine : compPO.getCompositePoLines()) { int quantityOrdered = getPoLineQuantityOrdered(poLine); var pieces = poLineToPieces.getOrDefault(poLine.getId(), List.of()); - int segments = compositePOLineConverter.convertPOLine(poLine, pieces, writer, ++totalNumberOfLineItems, quantityOrdered); + int segments = compPoLineEdiConverter.convertPOLine(poLine, pieces, writer, ++totalNumberOfLineItems, quantityOrdered); messageSegmentCount += segments; totalQuantity += quantityOrdered; } diff --git a/src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/converter/CompositePOLineConverter.java b/src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/converter/CompPoLineEdiConverter.java similarity index 98% rename from src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/converter/CompositePOLineConverter.java rename to src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/converter/CompPoLineEdiConverter.java index 49a953c5..4bfb0070 100644 --- a/src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/converter/CompositePOLineConverter.java +++ b/src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/converter/CompPoLineEdiConverter.java @@ -35,7 +35,7 @@ import java.util.Map; import java.util.Optional; -public class CompositePOLineConverter { +public class CompPoLineEdiConverter { private static final int MAX_CHARS_PER_LINE = 70; private static final int MAX_NUMBER_OF_REFS = 10; private static final String PRODUCT_ID_FUNCTION_CODE_MAIN_PRODUCT_IDNTIFICATION = "5"; @@ -57,8 +57,8 @@ public class CompositePOLineConverter { private final LocationService locationService; private final HoldingService holdingService; - public CompositePOLineConverter(IdentifierTypeService identifierTypeService, MaterialTypeService materialTypeService, - ExpenseClassService expenseClassService, LocationService locationService, HoldingService holdingService) { + public CompPoLineEdiConverter(IdentifierTypeService identifierTypeService, MaterialTypeService materialTypeService, + ExpenseClassService expenseClassService, LocationService locationService, HoldingService holdingService) { this.identifierTypeService = identifierTypeService; this.materialTypeService = materialTypeService; this.expenseClassService = expenseClassService; diff --git a/src/test/java/org/folio/dew/batch/acquisitions/edifact/MappingOrdersToEdifactTest.java b/src/test/java/org/folio/dew/batch/acquisitions/edifact/MappingOrdersToEdifactTest.java index c815d8f0..05c05e88 100644 --- a/src/test/java/org/folio/dew/batch/acquisitions/edifact/MappingOrdersToEdifactTest.java +++ b/src/test/java/org/folio/dew/batch/acquisitions/edifact/MappingOrdersToEdifactTest.java @@ -22,8 +22,8 @@ import java.util.stream.Stream; import lombok.extern.log4j.Log4j2; import org.apache.commons.io.IOUtils; -import org.folio.dew.batch.acquisitions.edifact.mapper.converter.CompositePOConverter; -import org.folio.dew.batch.acquisitions.edifact.mapper.converter.CompositePOLineConverter; +import org.folio.dew.batch.acquisitions.edifact.mapper.converter.CompOrderEdiConverter; +import org.folio.dew.batch.acquisitions.edifact.mapper.converter.CompPoLineEdiConverter; import org.folio.dew.batch.acquisitions.edifact.mapper.EdifactMapper; import org.folio.dew.batch.acquisitions.edifact.services.ConfigurationService; import org.folio.dew.batch.acquisitions.edifact.services.ExpenseClassService; @@ -72,8 +72,8 @@ class MappingOrdersToEdifactTest { @BeforeEach void setUp() { - var compositePOLineConverter = new CompositePOLineConverter(identifierTypeService, materialTypeService, expenseClassService, locationService, holdingService); - var compositePOConverter = new CompositePOConverter(compositePOLineConverter, configurationService); + var compositePOLineConverter = new CompPoLineEdiConverter(identifierTypeService, materialTypeService, expenseClassService, locationService, holdingService); + var compositePOConverter = new CompOrderEdiConverter(compositePOLineConverter, configurationService); edifactMapper = new EdifactMapper(compositePOConverter); objectMapper = new JacksonConfiguration().objectMapper(); } From c028c0993955d31a98b0216a12e9eaf8eb1efff9 Mon Sep 17 00:00:00 2001 From: saba_zedginidze Date: Thu, 12 Dec 2024 22:10:15 +0400 Subject: [PATCH 03/17] [MODEXPW-529] Add csv mapper and converter --- .../edifact/mapper/CsvMapper.java | 40 ++++++++++++++++++ .../converter/AbstractCsvConverter.java | 42 +++++++++++++++++++ .../mapper/converter/ClaimCsvConverter.java | 23 ++++++++++ .../mapper/converter/ClaimCsvFields.java | 36 ++++++++++++++++ .../converter/CompPoLineEdiConverter.java | 7 +--- .../mapper/converter/ExtractableField.java | 9 ++++ .../edifact/utils/ExportUtils.java | 21 ++++++++++ .../java/org/folio/dew/utils/CsvHelper.java | 19 +++++++++ 8 files changed, 192 insertions(+), 5 deletions(-) create mode 100644 src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/CsvMapper.java create mode 100644 src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/converter/AbstractCsvConverter.java create mode 100644 src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/converter/ClaimCsvConverter.java create mode 100644 src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/converter/ClaimCsvFields.java create mode 100644 src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/converter/ExtractableField.java create mode 100644 src/main/java/org/folio/dew/batch/acquisitions/edifact/utils/ExportUtils.java diff --git a/src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/CsvMapper.java b/src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/CsvMapper.java new file mode 100644 index 00000000..e75319e2 --- /dev/null +++ b/src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/CsvMapper.java @@ -0,0 +1,40 @@ +package org.folio.dew.batch.acquisitions.edifact.mapper; + +import static java.util.stream.Collectors.groupingBy; +import static org.folio.dew.utils.Constants.LINE_BREAK; + +import java.util.List; + +import org.apache.commons.lang3.tuple.Pair; +import org.folio.dew.batch.acquisitions.edifact.mapper.converter.ClaimCsvConverter; +import org.folio.dew.domain.dto.CompositePoLine; +import org.folio.dew.domain.dto.CompositePurchaseOrder; +import org.folio.dew.domain.dto.Piece; +import org.folio.dew.domain.dto.VendorEdiOrdersExportConfig; + +public class CsvMapper implements ExportResourceMapper { + + @Override + public String convertForExport(List compPOs, List pieces, VendorEdiOrdersExportConfig ediExportConfig, String jobName) { + var csvConverter = new ClaimCsvConverter(); + var csvResult = new StringBuilder(csvConverter.getCsvHeaders()); + getClaimEntries(compPOs, pieces).stream() + .map(csvConverter::convertEntryToCsv) + .map(line -> line.concat(LINE_BREAK)) + .forEachOrdered(csvResult::append); + return csvResult.toString(); + } + + private static List> getClaimEntries(List orders, List pieces) { + var poLineIdToPieces = pieces.stream().collect(groupingBy(Piece::getPoLineId)); + return orders.stream() + // 1. Get all composite PO lines + .flatMap(order -> order.getCompositePoLines().stream() + // 2. For each composite PO line, get all pieces + .flatMap(poLine -> poLineIdToPieces.get(poLine.getId()).stream() + // 3. Map each piece to a pair of composite PO line and piece + .map(piece -> Pair.of(poLine, piece)))) + .toList(); + } + +} diff --git a/src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/converter/AbstractCsvConverter.java b/src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/converter/AbstractCsvConverter.java new file mode 100644 index 00000000..379a244c --- /dev/null +++ b/src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/converter/AbstractCsvConverter.java @@ -0,0 +1,42 @@ +package org.folio.dew.batch.acquisitions.edifact.mapper.converter; + +import static org.folio.dew.utils.Constants.COMMA; +import static org.folio.dew.utils.Constants.QUOTE; + +import java.util.Arrays; + +import org.folio.dew.utils.CsvHelper; +import org.springframework.batch.item.file.transform.DelimitedLineAggregator; + +public abstract class AbstractCsvConverter { + + private final DelimitedLineAggregator lineAggregator; + private final String delimiter; + + public AbstractCsvConverter() { + this(COMMA); + } + + public AbstractCsvConverter(String delimiter) { + this.delimiter = delimiter; + this.lineAggregator = new DelimitedLineAggregator<>(); + lineAggregator.setDelimiter(delimiter); + } + + public String getCsvHeaders() { + return lineAggregator.doAggregate(getHeaders()); + } + + public String convertEntryToCsv(T entry) { + return lineAggregator.doAggregate(Arrays.stream(getFields()) + .map(field -> field.extract(entry)) + .map(field -> field == null ? "" : field) + .map(field -> CsvHelper.escapeDelimiter(field, delimiter, QUOTE)) + .toArray()); + } + + protected abstract ExtractableField[] getFields(); + + protected abstract String[] getHeaders(); + +} diff --git a/src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/converter/ClaimCsvConverter.java b/src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/converter/ClaimCsvConverter.java new file mode 100644 index 00000000..06a1689a --- /dev/null +++ b/src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/converter/ClaimCsvConverter.java @@ -0,0 +1,23 @@ +package org.folio.dew.batch.acquisitions.edifact.mapper.converter; + +import java.util.Arrays; + +import org.apache.commons.lang3.tuple.Pair; +import org.folio.dew.domain.dto.CompositePoLine; +import org.folio.dew.domain.dto.Piece; + +public class ClaimCsvConverter extends AbstractCsvConverter> { + + @Override + protected ExtractableField, String>[] getFields() { + return ClaimCsvFields.values(); + } + + @Override + protected String[] getHeaders() { + return Arrays.stream(ClaimCsvFields.values()) + .map(ClaimCsvFields::getName) + .toArray(String[]::new); + } + +} diff --git a/src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/converter/ClaimCsvFields.java b/src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/converter/ClaimCsvFields.java new file mode 100644 index 00000000..184ae996 --- /dev/null +++ b/src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/converter/ClaimCsvFields.java @@ -0,0 +1,36 @@ +package org.folio.dew.batch.acquisitions.edifact.mapper.converter; + +import static org.folio.dew.batch.acquisitions.edifact.utils.ExportUtils.getVendorOrderNumber; + +import java.util.function.Function; + +import org.apache.commons.lang3.tuple.Pair; +import org.folio.dew.domain.dto.CompositePoLine; +import org.folio.dew.domain.dto.Piece; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@AllArgsConstructor +public enum ClaimCsvFields implements ExtractableField, String> { + + POL_NUMBER("POL number", (pair) -> pair.getKey().getPoLineNumber()), + ORDER_NUMBER("Vendor order number", (pair) -> getVendorOrderNumber(pair.getKey().getVendorDetail().getReferenceNumbers()).getRefNumber()), + ACCOUNT_NUMBER("Account number", (pair) -> pair.getKey().getVendorDetail().getVendorAccount()), + TITLE("Title", (pair) -> pair.getValue().getTitleId()), + DISPLAY_SUMMARY("Display summary", (pair) -> pair.getValue().getDisplaySummary()), + CHRONOLOGY("Chronology", (pair) -> pair.getValue().getChronology()), + ENUMERATION("Enumeration", (pair) -> pair.getValue().getEnumeration()), + QUANTITY("Quantity", (pair) -> "CHANGEME"); // FIXME: implement quantity extraction + + @Getter + private final String name; + private final Function, String> extractor; + + + @Override + public String extract(Pair item) { + return extractor.apply(item); + } + +} diff --git a/src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/converter/CompPoLineEdiConverter.java b/src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/converter/CompPoLineEdiConverter.java index 4bfb0070..08d3176f 100644 --- a/src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/converter/CompPoLineEdiConverter.java +++ b/src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/converter/CompPoLineEdiConverter.java @@ -1,6 +1,6 @@ package org.folio.dew.batch.acquisitions.edifact.mapper.converter; -import static org.folio.dew.domain.dto.ReferenceNumberItem.RefNumberTypeEnum.ORDER_REFERENCE_NUMBER; +import static org.folio.dew.batch.acquisitions.edifact.utils.ExportUtils.getVendorOrderNumber; import javax.money.CurrencyUnit; import javax.money.Monetary; @@ -519,10 +519,7 @@ private List getVendorReferenceNumbers(CompositePoLine poLi } private ReferenceNumberItem getAndRemoveVendorOrderNumber(List referenceNumberItems) { - var vendorOrderNumber = referenceNumberItems.stream() - .filter(r -> r.getRefNumberType() == ORDER_REFERENCE_NUMBER) - .findFirst() - .orElse(null); + var vendorOrderNumber = getVendorOrderNumber(referenceNumberItems); referenceNumberItems.remove(vendorOrderNumber); return vendorOrderNumber; } diff --git a/src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/converter/ExtractableField.java b/src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/converter/ExtractableField.java new file mode 100644 index 00000000..e8652c83 --- /dev/null +++ b/src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/converter/ExtractableField.java @@ -0,0 +1,9 @@ +package org.folio.dew.batch.acquisitions.edifact.mapper.converter; + +public interface ExtractableField { + + String getName(); + + R extract(T item); + +} diff --git a/src/main/java/org/folio/dew/batch/acquisitions/edifact/utils/ExportUtils.java b/src/main/java/org/folio/dew/batch/acquisitions/edifact/utils/ExportUtils.java new file mode 100644 index 00000000..fb18eea6 --- /dev/null +++ b/src/main/java/org/folio/dew/batch/acquisitions/edifact/utils/ExportUtils.java @@ -0,0 +1,21 @@ +package org.folio.dew.batch.acquisitions.edifact.utils; + +import static org.folio.dew.domain.dto.ReferenceNumberItem.RefNumberTypeEnum.ORDER_REFERENCE_NUMBER; + +import java.util.List; +import java.util.Optional; + +import org.folio.dew.domain.dto.ReferenceNumberItem; + +public class ExportUtils { + + private ExportUtils() { } + + public static ReferenceNumberItem getVendorOrderNumber(List referenceNumberItems) { + return Optional.ofNullable(referenceNumberItems).orElse(List.of()).stream() + .filter(r -> r.getRefNumberType() == ORDER_REFERENCE_NUMBER) + .findFirst() + .orElse(null); + } + +} diff --git a/src/main/java/org/folio/dew/utils/CsvHelper.java b/src/main/java/org/folio/dew/utils/CsvHelper.java index c2d1aa3a..724f73f9 100644 --- a/src/main/java/org/folio/dew/utils/CsvHelper.java +++ b/src/main/java/org/folio/dew/utils/CsvHelper.java @@ -1,6 +1,7 @@ package org.folio.dew.utils; import static org.folio.dew.utils.Constants.LINE_BREAK; +import static org.folio.dew.utils.Constants.LINE_BREAK_REPLACEMENT; import com.opencsv.bean.CsvToBeanBuilder; import com.opencsv.bean.StatefulBeanToCsvBuilder; @@ -8,6 +9,8 @@ import com.opencsv.exceptions.CsvRequiredFieldEmptyException; import lombok.experimental.UtilityClass; import lombok.extern.log4j.Log4j2; + +import org.apache.commons.lang3.StringUtils; import org.folio.dew.repository.BaseFilesStorage; import java.io.BufferedReader; @@ -87,4 +90,20 @@ public static long countLines(R storage, String pat return lines.count(); } } + + + /** + * Escapes delimiter in the value with escape character. If value contains delimiter, line break or escape character, + * it will be escaped - as instructed in RFC 4180 + * + * @param value value to process + * @param delimiter delimiter to escape + * @param escape escape character + * @return escaped value + */ + public static String escapeDelimiter(String value, String delimiter, String escape) { + return StringUtils.isNotBlank(value) && value.contains(delimiter) + ? escape + value.replace(escape, escape + escape).replace(LINE_BREAK, LINE_BREAK_REPLACEMENT) + escape + : value; + } } From c624e54c74585c54bd487e11772b3462950687b1 Mon Sep 17 00:00:00 2001 From: saba_zedginidze Date: Thu, 12 Dec 2024 22:21:42 +0400 Subject: [PATCH 04/17] [MODEXPW-529] Use new mapper together with old one in tasklets --- ...haseOrderConfig.java => ExportConfig.java} | 12 ++++++++++-- .../jobs/MapToEdifactClaimsTasklet.java | 19 ++++++++++++++++--- .../jobs/MapToEdifactOrdersTasklet.java | 14 +++++++++++--- .../edifact/jobs/MapToEdifactTasklet.java | 7 ++++--- 4 files changed, 41 insertions(+), 11 deletions(-) rename src/main/java/org/folio/dew/batch/acquisitions/edifact/config/{EdifactPurchaseOrderConfig.java => ExportConfig.java} (87%) diff --git a/src/main/java/org/folio/dew/batch/acquisitions/edifact/config/EdifactPurchaseOrderConfig.java b/src/main/java/org/folio/dew/batch/acquisitions/edifact/config/ExportConfig.java similarity index 87% rename from src/main/java/org/folio/dew/batch/acquisitions/edifact/config/EdifactPurchaseOrderConfig.java rename to src/main/java/org/folio/dew/batch/acquisitions/edifact/config/ExportConfig.java index 7aa1b786..e67051c1 100644 --- a/src/main/java/org/folio/dew/batch/acquisitions/edifact/config/EdifactPurchaseOrderConfig.java +++ b/src/main/java/org/folio/dew/batch/acquisitions/edifact/config/ExportConfig.java @@ -1,5 +1,6 @@ package org.folio.dew.batch.acquisitions.edifact.config; +import org.folio.dew.batch.acquisitions.edifact.mapper.CsvMapper; import org.folio.dew.batch.acquisitions.edifact.mapper.ExportResourceMapper; import org.folio.dew.batch.acquisitions.edifact.mapper.converter.CompOrderEdiConverter; import org.folio.dew.batch.acquisitions.edifact.mapper.converter.CompPoLineEdiConverter; @@ -16,7 +17,8 @@ @Configuration @ComponentScan({ "org.folio.dew.batch.acquisitions.edifact" }) -public class EdifactPurchaseOrderConfig { +public class ExportConfig { + @Bean CompPoLineEdiConverter compositePOLineConverter(IdentifierTypeService identifierTypeService, MaterialTypeService materialTypeService, ExpenseClassService expenseClassService, LocationService locationService, HoldingService holdingService) { @@ -29,7 +31,13 @@ CompOrderEdiConverter compositePurchaseOrderConverter(CompPoLineEdiConverter com } @Bean - ExportResourceMapper mappingOrdersToEdifact(CompOrderEdiConverter compOrderEdiConverter) { + ExportResourceMapper edifactMapper(CompOrderEdiConverter compOrderEdiConverter) { return new EdifactMapper(compOrderEdiConverter); } + + @Bean + ExportResourceMapper csvMapper() { + return new CsvMapper(); + } + } diff --git a/src/main/java/org/folio/dew/batch/acquisitions/edifact/jobs/MapToEdifactClaimsTasklet.java b/src/main/java/org/folio/dew/batch/acquisitions/edifact/jobs/MapToEdifactClaimsTasklet.java index 47f5eeb7..23c87ad5 100644 --- a/src/main/java/org/folio/dew/batch/acquisitions/edifact/jobs/MapToEdifactClaimsTasklet.java +++ b/src/main/java/org/folio/dew/batch/acquisitions/edifact/jobs/MapToEdifactClaimsTasklet.java @@ -6,7 +6,7 @@ import java.util.Map; import org.apache.commons.collections4.CollectionUtils; -import org.folio.dew.batch.acquisitions.edifact.mapper.EdifactMapper; +import org.folio.dew.batch.acquisitions.edifact.mapper.ExportResourceMapper; import org.folio.dew.batch.acquisitions.edifact.services.OrdersService; import org.folio.dew.domain.dto.Piece; import org.folio.dew.domain.dto.VendorEdiOrdersExportConfig; @@ -23,12 +23,25 @@ public class MapToEdifactClaimsTasklet extends MapToEdifactTasklet { public static final String CLAIM_PIECE_IDS = "claimPieceIds"; + private final ExportResourceMapper edifactMapper; + private final ExportResourceMapper csvMapper; public MapToEdifactClaimsTasklet(ObjectMapper ediObjectMapper, OrdersService ordersService, - EdifactMapper edifactMapper) { - super(ediObjectMapper, ordersService, edifactMapper); + ExportResourceMapper edifactMapper, ExportResourceMapper csvMapper) { + super(ediObjectMapper, ordersService); + this.edifactMapper = edifactMapper; + this.csvMapper = csvMapper; } + @Override + protected ExportResourceMapper getExportResourceMapper(VendorEdiOrdersExportConfig ediOrdersExportConfig) { + return switch (ediOrdersExportConfig.getFileFormat()) { + case EDI -> edifactMapper; + case CSV -> csvMapper; + }; + } + + @Override protected List getExportConfigMissingFields(VendorEdiOrdersExportConfig ediOrdersExportConfig) { return CollectionUtils.isEmpty(ediOrdersExportConfig.getClaimPieceIds()) ? List.of(CLAIM_PIECE_IDS) diff --git a/src/main/java/org/folio/dew/batch/acquisitions/edifact/jobs/MapToEdifactOrdersTasklet.java b/src/main/java/org/folio/dew/batch/acquisitions/edifact/jobs/MapToEdifactOrdersTasklet.java index 90e2c29c..0aee36e7 100644 --- a/src/main/java/org/folio/dew/batch/acquisitions/edifact/jobs/MapToEdifactOrdersTasklet.java +++ b/src/main/java/org/folio/dew/batch/acquisitions/edifact/jobs/MapToEdifactOrdersTasklet.java @@ -13,7 +13,7 @@ import java.util.stream.Collectors; import org.apache.commons.collections4.CollectionUtils; -import org.folio.dew.batch.acquisitions.edifact.mapper.EdifactMapper; +import org.folio.dew.batch.acquisitions.edifact.mapper.ExportResourceMapper; import org.folio.dew.batch.acquisitions.edifact.services.OrdersService; import org.folio.dew.client.DataExportSpringClient; import org.folio.dew.domain.dto.ExportConfigCollection; @@ -34,14 +34,17 @@ public class MapToEdifactOrdersTasklet extends MapToEdifactTasklet { private final DataExportSpringClient dataExportSpringClient; + private final ExportResourceMapper edifactMapper; public MapToEdifactOrdersTasklet(ObjectMapper ediObjectMapper, OrdersService ordersService, DataExportSpringClient dataExportSpringClient, - EdifactMapper edifactMapper) { - super(ediObjectMapper, ordersService, edifactMapper); + ExportResourceMapper edifactMapper) { + super(ediObjectMapper, ordersService); + this.edifactMapper = edifactMapper; this.dataExportSpringClient = dataExportSpringClient; } + @Override protected List getExportConfigMissingFields(VendorEdiOrdersExportConfig ediOrdersExportConfig) { return List.of(); } @@ -53,6 +56,11 @@ protected ExportHolder buildEdifactExportHolder(ChunkContext chunkContext, Vendo return new ExportHolder(compOrders, List.of()); } + @Override + protected ExportResourceMapper getExportResourceMapper(VendorEdiOrdersExportConfig ediOrdersExportConfig) { + return edifactMapper; + } + protected String getPoLineQuery(VendorEdiOrdersExportConfig ediConfig) { var acqMethods = ediConfig.getEdiConfig().getDefaultAcquisitionMethods(); var resultQuery = combineCqlExpressions("AND", diff --git a/src/main/java/org/folio/dew/batch/acquisitions/edifact/jobs/MapToEdifactTasklet.java b/src/main/java/org/folio/dew/batch/acquisitions/edifact/jobs/MapToEdifactTasklet.java index 3b47edf2..7f956074 100644 --- a/src/main/java/org/folio/dew/batch/acquisitions/edifact/jobs/MapToEdifactTasklet.java +++ b/src/main/java/org/folio/dew/batch/acquisitions/edifact/jobs/MapToEdifactTasklet.java @@ -11,9 +11,9 @@ import org.apache.commons.lang3.StringUtils; import org.folio.dew.batch.ExecutionContextUtils; -import org.folio.dew.batch.acquisitions.edifact.mapper.EdifactMapper; import org.folio.dew.batch.acquisitions.edifact.exceptions.CompositeOrderMappingException; import org.folio.dew.batch.acquisitions.edifact.exceptions.EdifactException; +import org.folio.dew.batch.acquisitions.edifact.mapper.ExportResourceMapper; import org.folio.dew.batch.acquisitions.edifact.services.OrdersService; import org.folio.dew.domain.dto.CompositePoLine; import org.folio.dew.domain.dto.CompositePurchaseOrder; @@ -41,7 +41,6 @@ public abstract class MapToEdifactTasklet implements Tasklet { private final ObjectMapper ediObjectMapper; protected final OrdersService ordersService; - private final EdifactMapper edifactMapper; @Override public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception { @@ -54,7 +53,7 @@ public RepeatStatus execute(StepContribution contribution, ChunkContext chunkCon persistPoLineIds(chunkContext, holder.orders()); String jobName = jobParameters.get(JobParameterNames.JOB_NAME).toString(); - var edifactStringResult = edifactMapper.convertForExport(holder.orders(), holder.pieces(), ediExportConfig, jobName); + var edifactStringResult = getExportResourceMapper(ediExportConfig).convertForExport(holder.orders(), holder.pieces(), ediExportConfig, jobName); // save edifact file content in memory ExecutionContextUtils.addToJobExecutionContext(chunkContext.getStepContext().getStepExecution(), "edifactOrderAsString", edifactStringResult, ""); @@ -122,6 +121,8 @@ private T convertTo(Object value, Class c) { } } + protected abstract ExportResourceMapper getExportResourceMapper(VendorEdiOrdersExportConfig ediOrdersExportConfig); + protected abstract List getExportConfigMissingFields(VendorEdiOrdersExportConfig ediOrdersExportConfig); protected abstract ExportHolder buildEdifactExportHolder(ChunkContext chunkContext, VendorEdiOrdersExportConfig ediExportConfig, From 6a429658f4143e039b06a930e0f8509b689cd478 Mon Sep 17 00:00:00 2001 From: saba_zedginidze Date: Thu, 12 Dec 2024 22:35:01 +0400 Subject: [PATCH 05/17] [MODEXPW-529] Simplify existing acq tests to speed up builds --- ...difactTest.java => EdifactMapperTest.java} | 4 ++-- .../edifact/HoldingServiceTest.java | 21 +++++++++------- .../edifact/IdentifierTypeServiceTest.java | 24 ++++++++++++------- 3 files changed, 30 insertions(+), 19 deletions(-) rename src/test/java/org/folio/dew/batch/acquisitions/edifact/{MappingOrdersToEdifactTest.java => EdifactMapperTest.java} (98%) diff --git a/src/test/java/org/folio/dew/batch/acquisitions/edifact/MappingOrdersToEdifactTest.java b/src/test/java/org/folio/dew/batch/acquisitions/edifact/EdifactMapperTest.java similarity index 98% rename from src/test/java/org/folio/dew/batch/acquisitions/edifact/MappingOrdersToEdifactTest.java rename to src/test/java/org/folio/dew/batch/acquisitions/edifact/EdifactMapperTest.java index 05c05e88..9ec01d9a 100644 --- a/src/test/java/org/folio/dew/batch/acquisitions/edifact/MappingOrdersToEdifactTest.java +++ b/src/test/java/org/folio/dew/batch/acquisitions/edifact/EdifactMapperTest.java @@ -47,7 +47,7 @@ @Log4j2 @ExtendWith(MockitoExtension.class) -class MappingOrdersToEdifactTest { +class EdifactMapperTest { private static final Map EXPORT_EDI_PATHS = Map.of( EDIFACT_ORDERS_EXPORT,"edifact/acquisitions/edifact_orders_result.edi", @@ -149,7 +149,7 @@ private List getTestPiecesFromJson(ExportType type) throws IOException { } public static String getMockData(String path) throws IOException { - try (InputStream resourceAsStream = MappingOrdersToEdifactTest.class.getClassLoader().getResourceAsStream(path)) { + try (InputStream resourceAsStream = EdifactMapperTest.class.getClassLoader().getResourceAsStream(path)) { if (resourceAsStream != null) { return IOUtils.toString(resourceAsStream, StandardCharsets.UTF_8); } else { diff --git a/src/test/java/org/folio/dew/batch/acquisitions/edifact/HoldingServiceTest.java b/src/test/java/org/folio/dew/batch/acquisitions/edifact/HoldingServiceTest.java index 7b7072a3..80f825d6 100644 --- a/src/test/java/org/folio/dew/batch/acquisitions/edifact/HoldingServiceTest.java +++ b/src/test/java/org/folio/dew/batch/acquisitions/edifact/HoldingServiceTest.java @@ -1,26 +1,31 @@ package org.folio.dew.batch.acquisitions.edifact; import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.JsonNode; -import org.folio.dew.BaseBatchTest; +import com.fasterxml.jackson.databind.ObjectMapper; + import org.folio.dew.batch.acquisitions.edifact.services.HoldingService; import org.folio.dew.client.HoldingClient; import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.mock.mockito.MockBean; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Spy; +import org.mockito.junit.jupiter.MockitoExtension; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.doReturn; +@ExtendWith(MockitoExtension.class) +class HoldingServiceTest { -class HoldingServiceTest extends BaseBatchTest { - @Autowired + @InjectMocks private HoldingService holdingService; - @MockBean + @Mock private HoldingClient client; - + @Spy + private ObjectMapper objectMapper; @Test void getPermanentLocationIdFromJson() throws JsonProcessingException { diff --git a/src/test/java/org/folio/dew/batch/acquisitions/edifact/IdentifierTypeServiceTest.java b/src/test/java/org/folio/dew/batch/acquisitions/edifact/IdentifierTypeServiceTest.java index 890a3db6..8bf22cf9 100644 --- a/src/test/java/org/folio/dew/batch/acquisitions/edifact/IdentifierTypeServiceTest.java +++ b/src/test/java/org/folio/dew/batch/acquisitions/edifact/IdentifierTypeServiceTest.java @@ -2,23 +2,29 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.when; -import org.folio.dew.BaseBatchTest; import org.folio.dew.batch.acquisitions.edifact.services.IdentifierTypeService; import org.folio.dew.client.IdentifierTypeClient; import org.junit.jupiter.api.Test; -import org.mockito.Mockito; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.mock.mockito.MockBean; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Spy; +import org.mockito.junit.jupiter.MockitoExtension; import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +@ExtendWith(MockitoExtension.class) +class IdentifierTypeServiceTest { -class IdentifierTypeServiceTest extends BaseBatchTest { - @Autowired + @InjectMocks private IdentifierTypeService identifierTypeService; - @MockBean + @Mock private IdentifierTypeClient client; + @Spy + private ObjectMapper objectMapper; @Test void getIdentifierTypeName() { @@ -28,8 +34,8 @@ void getIdentifierTypeName() { @Test void getIdentifierTypeNameFromJson() throws JsonProcessingException { - Mockito.when(client.getIdentifierType(anyString())) - .thenReturn(objectMapper.readTree("{\"name\": \"ISSN\"}")); + var identifierTypeJson = objectMapper.readTree("{\"name\": \"ISSN\"}"); + when(client.getIdentifierType(anyString())).thenReturn(identifierTypeJson); String identifierTypeName = identifierTypeService.getIdentifierTypeName("913300b2-03ed-469a-8179-c1092c991227"); assertEquals("ISSN", identifierTypeName); } From 860947d2e1858d603ed7819830e5df2392e4cbef Mon Sep 17 00:00:00 2001 From: saba_zedginidze Date: Thu, 12 Dec 2024 22:43:58 +0400 Subject: [PATCH 06/17] [MODEXPW-529] Simplify edifact mapper test --- .../edifact/EdifactMapperTest.java | 81 +++++-------------- 1 file changed, 21 insertions(+), 60 deletions(-) diff --git a/src/test/java/org/folio/dew/batch/acquisitions/edifact/EdifactMapperTest.java b/src/test/java/org/folio/dew/batch/acquisitions/edifact/EdifactMapperTest.java index 9ec01d9a..ce936600 100644 --- a/src/test/java/org/folio/dew/batch/acquisitions/edifact/EdifactMapperTest.java +++ b/src/test/java/org/folio/dew/batch/acquisitions/edifact/EdifactMapperTest.java @@ -2,6 +2,7 @@ import static org.folio.dew.domain.dto.ExportType.CLAIMS; import static org.folio.dew.domain.dto.ExportType.EDIFACT_ORDERS_EXPORT; +import static org.folio.dew.utils.TestUtils.getMockData; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNotNull; @@ -9,19 +10,16 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.when; import com.fasterxml.jackson.databind.ObjectMapper; import java.io.IOException; -import java.io.InputStream; import java.nio.charset.StandardCharsets; -import java.nio.file.Files; -import java.nio.file.Paths; import java.util.ArrayList; import java.util.List; import java.util.Map; -import java.util.stream.Stream; import lombok.extern.log4j.Log4j2; -import org.apache.commons.io.IOUtils; +import org.folio.dew.batch.acquisitions.edifact.mapper.ExportResourceMapper; import org.folio.dew.batch.acquisitions.edifact.mapper.converter.CompOrderEdiConverter; import org.folio.dew.batch.acquisitions.edifact.mapper.converter.CompPoLineEdiConverter; import org.folio.dew.batch.acquisitions.edifact.mapper.EdifactMapper; @@ -42,7 +40,6 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.EnumSource; import org.mockito.Mock; -import org.mockito.Mockito; import org.mockito.junit.jupiter.MockitoExtension; @Log4j2 @@ -55,7 +52,7 @@ class EdifactMapperTest { ); private ObjectMapper objectMapper; - private EdifactMapper edifactMapper; + private ExportResourceMapper edifactMapper; @Mock private IdentifierTypeService identifierTypeService; @@ -76,6 +73,21 @@ void setUp() { var compositePOConverter = new CompOrderEdiConverter(compositePOLineConverter, configurationService); edifactMapper = new EdifactMapper(compositePOConverter); objectMapper = new JacksonConfiguration().objectMapper(); + + when(identifierTypeService.getIdentifierTypeName("8261054f-be78-422d-bd51-4ed9f33c3422")) + .thenReturn("ISSN", "ISMN", "ISBN", "ISSN", "ISMN", "ISBN"); + when(identifierTypeService.getIdentifierTypeName(not(eq("8261054f-be78-422d-bd51-4ed9f33c3422")))) + .thenReturn("Publisher or distributor number"); + when(materialTypeService.getMaterialTypeName(anyString())) + .thenReturn("Book"); + when(expenseClassService.getExpenseClassCode(anyString())) + .thenReturn("Elec"); + when(locationService.getLocationCodeById(anyString())) + .thenReturn("KU/CC/DI/M"); + when(holdingService.getPermanentLocationByHoldingId(anyString())) + .thenReturn("fcd64ce1-6995-48f0-840e-89ffa2288371"); + when(configurationService.getAddressConfig(any())) + .thenReturn("Bockenheimer Landstr. 134-13"); } @ParameterizedTest @@ -86,19 +98,7 @@ void convertOrdersToEdifact(ExportType type) throws Exception { List compPOs = getTestOrdersFromJson(type); List pieces = getTestPiecesFromJson(type); - serviceMocks(); - - String ediOrder; - if (type == EDIFACT_ORDERS_EXPORT) { - ediOrder = edifactMapper.convertForExport(compPOs, List.of(), getTestEdiConfig(), jobName); - } else { - var piecePoLineIds = pieces.stream().map(Piece::getPoLineId).toList(); - compPOs = compPOs.stream() - .peek(po -> po.getCompositePoLines().stream().filter(line -> piecePoLineIds.contains(line.getId())).toList()) - .filter(po -> !po.getCompositePoLines().isEmpty()) - .toList(); - ediOrder = edifactMapper.convertForExport(compPOs, pieces, getTestEdiConfig(), jobName); - } + String ediOrder= edifactMapper.convertForExport(compPOs, pieces, getTestEdiConfig(), jobName); assertFalse(ediOrder.isEmpty()); validateEdifactOrders(type, ediOrder, fileIdExpected); @@ -111,14 +111,7 @@ void convertOrdersToEdifactByteArray(ExportType type) throws Exception { List compPOs = getTestOrdersFromJson(type); List pieces = getTestPiecesFromJson(type); - serviceMocks(); - - byte[] ediOrder; - if (type == EDIFACT_ORDERS_EXPORT) { - ediOrder = edifactMapper.convertForExport(compPOs, List.of(), getTestEdiConfig(), jobName).getBytes(StandardCharsets.UTF_8); - } else { - ediOrder = edifactMapper.convertForExport(compPOs, pieces, getTestEdiConfig(), jobName).getBytes(StandardCharsets.UTF_8); - } + byte[] ediOrder = edifactMapper.convertForExport(compPOs, pieces, getTestEdiConfig(), jobName).getBytes(StandardCharsets.UTF_8); assertNotNull(ediOrder); validateEdifactOrders(type, new String(ediOrder), jobName); @@ -141,44 +134,12 @@ private List getTestOrdersFromJson(ExportType type) thro return compPOs; } - private List getTestPiecesFromJson(ExportType type) throws IOException { return type == EDIFACT_ORDERS_EXPORT ? List.of() : objectMapper.readValue(getMockData("edifact/acquisitions/pieces_collection_mixed.json"), PieceCollection.class).getPieces(); } - public static String getMockData(String path) throws IOException { - try (InputStream resourceAsStream = EdifactMapperTest.class.getClassLoader().getResourceAsStream(path)) { - if (resourceAsStream != null) { - return IOUtils.toString(resourceAsStream, StandardCharsets.UTF_8); - } else { - StringBuilder sb = new StringBuilder(); - try (Stream lines = Files.lines(Paths.get(path))) { - lines.forEach(sb::append); - } - return sb.toString(); - } - } - } - - private void serviceMocks() { - Mockito.when(identifierTypeService.getIdentifierTypeName("8261054f-be78-422d-bd51-4ed9f33c3422")) - .thenReturn("ISSN", "ISMN", "ISBN", "ISSN", "ISMN", "ISBN"); - Mockito.when(identifierTypeService.getIdentifierTypeName(not(eq("8261054f-be78-422d-bd51-4ed9f33c3422")))) - .thenReturn("Publisher or distributor number"); - Mockito.when(materialTypeService.getMaterialTypeName(anyString())) - .thenReturn("Book"); - Mockito.when(expenseClassService.getExpenseClassCode(anyString())) - .thenReturn("Elec"); - Mockito.when(locationService.getLocationCodeById(anyString())) - .thenReturn("KU/CC/DI/M"); - Mockito.when(holdingService.getPermanentLocationByHoldingId(anyString())) - .thenReturn("fcd64ce1-6995-48f0-840e-89ffa2288371"); - Mockito.when(configurationService.getAddressConfig(any())) - .thenReturn("Bockenheimer Landstr. 134-13"); - } - private void validateEdifactOrders(ExportType type, String ediOrder, String fileId) throws IOException { log.info("Generated EDI file:\n{}", ediOrder); String ediOrderExpected = getMockData(EXPORT_EDI_PATHS.get(type)).replaceAll("\\{fileId}", fileId); From bff625040caff4530fc377be0923131840946ec2 Mon Sep 17 00:00:00 2001 From: saba_zedginidze Date: Thu, 12 Dec 2024 23:03:54 +0400 Subject: [PATCH 07/17] [MODEXPW-529] Add CsvMapperTest (WIP) --- .../mapper/converter/ClaimCsvFields.java | 5 +- .../converter/CompPoLineEdiConverter.java | 9 +- .../edifact/utils/ExportUtils.java | 21 +++ .../acquisitions/edifact/CsvMapperTest.java | 130 ++++++++++++++++++ .../edifact/EdifactMapperTest.java | 17 +-- 5 files changed, 159 insertions(+), 23 deletions(-) create mode 100644 src/test/java/org/folio/dew/batch/acquisitions/edifact/CsvMapperTest.java diff --git a/src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/converter/ClaimCsvFields.java b/src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/converter/ClaimCsvFields.java index 184ae996..bce5d6d9 100644 --- a/src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/converter/ClaimCsvFields.java +++ b/src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/converter/ClaimCsvFields.java @@ -1,5 +1,6 @@ package org.folio.dew.batch.acquisitions.edifact.mapper.converter; +import static org.folio.dew.batch.acquisitions.edifact.utils.ExportUtils.getVendorAccountNumber; import static org.folio.dew.batch.acquisitions.edifact.utils.ExportUtils.getVendorOrderNumber; import java.util.function.Function; @@ -15,8 +16,8 @@ public enum ClaimCsvFields implements ExtractableField, String> { POL_NUMBER("POL number", (pair) -> pair.getKey().getPoLineNumber()), - ORDER_NUMBER("Vendor order number", (pair) -> getVendorOrderNumber(pair.getKey().getVendorDetail().getReferenceNumbers()).getRefNumber()), - ACCOUNT_NUMBER("Account number", (pair) -> pair.getKey().getVendorDetail().getVendorAccount()), + ORDER_NUMBER("Vendor order number", (pair) -> getVendorOrderNumber(pair.getKey())), + ACCOUNT_NUMBER("Account number", (pair) -> getVendorAccountNumber(pair.getKey())), TITLE("Title", (pair) -> pair.getValue().getTitleId()), DISPLAY_SUMMARY("Display summary", (pair) -> pair.getValue().getDisplaySummary()), CHRONOLOGY("Chronology", (pair) -> pair.getValue().getChronology()), diff --git a/src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/converter/CompPoLineEdiConverter.java b/src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/converter/CompPoLineEdiConverter.java index 08d3176f..d3ecc1e5 100644 --- a/src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/converter/CompPoLineEdiConverter.java +++ b/src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/converter/CompPoLineEdiConverter.java @@ -1,6 +1,7 @@ package org.folio.dew.batch.acquisitions.edifact.mapper.converter; import static org.folio.dew.batch.acquisitions.edifact.utils.ExportUtils.getVendorOrderNumber; +import static org.folio.dew.batch.acquisitions.edifact.utils.ExportUtils.getVendorReferenceNumbers; import javax.money.CurrencyUnit; import javax.money.Monetary; @@ -25,7 +26,6 @@ import org.folio.dew.domain.dto.Piece; import org.folio.dew.domain.dto.ProductIdentifier; import org.folio.dew.domain.dto.ReferenceNumberItem; -import org.folio.dew.domain.dto.VendorDetail; import org.javamoney.moneta.Money; import java.math.BigDecimal; @@ -33,7 +33,6 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.Optional; public class CompPoLineEdiConverter { private static final int MAX_CHARS_PER_LINE = 70; @@ -512,12 +511,6 @@ private String getExpenseClassCode(FundDistribution fundDistribution) { return ""; } - private List getVendorReferenceNumbers(CompositePoLine poLine) { - return Optional.ofNullable(poLine.getVendorDetail()) - .map(VendorDetail::getReferenceNumbers) - .orElse(new ArrayList<>()); - } - private ReferenceNumberItem getAndRemoveVendorOrderNumber(List referenceNumberItems) { var vendorOrderNumber = getVendorOrderNumber(referenceNumberItems); referenceNumberItems.remove(vendorOrderNumber); diff --git a/src/main/java/org/folio/dew/batch/acquisitions/edifact/utils/ExportUtils.java b/src/main/java/org/folio/dew/batch/acquisitions/edifact/utils/ExportUtils.java index fb18eea6..03b05d55 100644 --- a/src/main/java/org/folio/dew/batch/acquisitions/edifact/utils/ExportUtils.java +++ b/src/main/java/org/folio/dew/batch/acquisitions/edifact/utils/ExportUtils.java @@ -2,15 +2,24 @@ import static org.folio.dew.domain.dto.ReferenceNumberItem.RefNumberTypeEnum.ORDER_REFERENCE_NUMBER; +import java.util.ArrayList; import java.util.List; import java.util.Optional; +import org.folio.dew.domain.dto.CompositePoLine; import org.folio.dew.domain.dto.ReferenceNumberItem; +import org.folio.dew.domain.dto.VendorDetail; public class ExportUtils { private ExportUtils() { } + public static List getVendorReferenceNumbers(CompositePoLine poLine) { + return Optional.ofNullable(poLine.getVendorDetail()) + .map(VendorDetail::getReferenceNumbers) + .orElse(new ArrayList<>()); + } + public static ReferenceNumberItem getVendorOrderNumber(List referenceNumberItems) { return Optional.ofNullable(referenceNumberItems).orElse(List.of()).stream() .filter(r -> r.getRefNumberType() == ORDER_REFERENCE_NUMBER) @@ -18,4 +27,16 @@ public static ReferenceNumberItem getVendorOrderNumber(List .orElse(null); } + public static String getVendorOrderNumber(CompositePoLine poLine) { + return Optional.ofNullable(getVendorOrderNumber(getVendorReferenceNumbers(poLine))) + .map(ReferenceNumberItem::getRefNumber) + .orElse(null); + } + + public static String getVendorAccountNumber(CompositePoLine poLine) { + return Optional.ofNullable(poLine.getVendorDetail()) + .map(VendorDetail::getVendorAccount) + .orElse(null); + } + } diff --git a/src/test/java/org/folio/dew/batch/acquisitions/edifact/CsvMapperTest.java b/src/test/java/org/folio/dew/batch/acquisitions/edifact/CsvMapperTest.java new file mode 100644 index 00000000..6c83e73f --- /dev/null +++ b/src/test/java/org/folio/dew/batch/acquisitions/edifact/CsvMapperTest.java @@ -0,0 +1,130 @@ +package org.folio.dew.batch.acquisitions.edifact; + +import static org.folio.dew.domain.dto.ExportType.CLAIMS; +import static org.folio.dew.utils.TestUtils.getMockData; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.mockito.AdditionalMatchers.not; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.when; + +import com.fasterxml.jackson.databind.ObjectMapper; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import lombok.extern.log4j.Log4j2; + +import org.folio.dew.batch.acquisitions.edifact.mapper.CsvMapper; +import org.folio.dew.batch.acquisitions.edifact.mapper.ExportResourceMapper; +import org.folio.dew.batch.acquisitions.edifact.services.ConfigurationService; +import org.folio.dew.batch.acquisitions.edifact.services.ExpenseClassService; +import org.folio.dew.batch.acquisitions.edifact.services.HoldingService; +import org.folio.dew.batch.acquisitions.edifact.services.IdentifierTypeService; +import org.folio.dew.batch.acquisitions.edifact.services.LocationService; +import org.folio.dew.batch.acquisitions.edifact.services.MaterialTypeService; +import org.folio.dew.config.JacksonConfiguration; +import org.folio.dew.domain.dto.CompositePurchaseOrder; +import org.folio.dew.domain.dto.ExportType; +import org.folio.dew.domain.dto.Piece; +import org.folio.dew.domain.dto.PieceCollection; +import org.folio.dew.domain.dto.VendorEdiOrdersExportConfig; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.extension.ExtendWith; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.EnumSource; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +@Log4j2 +@ExtendWith(MockitoExtension.class) +class CsvMapperTest { + + private static final Map EXPORT_CSV_PATHS = Map.of( + CLAIMS, "edifact/acquisitions/edifact_claims_result.edi" + ); + + private ObjectMapper objectMapper; + private ExportResourceMapper csvMapper; + + @Mock + private IdentifierTypeService identifierTypeService; + @Mock + private MaterialTypeService materialTypeService; + @Mock + private ExpenseClassService expenseClassService; + @Mock + private LocationService locationService; + @Mock + private HoldingService holdingService; + @Mock + private ConfigurationService configurationService; + + @BeforeEach + void setUp() { + csvMapper = new CsvMapper(); + objectMapper = new JacksonConfiguration().objectMapper(); + + when(identifierTypeService.getIdentifierTypeName("8261054f-be78-422d-bd51-4ed9f33c3422")) + .thenReturn("ISSN", "ISMN", "ISBN", "ISSN", "ISMN", "ISBN"); + when(identifierTypeService.getIdentifierTypeName(not(eq("8261054f-be78-422d-bd51-4ed9f33c3422")))) + .thenReturn("Publisher or distributor number"); + when(materialTypeService.getMaterialTypeName(anyString())) + .thenReturn("Book"); + when(expenseClassService.getExpenseClassCode(anyString())) + .thenReturn("Elec"); + when(locationService.getLocationCodeById(anyString())) + .thenReturn("KU/CC/DI/M"); + when(holdingService.getPermanentLocationByHoldingId(anyString())) + .thenReturn("fcd64ce1-6995-48f0-840e-89ffa2288371"); + when(configurationService.getAddressConfig(any())) + .thenReturn("Bockenheimer Landstr. 134-13"); + } + + @ParameterizedTest + @EnumSource(value = ExportType.class, names = {"CLAIMS"}) + void convertOrdersToEdifact(ExportType type) throws Exception { + String jobName = "123456789012345"; + List compPOs = getTestOrdersFromJson(type); + List pieces = getTestPiecesFromJson(type); + + String csvOutput = csvMapper.convertForExport(compPOs, pieces, getTestEdiConfig(), jobName); + + assertFalse(csvOutput.isEmpty()); + validateCsvOutput(type, csvOutput); + + byte[] csvOutputBytes = csvOutput.getBytes(StandardCharsets.UTF_8); + assertNotNull(csvOutputBytes); + validateCsvOutput(type, new String(csvOutputBytes)); + } + + private VendorEdiOrdersExportConfig getTestEdiConfig() throws IOException { + return objectMapper.readValue(getMockData("edifact/acquisitions/vendorEdiOrdersExportConfig.json"), VendorEdiOrdersExportConfig.class); + } + + private List getTestOrdersFromJson(ExportType type) throws IOException { + List compPOs = new ArrayList<>(); + if (type == CLAIMS) { + compPOs.add(objectMapper.readValue(getMockData("edifact/acquisitions/composite_purchase_order.json"), CompositePurchaseOrder.class)); + compPOs.add(objectMapper.readValue(getMockData("edifact/acquisitions/comprehensive_composite_purchase_order.json"), CompositePurchaseOrder.class)); + compPOs.add(objectMapper.readValue(getMockData("edifact/acquisitions/minimalistic_composite_purchase_order.json"), CompositePurchaseOrder.class)); + } + return compPOs; + } + + private List getTestPiecesFromJson(ExportType type) throws IOException { + return type == CLAIMS + ? objectMapper.readValue(getMockData("edifact/acquisitions/pieces_collection_mixed.json"), PieceCollection.class).getPieces() + : List.of(); + } + + private void validateCsvOutput(ExportType type, String csvOutput) throws IOException { + log.info("Generated CSV file:\n{}", csvOutput); + String csvExpected = getMockData(EXPORT_CSV_PATHS.get(type)); + assertEquals(csvExpected, csvOutput); + } +} diff --git a/src/test/java/org/folio/dew/batch/acquisitions/edifact/EdifactMapperTest.java b/src/test/java/org/folio/dew/batch/acquisitions/edifact/EdifactMapperTest.java index ce936600..5fc1dfa4 100644 --- a/src/test/java/org/folio/dew/batch/acquisitions/edifact/EdifactMapperTest.java +++ b/src/test/java/org/folio/dew/batch/acquisitions/edifact/EdifactMapperTest.java @@ -98,23 +98,14 @@ void convertOrdersToEdifact(ExportType type) throws Exception { List compPOs = getTestOrdersFromJson(type); List pieces = getTestPiecesFromJson(type); - String ediOrder= edifactMapper.convertForExport(compPOs, pieces, getTestEdiConfig(), jobName); + String ediOrder = edifactMapper.convertForExport(compPOs, pieces, getTestEdiConfig(), jobName); assertFalse(ediOrder.isEmpty()); validateEdifactOrders(type, ediOrder, fileIdExpected); - } - - @ParameterizedTest - @EnumSource(value = ExportType.class, names = {"EDIFACT_ORDERS_EXPORT", "CLAIMS"}) - void convertOrdersToEdifactByteArray(ExportType type) throws Exception { - String jobName = "12345"; - List compPOs = getTestOrdersFromJson(type); - List pieces = getTestPiecesFromJson(type); - - byte[] ediOrder = edifactMapper.convertForExport(compPOs, pieces, getTestEdiConfig(), jobName).getBytes(StandardCharsets.UTF_8); - assertNotNull(ediOrder); - validateEdifactOrders(type, new String(ediOrder), jobName); + byte[] ediOrderBytes = ediOrder.getBytes(StandardCharsets.UTF_8); + assertNotNull(ediOrderBytes); + validateEdifactOrders(type, new String(ediOrder), fileIdExpected); } private VendorEdiOrdersExportConfig getTestEdiConfig() throws IOException { From 7ffb7d0f08cf51eb3f13677a7d6a30500a6c318e Mon Sep 17 00:00:00 2001 From: saba_zedginidze Date: Fri, 13 Dec 2024 15:21:43 +0400 Subject: [PATCH 08/17] [MODEXPW-529] Fix failing tests --- src/test/java/org/folio/dew/BaseBatchTest.java | 2 +- .../edifact/jobs/MapToEdifactOrderTaskletTest.java | 1 - .../edifact/jobs/MapToEdifactTaskletAbstractTest.java | 6 ++++-- src/test/resources/edifact/edifactOrdersExport.json | 1 + 4 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/test/java/org/folio/dew/BaseBatchTest.java b/src/test/java/org/folio/dew/BaseBatchTest.java index 4c4e9016..97011fe9 100644 --- a/src/test/java/org/folio/dew/BaseBatchTest.java +++ b/src/test/java/org/folio/dew/BaseBatchTest.java @@ -88,7 +88,7 @@ public abstract class BaseBatchTest { public static final int WIRE_MOCK_PORT = TestSocketUtils.findAvailableTcpPort(); public static WireMockServer wireMockServer; - public static PostgreSQLContainer postgreDBContainer = new PostgreSQLContainer<>("postgres:13"); + public static PostgreSQLContainer postgreDBContainer = new PostgreSQLContainer<>("postgres:16"); @Autowired protected MockMvc mockMvc; diff --git a/src/test/java/org/folio/dew/batch/acquisitions/edifact/jobs/MapToEdifactOrderTaskletTest.java b/src/test/java/org/folio/dew/batch/acquisitions/edifact/jobs/MapToEdifactOrderTaskletTest.java index 34b39d13..0e94b744 100644 --- a/src/test/java/org/folio/dew/batch/acquisitions/edifact/jobs/MapToEdifactOrderTaskletTest.java +++ b/src/test/java/org/folio/dew/batch/acquisitions/edifact/jobs/MapToEdifactOrderTaskletTest.java @@ -46,7 +46,6 @@ protected void setUp() { edifactExportJob = edifactOrdersExportJob; orders = objectMapper.readValue(getMockData(SAMPLE_PURCHASE_ORDERS_PATH), PurchaseOrderCollection.class).getPurchaseOrders(); poLines = objectMapper.readValue(getMockData(SAMPLE_PO_LINES_PATH), PoLineCollection.class).getPoLines(); - } @Test diff --git a/src/test/java/org/folio/dew/batch/acquisitions/edifact/jobs/MapToEdifactTaskletAbstractTest.java b/src/test/java/org/folio/dew/batch/acquisitions/edifact/jobs/MapToEdifactTaskletAbstractTest.java index d56699dc..530d1c74 100644 --- a/src/test/java/org/folio/dew/batch/acquisitions/edifact/jobs/MapToEdifactTaskletAbstractTest.java +++ b/src/test/java/org/folio/dew/batch/acquisitions/edifact/jobs/MapToEdifactTaskletAbstractTest.java @@ -14,7 +14,7 @@ import java.util.UUID; import org.folio.dew.BaseBatchTest; -import org.folio.dew.batch.acquisitions.edifact.mapper.EdifactMapper; +import org.folio.dew.batch.acquisitions.edifact.mapper.ExportResourceMapper; import org.folio.dew.batch.acquisitions.edifact.services.OrdersService; import org.folio.dew.client.DataExportSpringClient; import org.junit.jupiter.api.Test; @@ -26,6 +26,7 @@ import org.springframework.batch.core.JobParametersBuilder; import org.springframework.batch.test.JobLauncherTestUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.test.mock.mockito.MockBean; import com.fasterxml.jackson.databind.ObjectMapper; @@ -46,7 +47,8 @@ abstract class MapToEdifactTaskletAbstractTest extends BaseBatchTest { @MockBean protected DataExportSpringClient dataExportSpringClient; @MockBean - protected EdifactMapper edifactMapper; + @Qualifier("edifactMapper") + protected ExportResourceMapper edifactMapper; @Autowired protected ObjectMapper objectMapper; protected Job edifactExportJob; diff --git a/src/test/resources/edifact/edifactOrdersExport.json b/src/test/resources/edifact/edifactOrdersExport.json index 4e35e0fe..4ac93e09 100644 --- a/src/test/resources/edifact/edifactOrdersExport.json +++ b/src/test/resources/edifact/edifactOrdersExport.json @@ -2,6 +2,7 @@ "vendorId": "d0fb5aa0-cdf1-11e8-a8d5-f2801f1b9fd1", "configName": "EDIFACT 1", "configDescription": "EDI configuration for testing export", + "fileFormat": "EDI", "ediConfig": { "accountNoList": [ "BRXXXXX-01" From f73ff4555f5cca04d783bd52dd5fa4435d35f293 Mon Sep 17 00:00:00 2001 From: saba_zedginidze Date: Fri, 13 Dec 2024 15:31:57 +0400 Subject: [PATCH 09/17] [MODEXPW-529] Move tests to appropriate packages --- .../acquisitions/edifact/{ => mapper}/EdifactMapperTest.java | 2 +- .../edifact/{ => services}/ConfigurationServiceTest.java | 3 +-- .../edifact/{ => services}/ExpenseClassServiceTest.java | 3 +-- .../edifact/{ => services}/HoldingServiceTest.java | 3 +-- .../edifact/{ => services}/IdentifierTypeServiceTest.java | 3 +-- .../edifact/{ => services}/LocationServiceTest.java | 3 +-- .../edifact/{ => services}/MaterialTypeServiceTest.java | 3 +-- .../acquisitions/edifact/{ => services}/OrderServiceTest.java | 3 +-- 8 files changed, 8 insertions(+), 15 deletions(-) rename src/test/java/org/folio/dew/batch/acquisitions/edifact/{ => mapper}/EdifactMapperTest.java (99%) rename src/test/java/org/folio/dew/batch/acquisitions/edifact/{ => services}/ConfigurationServiceTest.java (90%) rename src/test/java/org/folio/dew/batch/acquisitions/edifact/{ => services}/ExpenseClassServiceTest.java (84%) rename src/test/java/org/folio/dew/batch/acquisitions/edifact/{ => services}/HoldingServiceTest.java (94%) rename src/test/java/org/folio/dew/batch/acquisitions/edifact/{ => services}/IdentifierTypeServiceTest.java (91%) rename src/test/java/org/folio/dew/batch/acquisitions/edifact/{ => services}/LocationServiceTest.java (80%) rename src/test/java/org/folio/dew/batch/acquisitions/edifact/{ => services}/MaterialTypeServiceTest.java (80%) rename src/test/java/org/folio/dew/batch/acquisitions/edifact/{ => services}/OrderServiceTest.java (96%) diff --git a/src/test/java/org/folio/dew/batch/acquisitions/edifact/EdifactMapperTest.java b/src/test/java/org/folio/dew/batch/acquisitions/edifact/mapper/EdifactMapperTest.java similarity index 99% rename from src/test/java/org/folio/dew/batch/acquisitions/edifact/EdifactMapperTest.java rename to src/test/java/org/folio/dew/batch/acquisitions/edifact/mapper/EdifactMapperTest.java index 5fc1dfa4..e079f540 100644 --- a/src/test/java/org/folio/dew/batch/acquisitions/edifact/EdifactMapperTest.java +++ b/src/test/java/org/folio/dew/batch/acquisitions/edifact/mapper/EdifactMapperTest.java @@ -1,4 +1,4 @@ -package org.folio.dew.batch.acquisitions.edifact; +package org.folio.dew.batch.acquisitions.edifact.mapper; import static org.folio.dew.domain.dto.ExportType.CLAIMS; import static org.folio.dew.domain.dto.ExportType.EDIFACT_ORDERS_EXPORT; diff --git a/src/test/java/org/folio/dew/batch/acquisitions/edifact/ConfigurationServiceTest.java b/src/test/java/org/folio/dew/batch/acquisitions/edifact/services/ConfigurationServiceTest.java similarity index 90% rename from src/test/java/org/folio/dew/batch/acquisitions/edifact/ConfigurationServiceTest.java rename to src/test/java/org/folio/dew/batch/acquisitions/edifact/services/ConfigurationServiceTest.java index b92a0323..6684b61d 100644 --- a/src/test/java/org/folio/dew/batch/acquisitions/edifact/ConfigurationServiceTest.java +++ b/src/test/java/org/folio/dew/batch/acquisitions/edifact/services/ConfigurationServiceTest.java @@ -1,4 +1,4 @@ -package org.folio.dew.batch.acquisitions.edifact; +package org.folio.dew.batch.acquisitions.edifact.services; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -6,7 +6,6 @@ import java.util.stream.Stream; import org.folio.dew.BaseBatchTest; -import org.folio.dew.batch.acquisitions.edifact.services.ConfigurationService; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; diff --git a/src/test/java/org/folio/dew/batch/acquisitions/edifact/ExpenseClassServiceTest.java b/src/test/java/org/folio/dew/batch/acquisitions/edifact/services/ExpenseClassServiceTest.java similarity index 84% rename from src/test/java/org/folio/dew/batch/acquisitions/edifact/ExpenseClassServiceTest.java rename to src/test/java/org/folio/dew/batch/acquisitions/edifact/services/ExpenseClassServiceTest.java index bf3b3c3c..bc65df2f 100644 --- a/src/test/java/org/folio/dew/batch/acquisitions/edifact/ExpenseClassServiceTest.java +++ b/src/test/java/org/folio/dew/batch/acquisitions/edifact/services/ExpenseClassServiceTest.java @@ -1,9 +1,8 @@ -package org.folio.dew.batch.acquisitions.edifact; +package org.folio.dew.batch.acquisitions.edifact.services; import static org.junit.jupiter.api.Assertions.assertEquals; import org.folio.dew.BaseBatchTest; -import org.folio.dew.batch.acquisitions.edifact.services.ExpenseClassService; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; diff --git a/src/test/java/org/folio/dew/batch/acquisitions/edifact/HoldingServiceTest.java b/src/test/java/org/folio/dew/batch/acquisitions/edifact/services/HoldingServiceTest.java similarity index 94% rename from src/test/java/org/folio/dew/batch/acquisitions/edifact/HoldingServiceTest.java rename to src/test/java/org/folio/dew/batch/acquisitions/edifact/services/HoldingServiceTest.java index 80f825d6..e2c765bc 100644 --- a/src/test/java/org/folio/dew/batch/acquisitions/edifact/HoldingServiceTest.java +++ b/src/test/java/org/folio/dew/batch/acquisitions/edifact/services/HoldingServiceTest.java @@ -1,9 +1,8 @@ -package org.folio.dew.batch.acquisitions.edifact; +package org.folio.dew.batch.acquisitions.edifact.services; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; -import org.folio.dew.batch.acquisitions.edifact.services.HoldingService; import org.folio.dew.client.HoldingClient; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; diff --git a/src/test/java/org/folio/dew/batch/acquisitions/edifact/IdentifierTypeServiceTest.java b/src/test/java/org/folio/dew/batch/acquisitions/edifact/services/IdentifierTypeServiceTest.java similarity index 91% rename from src/test/java/org/folio/dew/batch/acquisitions/edifact/IdentifierTypeServiceTest.java rename to src/test/java/org/folio/dew/batch/acquisitions/edifact/services/IdentifierTypeServiceTest.java index 8bf22cf9..307e9685 100644 --- a/src/test/java/org/folio/dew/batch/acquisitions/edifact/IdentifierTypeServiceTest.java +++ b/src/test/java/org/folio/dew/batch/acquisitions/edifact/services/IdentifierTypeServiceTest.java @@ -1,10 +1,9 @@ -package org.folio.dew.batch.acquisitions.edifact; +package org.folio.dew.batch.acquisitions.edifact.services; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.when; -import org.folio.dew.batch.acquisitions.edifact.services.IdentifierTypeService; import org.folio.dew.client.IdentifierTypeClient; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; diff --git a/src/test/java/org/folio/dew/batch/acquisitions/edifact/LocationServiceTest.java b/src/test/java/org/folio/dew/batch/acquisitions/edifact/services/LocationServiceTest.java similarity index 80% rename from src/test/java/org/folio/dew/batch/acquisitions/edifact/LocationServiceTest.java rename to src/test/java/org/folio/dew/batch/acquisitions/edifact/services/LocationServiceTest.java index e46f247e..be6a89c4 100644 --- a/src/test/java/org/folio/dew/batch/acquisitions/edifact/LocationServiceTest.java +++ b/src/test/java/org/folio/dew/batch/acquisitions/edifact/services/LocationServiceTest.java @@ -1,9 +1,8 @@ -package org.folio.dew.batch.acquisitions.edifact; +package org.folio.dew.batch.acquisitions.edifact.services; import static org.junit.jupiter.api.Assertions.assertEquals; import org.folio.dew.BaseBatchTest; -import org.folio.dew.batch.acquisitions.edifact.services.LocationService; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; diff --git a/src/test/java/org/folio/dew/batch/acquisitions/edifact/MaterialTypeServiceTest.java b/src/test/java/org/folio/dew/batch/acquisitions/edifact/services/MaterialTypeServiceTest.java similarity index 80% rename from src/test/java/org/folio/dew/batch/acquisitions/edifact/MaterialTypeServiceTest.java rename to src/test/java/org/folio/dew/batch/acquisitions/edifact/services/MaterialTypeServiceTest.java index e1ef6de3..7b919d49 100644 --- a/src/test/java/org/folio/dew/batch/acquisitions/edifact/MaterialTypeServiceTest.java +++ b/src/test/java/org/folio/dew/batch/acquisitions/edifact/services/MaterialTypeServiceTest.java @@ -1,9 +1,8 @@ -package org.folio.dew.batch.acquisitions.edifact; +package org.folio.dew.batch.acquisitions.edifact.services; import static org.junit.jupiter.api.Assertions.assertEquals; import org.folio.dew.BaseBatchTest; -import org.folio.dew.batch.acquisitions.edifact.services.MaterialTypeService; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; diff --git a/src/test/java/org/folio/dew/batch/acquisitions/edifact/OrderServiceTest.java b/src/test/java/org/folio/dew/batch/acquisitions/edifact/services/OrderServiceTest.java similarity index 96% rename from src/test/java/org/folio/dew/batch/acquisitions/edifact/OrderServiceTest.java rename to src/test/java/org/folio/dew/batch/acquisitions/edifact/services/OrderServiceTest.java index a00df776..7a38d5df 100644 --- a/src/test/java/org/folio/dew/batch/acquisitions/edifact/OrderServiceTest.java +++ b/src/test/java/org/folio/dew/batch/acquisitions/edifact/services/OrderServiceTest.java @@ -1,6 +1,5 @@ -package org.folio.dew.batch.acquisitions.edifact; +package org.folio.dew.batch.acquisitions.edifact.services; -import org.folio.dew.batch.acquisitions.edifact.services.OrdersService; import org.folio.dew.client.OrdersStorageClient; import org.folio.dew.domain.dto.PoLine; import org.folio.dew.domain.dto.PoLineCollection; From eb25f2602356deac82c1f6745be6ad4358fe632c Mon Sep 17 00:00:00 2001 From: saba_zedginidze Date: Fri, 13 Dec 2024 15:48:38 +0400 Subject: [PATCH 10/17] [MODEXPW-529] Finish CsvMapper test, todo 2 field extractions --- .../edifact/mapper/CsvMapper.java | 2 +- .../mapper/converter/ClaimCsvFields.java | 2 +- .../edifact/{ => mapper}/CsvMapperTest.java | 29 +++---------------- .../acquisitions/csv_claims_result.csv | 8 +++++ 4 files changed, 14 insertions(+), 27 deletions(-) rename src/test/java/org/folio/dew/batch/acquisitions/edifact/{ => mapper}/CsvMapperTest.java (75%) create mode 100644 src/test/resources/edifact/acquisitions/csv_claims_result.csv diff --git a/src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/CsvMapper.java b/src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/CsvMapper.java index e75319e2..81aaf82a 100644 --- a/src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/CsvMapper.java +++ b/src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/CsvMapper.java @@ -17,7 +17,7 @@ public class CsvMapper implements ExportResourceMapper { @Override public String convertForExport(List compPOs, List pieces, VendorEdiOrdersExportConfig ediExportConfig, String jobName) { var csvConverter = new ClaimCsvConverter(); - var csvResult = new StringBuilder(csvConverter.getCsvHeaders()); + var csvResult = new StringBuilder(csvConverter.getCsvHeaders()).append(LINE_BREAK); getClaimEntries(compPOs, pieces).stream() .map(csvConverter::convertEntryToCsv) .map(line -> line.concat(LINE_BREAK)) diff --git a/src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/converter/ClaimCsvFields.java b/src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/converter/ClaimCsvFields.java index bce5d6d9..009c47fe 100644 --- a/src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/converter/ClaimCsvFields.java +++ b/src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/converter/ClaimCsvFields.java @@ -18,7 +18,7 @@ public enum ClaimCsvFields implements ExtractableField pair.getKey().getPoLineNumber()), ORDER_NUMBER("Vendor order number", (pair) -> getVendorOrderNumber(pair.getKey())), ACCOUNT_NUMBER("Account number", (pair) -> getVendorAccountNumber(pair.getKey())), - TITLE("Title", (pair) -> pair.getValue().getTitleId()), + TITLE("Title from piece", (pair) -> "CHANGEME"), // FIXME: piece.titleId | poLine.titleOrPackage | title from inventory by piece.titleId DISPLAY_SUMMARY("Display summary", (pair) -> pair.getValue().getDisplaySummary()), CHRONOLOGY("Chronology", (pair) -> pair.getValue().getChronology()), ENUMERATION("Enumeration", (pair) -> pair.getValue().getEnumeration()), diff --git a/src/test/java/org/folio/dew/batch/acquisitions/edifact/CsvMapperTest.java b/src/test/java/org/folio/dew/batch/acquisitions/edifact/mapper/CsvMapperTest.java similarity index 75% rename from src/test/java/org/folio/dew/batch/acquisitions/edifact/CsvMapperTest.java rename to src/test/java/org/folio/dew/batch/acquisitions/edifact/mapper/CsvMapperTest.java index 6c83e73f..dbc7215d 100644 --- a/src/test/java/org/folio/dew/batch/acquisitions/edifact/CsvMapperTest.java +++ b/src/test/java/org/folio/dew/batch/acquisitions/edifact/mapper/CsvMapperTest.java @@ -1,15 +1,10 @@ -package org.folio.dew.batch.acquisitions.edifact; +package org.folio.dew.batch.acquisitions.edifact.mapper; import static org.folio.dew.domain.dto.ExportType.CLAIMS; import static org.folio.dew.utils.TestUtils.getMockData; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.mockito.AdditionalMatchers.not; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.when; import com.fasterxml.jackson.databind.ObjectMapper; import java.io.IOException; @@ -19,8 +14,6 @@ import java.util.Map; import lombok.extern.log4j.Log4j2; -import org.folio.dew.batch.acquisitions.edifact.mapper.CsvMapper; -import org.folio.dew.batch.acquisitions.edifact.mapper.ExportResourceMapper; import org.folio.dew.batch.acquisitions.edifact.services.ConfigurationService; import org.folio.dew.batch.acquisitions.edifact.services.ExpenseClassService; import org.folio.dew.batch.acquisitions.edifact.services.HoldingService; @@ -45,7 +38,7 @@ class CsvMapperTest { private static final Map EXPORT_CSV_PATHS = Map.of( - CLAIMS, "edifact/acquisitions/edifact_claims_result.edi" + CLAIMS, "edifact/acquisitions/csv_claims_result.csv" ); private ObjectMapper objectMapper; @@ -68,26 +61,11 @@ class CsvMapperTest { void setUp() { csvMapper = new CsvMapper(); objectMapper = new JacksonConfiguration().objectMapper(); - - when(identifierTypeService.getIdentifierTypeName("8261054f-be78-422d-bd51-4ed9f33c3422")) - .thenReturn("ISSN", "ISMN", "ISBN", "ISSN", "ISMN", "ISBN"); - when(identifierTypeService.getIdentifierTypeName(not(eq("8261054f-be78-422d-bd51-4ed9f33c3422")))) - .thenReturn("Publisher or distributor number"); - when(materialTypeService.getMaterialTypeName(anyString())) - .thenReturn("Book"); - when(expenseClassService.getExpenseClassCode(anyString())) - .thenReturn("Elec"); - when(locationService.getLocationCodeById(anyString())) - .thenReturn("KU/CC/DI/M"); - when(holdingService.getPermanentLocationByHoldingId(anyString())) - .thenReturn("fcd64ce1-6995-48f0-840e-89ffa2288371"); - when(configurationService.getAddressConfig(any())) - .thenReturn("Bockenheimer Landstr. 134-13"); } @ParameterizedTest @EnumSource(value = ExportType.class, names = {"CLAIMS"}) - void convertOrdersToEdifact(ExportType type) throws Exception { + void testConvertForExportCsv(ExportType type) throws Exception { String jobName = "123456789012345"; List compPOs = getTestOrdersFromJson(type); List pieces = getTestPiecesFromJson(type); @@ -127,4 +105,5 @@ private void validateCsvOutput(ExportType type, String csvOutput) throws IOExcep String csvExpected = getMockData(EXPORT_CSV_PATHS.get(type)); assertEquals(csvExpected, csvOutput); } + } diff --git a/src/test/resources/edifact/acquisitions/csv_claims_result.csv b/src/test/resources/edifact/acquisitions/csv_claims_result.csv new file mode 100644 index 00000000..e68ed42a --- /dev/null +++ b/src/test/resources/edifact/acquisitions/csv_claims_result.csv @@ -0,0 +1,8 @@ +POL number,Vendor order number,Account number,Title from piece,Display summary,Chronology,Enumeration,Quantity +10000-1,ORD1000,BRXXXXX-01,CHANGEME,S1,C1,E1,CHANGEME +10000-1,ORD1000,BRXXXXX-01,CHANGEME,S2,C2,,CHANGEME +10001-1,ORD1001,BRXXXXX-01,CHANGEME,S3,,E3,CHANGEME +10001-2,ORD1002,BRXXXXX-01,CHANGEME,,C4,E4,CHANGEME +10002-1,,,CHANGEME,S5,,E5,CHANGEME +10002-1,,,CHANGEME,,C5,,CHANGEME +10002-1,,,CHANGEME,,,,CHANGEME From ff8bbabba076673eb2c20642b0fedefa89503303 Mon Sep 17 00:00:00 2001 From: saba_zedginidze Date: Fri, 13 Dec 2024 16:23:36 +0400 Subject: [PATCH 11/17] [MODEXPW-529] Fix sonar issues --- .../edifact/mapper/EdifactMapper.java | 51 +++++++++---------- .../converter/AbstractCsvConverter.java | 4 +- .../mapper/converter/ClaimCsvFields.java | 16 +++--- .../edifact/services/HoldingServiceTest.java | 2 +- 4 files changed, 36 insertions(+), 37 deletions(-) diff --git a/src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/EdifactMapper.java b/src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/EdifactMapper.java index a20d4ca5..a08c23fb 100644 --- a/src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/EdifactMapper.java +++ b/src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/EdifactMapper.java @@ -32,34 +32,33 @@ public String convertForExport(List compPOs, List EDIOutputFactory factory = EDIOutputFactory.newFactory(); factory.setProperty(EDIOutputFactory.PRETTY_PRINT, true); - EDIStreamWriter writer = factory.createEDIStreamWriter(stream); - - // Count of messages (one message per purchase order) - int messageCount = 0; - writer.startInterchange(); - writeStartFile(writer); - - EdiFileConfig ediFileConfig = new EdiFileConfig(); - ediFileConfig.setFileId(StringUtils.right(jobName, 14)); - ediFileConfig.setLibEdiCode(ediExportConfig.getEdiConfig().getLibEdiCode()); - ediFileConfig.setLibEdiType(ediExportConfig.getEdiConfig().getLibEdiType().getValue().substring(0, 3)); - ediFileConfig.setVendorEdiCode(ediExportConfig.getEdiConfig().getVendorEdiCode()); - ediFileConfig.setVendorEdiType(ediExportConfig.getEdiConfig().getVendorEdiType().getValue().substring(0, 3)); - - writeInterchangeHeader(writer, ediFileConfig); - - var poLineIdToPieces = pieces.stream().collect(groupingBy(Piece::getPoLineId)); - // Purchase orders - for (CompositePurchaseOrder compPO : compPOs) { - compOrderEdiConverter.convertPOtoEdifact(writer, compPO, poLineIdToPieces, ediFileConfig); - messageCount++; + try (EDIStreamWriter writer = factory.createEDIStreamWriter(stream)) { + // Count of messages (one message per purchase order) + int messageCount = 0; + writer.startInterchange(); + writeStartFile(writer); + + EdiFileConfig ediFileConfig = new EdiFileConfig(); + ediFileConfig.setFileId(StringUtils.right(jobName, 14)); + ediFileConfig.setLibEdiCode(ediExportConfig.getEdiConfig().getLibEdiCode()); + ediFileConfig.setLibEdiType(ediExportConfig.getEdiConfig().getLibEdiType().getValue().substring(0, 3)); + ediFileConfig.setVendorEdiCode(ediExportConfig.getEdiConfig().getVendorEdiCode()); + ediFileConfig.setVendorEdiType(ediExportConfig.getEdiConfig().getVendorEdiType().getValue().substring(0, 3)); + + writeInterchangeHeader(writer, ediFileConfig); + + var poLineIdToPieces = pieces.stream().collect(groupingBy(Piece::getPoLineId)); + // Purchase orders + for (CompositePurchaseOrder compPO : compPOs) { + compOrderEdiConverter.convertPOtoEdifact(writer, compPO, poLineIdToPieces, ediFileConfig); + messageCount++; + } + + writeInterchangeFooter(writer, ediFileConfig.getFileId(), messageCount); + writer.endInterchange(); + return stream.toString(); } - writeInterchangeFooter(writer, ediFileConfig.getFileId(), messageCount); - writer.endInterchange(); - writer.close(); - - return stream.toString(); } // Start of file - Can contain multiple order messages diff --git a/src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/converter/AbstractCsvConverter.java b/src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/converter/AbstractCsvConverter.java index 379a244c..768c5d3f 100644 --- a/src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/converter/AbstractCsvConverter.java +++ b/src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/converter/AbstractCsvConverter.java @@ -13,11 +13,11 @@ public abstract class AbstractCsvConverter { private final DelimitedLineAggregator lineAggregator; private final String delimiter; - public AbstractCsvConverter() { + protected AbstractCsvConverter() { this(COMMA); } - public AbstractCsvConverter(String delimiter) { + protected AbstractCsvConverter(String delimiter) { this.delimiter = delimiter; this.lineAggregator = new DelimitedLineAggregator<>(); lineAggregator.setDelimiter(delimiter); diff --git a/src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/converter/ClaimCsvFields.java b/src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/converter/ClaimCsvFields.java index 009c47fe..c4e5b617 100644 --- a/src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/converter/ClaimCsvFields.java +++ b/src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/converter/ClaimCsvFields.java @@ -15,14 +15,14 @@ @AllArgsConstructor public enum ClaimCsvFields implements ExtractableField, String> { - POL_NUMBER("POL number", (pair) -> pair.getKey().getPoLineNumber()), - ORDER_NUMBER("Vendor order number", (pair) -> getVendorOrderNumber(pair.getKey())), - ACCOUNT_NUMBER("Account number", (pair) -> getVendorAccountNumber(pair.getKey())), - TITLE("Title from piece", (pair) -> "CHANGEME"), // FIXME: piece.titleId | poLine.titleOrPackage | title from inventory by piece.titleId - DISPLAY_SUMMARY("Display summary", (pair) -> pair.getValue().getDisplaySummary()), - CHRONOLOGY("Chronology", (pair) -> pair.getValue().getChronology()), - ENUMERATION("Enumeration", (pair) -> pair.getValue().getEnumeration()), - QUANTITY("Quantity", (pair) -> "CHANGEME"); // FIXME: implement quantity extraction + POL_NUMBER("POL number", pair -> pair.getKey().getPoLineNumber()), + ORDER_NUMBER("Vendor order number", pair -> getVendorOrderNumber(pair.getKey())), + ACCOUNT_NUMBER("Account number", pair -> getVendorAccountNumber(pair.getKey())), + TITLE("Title from piece", pair -> "CHANGEME"), // FIXME: piece.titleId | poLine.titleOrPackage | title from inventory by piece.titleId + DISPLAY_SUMMARY("Display summary", pair -> pair.getValue().getDisplaySummary()), + CHRONOLOGY("Chronology", pair -> pair.getValue().getChronology()), + ENUMERATION("Enumeration", pair -> pair.getValue().getEnumeration()), + QUANTITY("Quantity", pair -> "CHANGEME"); // FIXME: implement quantity extraction @Getter private final String name; diff --git a/src/test/java/org/folio/dew/batch/acquisitions/edifact/services/HoldingServiceTest.java b/src/test/java/org/folio/dew/batch/acquisitions/edifact/services/HoldingServiceTest.java index e2c765bc..8208e7fd 100644 --- a/src/test/java/org/folio/dew/batch/acquisitions/edifact/services/HoldingServiceTest.java +++ b/src/test/java/org/folio/dew/batch/acquisitions/edifact/services/HoldingServiceTest.java @@ -43,7 +43,7 @@ void getInstanceIdByHoldingShouldReturnCorrectInstanceId() throws JsonProcessing } @Test - void getInstanceIdByHoldingShouldReturnCorrectEmptyStringWhenNull() throws JsonProcessingException { + void getInstanceIdByHoldingShouldReturnCorrectEmptyStringWhenNull() { String actual = holdingService.getInstanceIdByHolding(null); assertTrue(actual.isEmpty()); } From 75fedad98613530cb1be5425ce26941b933d6893 Mon Sep 17 00:00:00 2001 From: saba_zedginidze Date: Mon, 16 Dec 2024 15:23:22 +0400 Subject: [PATCH 12/17] [MODEXPW-529] Add title extraction logic --- .../edifact/config/ExportConfig.java | 11 ++++++-- .../edifact/mapper/CsvMapper.java | 11 +++++--- .../converter/AbstractCsvConverter.java | 12 ++++++--- .../mapper/converter/ClaimCsvConverter.java | 19 +++++++++++++ .../mapper/converter/ClaimCsvFields.java | 3 ++- .../edifact/services/OrdersService.java | 10 +++++++ .../edifact/utils/ExportUtils.java | 4 +++ .../folio/dew/client/OrdersStorageClient.java | 5 ++++ .../resources/swagger.api/order-export.yaml | 2 ++ .../edifact/mapper/CsvMapperTest.java | 27 +++++++------------ .../acquisitions/csv_claims_result.csv | 14 +++++----- 11 files changed, 83 insertions(+), 35 deletions(-) diff --git a/src/main/java/org/folio/dew/batch/acquisitions/edifact/config/ExportConfig.java b/src/main/java/org/folio/dew/batch/acquisitions/edifact/config/ExportConfig.java index e67051c1..a33044ef 100644 --- a/src/main/java/org/folio/dew/batch/acquisitions/edifact/config/ExportConfig.java +++ b/src/main/java/org/folio/dew/batch/acquisitions/edifact/config/ExportConfig.java @@ -2,6 +2,7 @@ import org.folio.dew.batch.acquisitions.edifact.mapper.CsvMapper; import org.folio.dew.batch.acquisitions.edifact.mapper.ExportResourceMapper; +import org.folio.dew.batch.acquisitions.edifact.mapper.converter.ClaimCsvConverter; import org.folio.dew.batch.acquisitions.edifact.mapper.converter.CompOrderEdiConverter; import org.folio.dew.batch.acquisitions.edifact.mapper.converter.CompPoLineEdiConverter; import org.folio.dew.batch.acquisitions.edifact.mapper.EdifactMapper; @@ -11,6 +12,7 @@ import org.folio.dew.batch.acquisitions.edifact.services.IdentifierTypeService; import org.folio.dew.batch.acquisitions.edifact.services.LocationService; import org.folio.dew.batch.acquisitions.edifact.services.MaterialTypeService; +import org.folio.dew.batch.acquisitions.edifact.services.OrdersService; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; @@ -36,8 +38,13 @@ ExportResourceMapper edifactMapper(CompOrderEdiConverter compOrderEdiConverter) } @Bean - ExportResourceMapper csvMapper() { - return new CsvMapper(); + ClaimCsvConverter claimCsvConverter(OrdersService ordersService) { + return new ClaimCsvConverter(ordersService); + } + + @Bean + ExportResourceMapper csvMapper(ClaimCsvConverter claimCsvConverter) { + return new CsvMapper(claimCsvConverter); } } diff --git a/src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/CsvMapper.java b/src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/CsvMapper.java index 81aaf82a..c4e01e62 100644 --- a/src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/CsvMapper.java +++ b/src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/CsvMapper.java @@ -14,12 +14,17 @@ public class CsvMapper implements ExportResourceMapper { + private final ClaimCsvConverter claimCsvConverter; + + public CsvMapper(ClaimCsvConverter claimCsvConverter) { + this.claimCsvConverter = claimCsvConverter; + } + @Override public String convertForExport(List compPOs, List pieces, VendorEdiOrdersExportConfig ediExportConfig, String jobName) { - var csvConverter = new ClaimCsvConverter(); - var csvResult = new StringBuilder(csvConverter.getCsvHeaders()).append(LINE_BREAK); + var csvResult = new StringBuilder(claimCsvConverter.getCsvHeaders()).append(LINE_BREAK); getClaimEntries(compPOs, pieces).stream() - .map(csvConverter::convertEntryToCsv) + .map(claimCsvConverter::convertEntryToCsv) .map(line -> line.concat(LINE_BREAK)) .forEachOrdered(csvResult::append); return csvResult.toString(); diff --git a/src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/converter/AbstractCsvConverter.java b/src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/converter/AbstractCsvConverter.java index 768c5d3f..fbef31eb 100644 --- a/src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/converter/AbstractCsvConverter.java +++ b/src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/converter/AbstractCsvConverter.java @@ -1,11 +1,12 @@ package org.folio.dew.batch.acquisitions.edifact.mapper.converter; +import static java.util.Optional.ofNullable; import static org.folio.dew.utils.Constants.COMMA; import static org.folio.dew.utils.Constants.QUOTE; +import static org.folio.dew.utils.CsvHelper.escapeDelimiter; import java.util.Arrays; -import org.folio.dew.utils.CsvHelper; import org.springframework.batch.item.file.transform.DelimitedLineAggregator; public abstract class AbstractCsvConverter { @@ -29,12 +30,15 @@ public String getCsvHeaders() { public String convertEntryToCsv(T entry) { return lineAggregator.doAggregate(Arrays.stream(getFields()) - .map(field -> field.extract(entry)) - .map(field -> field == null ? "" : field) - .map(field -> CsvHelper.escapeDelimiter(field, delimiter, QUOTE)) + .map(field -> ofNullable(extractField(entry, field)).orElse("")) + .map(field -> escapeDelimiter(field, delimiter, QUOTE)) .toArray()); } + protected String extractField(T entry, ExtractableField field) { + return field.extract(entry); + } + protected abstract ExtractableField[] getFields(); protected abstract String[] getHeaders(); diff --git a/src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/converter/ClaimCsvConverter.java b/src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/converter/ClaimCsvConverter.java index 06a1689a..b8d6b2b2 100644 --- a/src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/converter/ClaimCsvConverter.java +++ b/src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/converter/ClaimCsvConverter.java @@ -1,13 +1,21 @@ package org.folio.dew.batch.acquisitions.edifact.mapper.converter; import java.util.Arrays; +import java.util.Optional; import org.apache.commons.lang3.tuple.Pair; +import org.folio.dew.batch.acquisitions.edifact.services.OrdersService; import org.folio.dew.domain.dto.CompositePoLine; import org.folio.dew.domain.dto.Piece; public class ClaimCsvConverter extends AbstractCsvConverter> { + private final OrdersService ordersService; + + public ClaimCsvConverter(OrdersService ordersService) { + this.ordersService = ordersService; + } + @Override protected ExtractableField, String>[] getFields() { return ClaimCsvFields.values(); @@ -20,4 +28,15 @@ protected String[] getHeaders() { .toArray(String[]::new); } + @Override + protected String extractField(Pair entry, ExtractableField, String> field) { + return Optional.ofNullable(super.extractField(entry, field)) + .orElseGet(() -> { + if (field == ClaimCsvFields.TITLE) { + return ordersService.getTitleById(entry.getValue().getTitleId()).getTitle(); + } + return null; + }); + } + } diff --git a/src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/converter/ClaimCsvFields.java b/src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/converter/ClaimCsvFields.java index c4e5b617..d9c76338 100644 --- a/src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/converter/ClaimCsvFields.java +++ b/src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/converter/ClaimCsvFields.java @@ -1,5 +1,6 @@ package org.folio.dew.batch.acquisitions.edifact.mapper.converter; +import static org.folio.dew.batch.acquisitions.edifact.utils.ExportUtils.getTitle; import static org.folio.dew.batch.acquisitions.edifact.utils.ExportUtils.getVendorAccountNumber; import static org.folio.dew.batch.acquisitions.edifact.utils.ExportUtils.getVendorOrderNumber; @@ -18,7 +19,7 @@ public enum ClaimCsvFields implements ExtractableField pair.getKey().getPoLineNumber()), ORDER_NUMBER("Vendor order number", pair -> getVendorOrderNumber(pair.getKey())), ACCOUNT_NUMBER("Account number", pair -> getVendorAccountNumber(pair.getKey())), - TITLE("Title from piece", pair -> "CHANGEME"), // FIXME: piece.titleId | poLine.titleOrPackage | title from inventory by piece.titleId + TITLE("Title from piece", pair -> getTitle(pair.getKey())), DISPLAY_SUMMARY("Display summary", pair -> pair.getValue().getDisplaySummary()), CHRONOLOGY("Chronology", pair -> pair.getValue().getChronology()), ENUMERATION("Enumeration", pair -> pair.getValue().getEnumeration()), diff --git a/src/main/java/org/folio/dew/batch/acquisitions/edifact/services/OrdersService.java b/src/main/java/org/folio/dew/batch/acquisitions/edifact/services/OrdersService.java index fe0ba2d2..a9ce66d8 100644 --- a/src/main/java/org/folio/dew/batch/acquisitions/edifact/services/OrdersService.java +++ b/src/main/java/org/folio/dew/batch/acquisitions/edifact/services/OrdersService.java @@ -4,10 +4,12 @@ import static org.folio.dew.utils.QueryUtils.convertIdsToCqlQuery; import org.folio.dew.client.OrdersStorageClient; +import org.folio.dew.domain.dto.OrdersTitle; import org.folio.dew.domain.dto.Piece; import org.folio.dew.domain.dto.PoLine; import org.folio.dew.domain.dto.PurchaseOrder; import org.folio.dew.utils.QueryUtils; +import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; import lombok.RequiredArgsConstructor; @@ -71,4 +73,12 @@ public List getPiecesByIdsAndReceivingStatus(List pieceIds, Piece return pieces; } + @Cacheable("titleIds") + public OrdersTitle getTitleById(String titleId) { + log.debug("getTitleById: Fetching title: {}", titleId); + var title = ordersStorageClient.getTitleById(titleId); + log.debug("getTitleById:: Fetched title: {}", title); + return title; + } + } diff --git a/src/main/java/org/folio/dew/batch/acquisitions/edifact/utils/ExportUtils.java b/src/main/java/org/folio/dew/batch/acquisitions/edifact/utils/ExportUtils.java index 03b05d55..03603088 100644 --- a/src/main/java/org/folio/dew/batch/acquisitions/edifact/utils/ExportUtils.java +++ b/src/main/java/org/folio/dew/batch/acquisitions/edifact/utils/ExportUtils.java @@ -39,4 +39,8 @@ public static String getVendorAccountNumber(CompositePoLine poLine) { .orElse(null); } + public static String getTitle(CompositePoLine poLine) { + return poLine.getIsPackage() ? null : poLine.getTitleOrPackage(); + } + } diff --git a/src/main/java/org/folio/dew/client/OrdersStorageClient.java b/src/main/java/org/folio/dew/client/OrdersStorageClient.java index a77edbf9..a3c6ddff 100644 --- a/src/main/java/org/folio/dew/client/OrdersStorageClient.java +++ b/src/main/java/org/folio/dew/client/OrdersStorageClient.java @@ -1,11 +1,13 @@ package org.folio.dew.client; +import org.folio.dew.domain.dto.OrdersTitle; import org.folio.dew.domain.dto.PieceCollection; import org.folio.dew.domain.dto.PoLineCollection; import org.folio.dew.domain.dto.PurchaseOrderCollection; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestParam; @FeignClient(name = "orders-storage") @@ -32,4 +34,7 @@ PieceCollection getPiecesByQuery( @RequestParam("limit") int limit ); + @GetMapping(value = "/titles/{id}", produces = MediaType.APPLICATION_JSON_VALUE) + OrdersTitle getTitleById(@PathVariable("id") String id); + } diff --git a/src/main/resources/swagger.api/order-export.yaml b/src/main/resources/swagger.api/order-export.yaml index 31ee4e1f..06252499 100644 --- a/src/main/resources/swagger.api/order-export.yaml +++ b/src/main/resources/swagger.api/order-export.yaml @@ -65,3 +65,5 @@ components: $ref: '../../../../folio-export-common/schemas/acquisitions/mod-orders-storage/piece.json#/Piece' pieceCollection: $ref: '../../../../folio-export-common/schemas/acquisitions/mod-orders-storage/piece_collection.json#/PieceCollection' + ordersTitle: + $ref: '../../../../folio-export-common/schemas/acquisitions/mod-orders-storage/title.json#/OrdersTitle' diff --git a/src/test/java/org/folio/dew/batch/acquisitions/edifact/mapper/CsvMapperTest.java b/src/test/java/org/folio/dew/batch/acquisitions/edifact/mapper/CsvMapperTest.java index dbc7215d..dddf6b8b 100644 --- a/src/test/java/org/folio/dew/batch/acquisitions/edifact/mapper/CsvMapperTest.java +++ b/src/test/java/org/folio/dew/batch/acquisitions/edifact/mapper/CsvMapperTest.java @@ -5,6 +5,8 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.when; import com.fasterxml.jackson.databind.ObjectMapper; import java.io.IOException; @@ -14,15 +16,12 @@ import java.util.Map; import lombok.extern.log4j.Log4j2; -import org.folio.dew.batch.acquisitions.edifact.services.ConfigurationService; -import org.folio.dew.batch.acquisitions.edifact.services.ExpenseClassService; -import org.folio.dew.batch.acquisitions.edifact.services.HoldingService; -import org.folio.dew.batch.acquisitions.edifact.services.IdentifierTypeService; -import org.folio.dew.batch.acquisitions.edifact.services.LocationService; -import org.folio.dew.batch.acquisitions.edifact.services.MaterialTypeService; +import org.folio.dew.batch.acquisitions.edifact.mapper.converter.ClaimCsvConverter; +import org.folio.dew.batch.acquisitions.edifact.services.OrdersService; import org.folio.dew.config.JacksonConfiguration; import org.folio.dew.domain.dto.CompositePurchaseOrder; import org.folio.dew.domain.dto.ExportType; +import org.folio.dew.domain.dto.OrdersTitle; import org.folio.dew.domain.dto.Piece; import org.folio.dew.domain.dto.PieceCollection; import org.folio.dew.domain.dto.VendorEdiOrdersExportConfig; @@ -45,22 +44,14 @@ class CsvMapperTest { private ExportResourceMapper csvMapper; @Mock - private IdentifierTypeService identifierTypeService; - @Mock - private MaterialTypeService materialTypeService; - @Mock - private ExpenseClassService expenseClassService; - @Mock - private LocationService locationService; - @Mock - private HoldingService holdingService; - @Mock - private ConfigurationService configurationService; + private OrdersService ordersService; @BeforeEach void setUp() { - csvMapper = new CsvMapper(); + csvMapper = new CsvMapper(new ClaimCsvConverter(ordersService)); objectMapper = new JacksonConfiguration().objectMapper(); + + when(ordersService.getTitleById(anyString())).thenReturn(new OrdersTitle().title("Test title")); } @ParameterizedTest diff --git a/src/test/resources/edifact/acquisitions/csv_claims_result.csv b/src/test/resources/edifact/acquisitions/csv_claims_result.csv index e68ed42a..e8536961 100644 --- a/src/test/resources/edifact/acquisitions/csv_claims_result.csv +++ b/src/test/resources/edifact/acquisitions/csv_claims_result.csv @@ -1,8 +1,8 @@ POL number,Vendor order number,Account number,Title from piece,Display summary,Chronology,Enumeration,Quantity -10000-1,ORD1000,BRXXXXX-01,CHANGEME,S1,C1,E1,CHANGEME -10000-1,ORD1000,BRXXXXX-01,CHANGEME,S2,C2,,CHANGEME -10001-1,ORD1001,BRXXXXX-01,CHANGEME,S3,,E3,CHANGEME -10001-2,ORD1002,BRXXXXX-01,CHANGEME,,C4,E4,CHANGEME -10002-1,,,CHANGEME,S5,,E5,CHANGEME -10002-1,,,CHANGEME,,C5,,CHANGEME -10002-1,,,CHANGEME,,,,CHANGEME +10000-1,ORD1000,BRXXXXX-01,Test title,S1,C1,E1,CHANGEME +10000-1,ORD1000,BRXXXXX-01,Test title,S2,C2,,CHANGEME +10001-1,ORD1001,BRXXXXX-01,Test title,S3,,E3,CHANGEME +10001-2,ORD1002,BRXXXXX-01,Test title,,C4,E4,CHANGEME +10002-1,,,Test title,S5,,E5,CHANGEME +10002-1,,,Test title,,C5,,CHANGEME +10002-1,,,Test title,,,,CHANGEME From a77e46883f1ce4a2abd45b894a1f7ab53a1ace87 Mon Sep 17 00:00:00 2001 From: saba_zedginidze Date: Mon, 16 Dec 2024 17:10:16 +0400 Subject: [PATCH 13/17] [MODEXPW-529] Add quantity calculation logic --- .../edifact/config/ExportConfig.java | 10 +-- .../edifact/mapper/CsvMapper.java | 61 +++++++++++++++---- .../converter/AbstractCsvConverter.java | 13 ++-- .../mapper/converter/ClaimCsvConverter.java | 27 +------- .../mapper/converter/ClaimCsvFields.java | 29 ++++----- .../edifact/utils/ExportUtils.java | 4 -- .../acquisitions/edifact/ClaimCsvEntry.java | 8 +++ .../edifact/mapper/CsvMapperTest.java | 3 +- .../acquisitions/csv_claims_result.csv | 14 ++--- .../acquisitions/edifact_claims_result.edi | 7 ++- ...minimalistic_composite_purchase_order.json | 1 + .../acquisitions/pieces_collection.json | 1 - .../acquisitions/pieces_collection_mixed.json | 41 +++++++++++-- 13 files changed, 132 insertions(+), 87 deletions(-) create mode 100644 src/main/java/org/folio/dew/domain/dto/acquisitions/edifact/ClaimCsvEntry.java diff --git a/src/main/java/org/folio/dew/batch/acquisitions/edifact/config/ExportConfig.java b/src/main/java/org/folio/dew/batch/acquisitions/edifact/config/ExportConfig.java index a33044ef..c595b519 100644 --- a/src/main/java/org/folio/dew/batch/acquisitions/edifact/config/ExportConfig.java +++ b/src/main/java/org/folio/dew/batch/acquisitions/edifact/config/ExportConfig.java @@ -2,7 +2,6 @@ import org.folio.dew.batch.acquisitions.edifact.mapper.CsvMapper; import org.folio.dew.batch.acquisitions.edifact.mapper.ExportResourceMapper; -import org.folio.dew.batch.acquisitions.edifact.mapper.converter.ClaimCsvConverter; import org.folio.dew.batch.acquisitions.edifact.mapper.converter.CompOrderEdiConverter; import org.folio.dew.batch.acquisitions.edifact.mapper.converter.CompPoLineEdiConverter; import org.folio.dew.batch.acquisitions.edifact.mapper.EdifactMapper; @@ -38,13 +37,8 @@ ExportResourceMapper edifactMapper(CompOrderEdiConverter compOrderEdiConverter) } @Bean - ClaimCsvConverter claimCsvConverter(OrdersService ordersService) { - return new ClaimCsvConverter(ordersService); - } - - @Bean - ExportResourceMapper csvMapper(ClaimCsvConverter claimCsvConverter) { - return new CsvMapper(claimCsvConverter); + ExportResourceMapper csvMapper(OrdersService ordersService) { + return new CsvMapper(ordersService); } } diff --git a/src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/CsvMapper.java b/src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/CsvMapper.java index c4e01e62..cd643835 100644 --- a/src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/CsvMapper.java +++ b/src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/CsvMapper.java @@ -3,25 +3,33 @@ import static java.util.stream.Collectors.groupingBy; import static org.folio.dew.utils.Constants.LINE_BREAK; +import java.util.Arrays; +import java.util.Comparator; import java.util.List; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; import org.apache.commons.lang3.tuple.Pair; import org.folio.dew.batch.acquisitions.edifact.mapper.converter.ClaimCsvConverter; +import org.folio.dew.batch.acquisitions.edifact.services.OrdersService; import org.folio.dew.domain.dto.CompositePoLine; import org.folio.dew.domain.dto.CompositePurchaseOrder; import org.folio.dew.domain.dto.Piece; import org.folio.dew.domain.dto.VendorEdiOrdersExportConfig; +import org.folio.dew.domain.dto.acquisitions.edifact.ClaimCsvEntry; public class CsvMapper implements ExportResourceMapper { - private final ClaimCsvConverter claimCsvConverter; + private final OrdersService ordersService; - public CsvMapper(ClaimCsvConverter claimCsvConverter) { - this.claimCsvConverter = claimCsvConverter; + public CsvMapper(OrdersService ordersService) { + this.ordersService = ordersService; } @Override public String convertForExport(List compPOs, List pieces, VendorEdiOrdersExportConfig ediExportConfig, String jobName) { + var claimCsvConverter = new ClaimCsvConverter(); var csvResult = new StringBuilder(claimCsvConverter.getCsvHeaders()).append(LINE_BREAK); getClaimEntries(compPOs, pieces).stream() .map(claimCsvConverter::convertEntryToCsv) @@ -30,16 +38,47 @@ public String convertForExport(List compPOs, List return csvResult.toString(); } - private static List> getClaimEntries(List orders, List pieces) { + private List getClaimEntries(List orders, List pieces) { + // Map each PoLine ID to its corresponding Pieces var poLineIdToPieces = pieces.stream().collect(groupingBy(Piece::getPoLineId)); - return orders.stream() - // 1. Get all composite PO lines - .flatMap(order -> order.getCompositePoLines().stream() - // 2. For each composite PO line, get all pieces - .flatMap(poLine -> poLineIdToPieces.get(poLine.getId()).stream() - // 3. Map each piece to a pair of composite PO line and piece - .map(piece -> Pair.of(poLine, piece)))) + // Map each PoLine ID to its corresponding PoLine + var poLineIdToPoLine = orders.stream().flatMap(order -> order.getCompositePoLines().stream()) + .collect(Collectors.toMap(CompositePoLine::getId, Function.identity())); + // Map each Piece ID to its corresponding Title + var pieceIdToTitle = poLineIdToPieces.entrySet().stream() + .flatMap(entry -> entry.getValue().stream() + .map(piece -> Pair.of(piece.getId(), getTitleById(poLineIdToPoLine.get(entry.getKey()), piece)))) // Pair of Piece ID and Title + .collect(Collectors.toMap(Pair::getLeft, Pair::getRight)); + + // Key extractor for grouping pieces by: Po Line Number, Display Summary, Chronology, Enumeration, and Title + Function> keyExtractor = piece -> Arrays.asList( + poLineIdToPoLine.get(piece.getPoLineId()).getPoLineNumber(), + piece.getDisplaySummary(), + piece.getChronology(), + piece.getEnumeration(), + pieceIdToTitle.get(piece.getId()) + ); + + // Group pieces by the previously defined key + Map, List> claimedPieces = pieces.stream() + .collect(Collectors.groupingBy(keyExtractor)); + + // Return a list of ClaimCsvEntry objects, each representing a group of claimed pieces + // Only the first piece in each group is used to get the Po Line and Title, as they share all necessary attributes + return claimedPieces.values().stream() + .map(claims -> new ClaimCsvEntry( + poLineIdToPoLine.get(claims.get(0).getPoLineId()), + claims.get(0), + pieceIdToTitle.get(claims.get(0).getId()), + claims.size())) + .sorted(Comparator.comparing(o -> o.compositePoLine().getPoLineNumber())) .toList(); } + private String getTitleById(CompositePoLine poLine, Piece piece) { + return poLine.getIsPackage() + ? ordersService.getTitleById(piece.getTitleId()).getTitle() + : poLine.getTitleOrPackage(); + } + } diff --git a/src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/converter/AbstractCsvConverter.java b/src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/converter/AbstractCsvConverter.java index fbef31eb..80f13bc1 100644 --- a/src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/converter/AbstractCsvConverter.java +++ b/src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/converter/AbstractCsvConverter.java @@ -1,12 +1,12 @@ package org.folio.dew.batch.acquisitions.edifact.mapper.converter; -import static java.util.Optional.ofNullable; import static org.folio.dew.utils.Constants.COMMA; import static org.folio.dew.utils.Constants.QUOTE; -import static org.folio.dew.utils.CsvHelper.escapeDelimiter; import java.util.Arrays; +import java.util.Optional; +import org.folio.dew.utils.CsvHelper; import org.springframework.batch.item.file.transform.DelimitedLineAggregator; public abstract class AbstractCsvConverter { @@ -30,15 +30,12 @@ public String getCsvHeaders() { public String convertEntryToCsv(T entry) { return lineAggregator.doAggregate(Arrays.stream(getFields()) - .map(field -> ofNullable(extractField(entry, field)).orElse("")) - .map(field -> escapeDelimiter(field, delimiter, QUOTE)) + .map(field -> field.extract(entry)) + .map(value -> Optional.ofNullable(value).orElse("")) + .map(field -> CsvHelper.escapeDelimiter(field, delimiter, QUOTE)) .toArray()); } - protected String extractField(T entry, ExtractableField field) { - return field.extract(entry); - } - protected abstract ExtractableField[] getFields(); protected abstract String[] getHeaders(); diff --git a/src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/converter/ClaimCsvConverter.java b/src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/converter/ClaimCsvConverter.java index b8d6b2b2..e3c6941d 100644 --- a/src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/converter/ClaimCsvConverter.java +++ b/src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/converter/ClaimCsvConverter.java @@ -1,23 +1,13 @@ package org.folio.dew.batch.acquisitions.edifact.mapper.converter; import java.util.Arrays; -import java.util.Optional; -import org.apache.commons.lang3.tuple.Pair; -import org.folio.dew.batch.acquisitions.edifact.services.OrdersService; -import org.folio.dew.domain.dto.CompositePoLine; -import org.folio.dew.domain.dto.Piece; +import org.folio.dew.domain.dto.acquisitions.edifact.ClaimCsvEntry; -public class ClaimCsvConverter extends AbstractCsvConverter> { - - private final OrdersService ordersService; - - public ClaimCsvConverter(OrdersService ordersService) { - this.ordersService = ordersService; - } +public class ClaimCsvConverter extends AbstractCsvConverter { @Override - protected ExtractableField, String>[] getFields() { + protected ExtractableField[] getFields() { return ClaimCsvFields.values(); } @@ -28,15 +18,4 @@ protected String[] getHeaders() { .toArray(String[]::new); } - @Override - protected String extractField(Pair entry, ExtractableField, String> field) { - return Optional.ofNullable(super.extractField(entry, field)) - .orElseGet(() -> { - if (field == ClaimCsvFields.TITLE) { - return ordersService.getTitleById(entry.getValue().getTitleId()).getTitle(); - } - return null; - }); - } - } diff --git a/src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/converter/ClaimCsvFields.java b/src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/converter/ClaimCsvFields.java index d9c76338..1ea87c6f 100644 --- a/src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/converter/ClaimCsvFields.java +++ b/src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/converter/ClaimCsvFields.java @@ -1,38 +1,35 @@ package org.folio.dew.batch.acquisitions.edifact.mapper.converter; -import static org.folio.dew.batch.acquisitions.edifact.utils.ExportUtils.getTitle; import static org.folio.dew.batch.acquisitions.edifact.utils.ExportUtils.getVendorAccountNumber; import static org.folio.dew.batch.acquisitions.edifact.utils.ExportUtils.getVendorOrderNumber; import java.util.function.Function; -import org.apache.commons.lang3.tuple.Pair; -import org.folio.dew.domain.dto.CompositePoLine; -import org.folio.dew.domain.dto.Piece; +import org.folio.dew.domain.dto.acquisitions.edifact.ClaimCsvEntry; import lombok.AllArgsConstructor; import lombok.Getter; @AllArgsConstructor -public enum ClaimCsvFields implements ExtractableField, String> { +public enum ClaimCsvFields implements ExtractableField { - POL_NUMBER("POL number", pair -> pair.getKey().getPoLineNumber()), - ORDER_NUMBER("Vendor order number", pair -> getVendorOrderNumber(pair.getKey())), - ACCOUNT_NUMBER("Account number", pair -> getVendorAccountNumber(pair.getKey())), - TITLE("Title from piece", pair -> getTitle(pair.getKey())), - DISPLAY_SUMMARY("Display summary", pair -> pair.getValue().getDisplaySummary()), - CHRONOLOGY("Chronology", pair -> pair.getValue().getChronology()), - ENUMERATION("Enumeration", pair -> pair.getValue().getEnumeration()), - QUANTITY("Quantity", pair -> "CHANGEME"); // FIXME: implement quantity extraction + POL_NUMBER("POL number", entry -> entry.compositePoLine().getPoLineNumber()), + ORDER_NUMBER("Vendor order number", entry -> getVendorOrderNumber(entry.compositePoLine())), + ACCOUNT_NUMBER("Account number", entry -> getVendorAccountNumber(entry.compositePoLine())), + TITLE("Title from piece", ClaimCsvEntry::title), + DISPLAY_SUMMARY("Display summary", entry -> entry.piece().getDisplaySummary()), + CHRONOLOGY("Chronology", entry -> entry.piece().getChronology()), + ENUMERATION("Enumeration", entry -> entry.piece().getEnumeration()), + QUANTITY("Quantity", entry -> String.valueOf(entry.quantity())); @Getter private final String name; - private final Function, String> extractor; + private final Function extractor; @Override - public String extract(Pair item) { - return extractor.apply(item); + public String extract(ClaimCsvEntry entry) { + return extractor.apply(entry); } } diff --git a/src/main/java/org/folio/dew/batch/acquisitions/edifact/utils/ExportUtils.java b/src/main/java/org/folio/dew/batch/acquisitions/edifact/utils/ExportUtils.java index 03603088..03b05d55 100644 --- a/src/main/java/org/folio/dew/batch/acquisitions/edifact/utils/ExportUtils.java +++ b/src/main/java/org/folio/dew/batch/acquisitions/edifact/utils/ExportUtils.java @@ -39,8 +39,4 @@ public static String getVendorAccountNumber(CompositePoLine poLine) { .orElse(null); } - public static String getTitle(CompositePoLine poLine) { - return poLine.getIsPackage() ? null : poLine.getTitleOrPackage(); - } - } diff --git a/src/main/java/org/folio/dew/domain/dto/acquisitions/edifact/ClaimCsvEntry.java b/src/main/java/org/folio/dew/domain/dto/acquisitions/edifact/ClaimCsvEntry.java new file mode 100644 index 00000000..e0207711 --- /dev/null +++ b/src/main/java/org/folio/dew/domain/dto/acquisitions/edifact/ClaimCsvEntry.java @@ -0,0 +1,8 @@ +package org.folio.dew.domain.dto.acquisitions.edifact; + +import org.folio.dew.domain.dto.CompositePoLine; +import org.folio.dew.domain.dto.Piece; + +public record ClaimCsvEntry(CompositePoLine compositePoLine, Piece piece, String title, int quantity) { + +} diff --git a/src/test/java/org/folio/dew/batch/acquisitions/edifact/mapper/CsvMapperTest.java b/src/test/java/org/folio/dew/batch/acquisitions/edifact/mapper/CsvMapperTest.java index dddf6b8b..0b59b0aa 100644 --- a/src/test/java/org/folio/dew/batch/acquisitions/edifact/mapper/CsvMapperTest.java +++ b/src/test/java/org/folio/dew/batch/acquisitions/edifact/mapper/CsvMapperTest.java @@ -16,7 +16,6 @@ import java.util.Map; import lombok.extern.log4j.Log4j2; -import org.folio.dew.batch.acquisitions.edifact.mapper.converter.ClaimCsvConverter; import org.folio.dew.batch.acquisitions.edifact.services.OrdersService; import org.folio.dew.config.JacksonConfiguration; import org.folio.dew.domain.dto.CompositePurchaseOrder; @@ -48,7 +47,7 @@ class CsvMapperTest { @BeforeEach void setUp() { - csvMapper = new CsvMapper(new ClaimCsvConverter(ordersService)); + csvMapper = new CsvMapper(ordersService); objectMapper = new JacksonConfiguration().objectMapper(); when(ordersService.getTitleById(anyString())).thenReturn(new OrdersTitle().title("Test title")); diff --git a/src/test/resources/edifact/acquisitions/csv_claims_result.csv b/src/test/resources/edifact/acquisitions/csv_claims_result.csv index e8536961..fbb06e06 100644 --- a/src/test/resources/edifact/acquisitions/csv_claims_result.csv +++ b/src/test/resources/edifact/acquisitions/csv_claims_result.csv @@ -1,8 +1,8 @@ POL number,Vendor order number,Account number,Title from piece,Display summary,Chronology,Enumeration,Quantity -10000-1,ORD1000,BRXXXXX-01,Test title,S1,C1,E1,CHANGEME -10000-1,ORD1000,BRXXXXX-01,Test title,S2,C2,,CHANGEME -10001-1,ORD1001,BRXXXXX-01,Test title,S3,,E3,CHANGEME -10001-2,ORD1002,BRXXXXX-01,Test title,,C4,E4,CHANGEME -10002-1,,,Test title,S5,,E5,CHANGEME -10002-1,,,Test title,,C5,,CHANGEME -10002-1,,,Test title,,,,CHANGEME +10000-1,ORD1000,BRXXXXX-01,"Futures, biometrics and neuroscience research Luiz Moutinho, Mladen Sokele, editors",S1,C1,E1,3 +10000-1,ORD1000,BRXXXXX-01,"Futures, biometrics and neuroscience research Luiz Moutinho, Mladen Sokele, editors",S2,C2,,1 +10001-1,ORD1001,BRXXXXX-01,"Futures, biometrics and neuroscience research Luiz Moutinho, Mladen Sokele, editors",S3,,E3,2 +10001-2,ORD1002,BRXXXXX-01,"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.",,C4,E4,1 +10002-1,,,Test title,S5,,E5,1 +10002-1,,,Test title,,C5,,1 +10002-1,,,Test title,,,,1 diff --git a/src/test/resources/edifact/acquisitions/edifact_claims_result.edi b/src/test/resources/edifact/acquisitions/edifact_claims_result.edi index 13f2fab0..e8abe94d 100644 --- a/src/test/resources/edifact/acquisitions/edifact_claims_result.edi +++ b/src/test/resources/edifact/acquisitions/edifact_claims_result.edi @@ -13,6 +13,8 @@ IMD+L+009+:::Moutinho, Luiz' IMD+L+050+:::Futures, biometrics and neuroscience research Luiz Moutinho, Mladen So' IMD+L+050+:::kele, editors' IMD+L+080+:::S1?:C1?:E1' +IMD+L+080+:::S1?:C1?:E1' +IMD+L+080+:::S1?:C1?:E1' IMD+L+080+:::S2?:C2' IMD+L+109+:::Palgrave Macmillan' QTY+21:1' @@ -26,7 +28,7 @@ LOC+7+KU/CC/DI/M::92' UNS+S' CNT+1:1' CNT+2:1' -UNT+27+10000' +UNT+29+10000' UNH+10001+ORDERS:D:96A:UN:EAN008' BGM+224+10001+9' DTM+137::102' @@ -40,6 +42,7 @@ IMD+L+009+:::Moutinho, Luiz' IMD+L+050+:::Futures, biometrics and neuroscience research Luiz Moutinho, Mladen So' IMD+L+050+:::kele, editors' IMD+L+080+:::S3?:E3' +IMD+L+080+:::S3?:E3' IMD+L+109+:::Palgrave Macmillan' IMD+L+170+:::[2017]' QTY+21:1' @@ -88,7 +91,7 @@ LOC+7+KU/CC/DI/M::92' UNS+S' CNT+1:4' CNT+2:2' -UNT+62+10001' +UNT+63+10001' UNH+10002+ORDERS:D:96A:UN:EAN008' BGM+220+10002+9' DTM+137::102' diff --git a/src/test/resources/edifact/acquisitions/minimalistic_composite_purchase_order.json b/src/test/resources/edifact/acquisitions/minimalistic_composite_purchase_order.json index a16f59fe..49acc7a0 100644 --- a/src/test/resources/edifact/acquisitions/minimalistic_composite_purchase_order.json +++ b/src/test/resources/edifact/acquisitions/minimalistic_composite_purchase_order.json @@ -8,6 +8,7 @@ "cost": { "currency": "USD" }, + "isPackage": true, "titleOrPackage": "empty", "metadata": { "createdDate": "2021-12-28T08:17:02.171+00:00", diff --git a/src/test/resources/edifact/acquisitions/pieces_collection.json b/src/test/resources/edifact/acquisitions/pieces_collection.json index 1564e88b..6f6cf59e 100644 --- a/src/test/resources/edifact/acquisitions/pieces_collection.json +++ b/src/test/resources/edifact/acquisitions/pieces_collection.json @@ -33,6 +33,5 @@ "createdByUserId": "28d1057c-d137-11e8-a8d5-f2801f1b9fd1" } } - ] } diff --git a/src/test/resources/edifact/acquisitions/pieces_collection_mixed.json b/src/test/resources/edifact/acquisitions/pieces_collection_mixed.json index 8ab9d88a..10400d15 100644 --- a/src/test/resources/edifact/acquisitions/pieces_collection_mixed.json +++ b/src/test/resources/edifact/acquisitions/pieces_collection_mixed.json @@ -33,6 +33,28 @@ "createdByUserId": "28d1057c-d137-11e8-a8d5-f2801f1b9fd1" } }, + { + "id": "5e317dc2-deeb-4429-b2a1-91e5cd0fd5a1", + "poLineId": "f7cebba9-900d-4e46-ac96-9dfdb6da214e", + "receivingStatus": "Late", + "displaySummary": "S1", + "chronology": "C1", + "enumeration": "E1", + "itemId": "522a501a-56b5-48d9-b28a-3a8f02482d97", + "locationId": "53cf956f-c1df-410b-8bea-27f712cca7c0", + "titleId": "9a665b22-9fe5-4c95-b4ee-837a5433c95d" + }, + { + "id": "5e317dc2-deeb-4429-b2a1-91e5cd0fd5b1", + "poLineId": "f7cebba9-900d-4e46-ac96-9dfdb6da214e", + "receivingStatus": "Late", + "displaySummary": "S1", + "chronology": "C1", + "enumeration": "E1", + "itemId": "522a501a-56b5-48d9-b28a-3a8f02482d97", + "locationId": "53cf956f-c1df-410b-8bea-27f712cca7c0", + "titleId": "9a665b22-9fe5-4c95-b4ee-837a5433c95d" + }, { "id": "5e317dc2-deeb-4429-b2a1-91e5cd0fd5f2", "poLineId": "f7cebba9-900d-4e46-ac96-9dfdb6da214e", @@ -100,7 +122,18 @@ } }, { - "id": "5e317dc2-deeb-4429-b2a1-91e5cd0fd5f3", + "id": "5e317dc2-deeb-4429-b2a1-91e5cd0fd5a3", + "poLineId": "81b6503d-1f50-404d-a663-794b7f726ffd", + "receivingStatus": "Late", + "displaySummary": "S3", + "chronology": "", + "enumeration": "E3", + "itemId": "522a501a-56b5-48d9-b28a-3a8f02482d97", + "locationId": "53cf956f-c1df-410b-8bea-27f712cca7c0", + "titleId": "9a665b22-9fe5-4c95-b4ee-837a5433c95d" + }, + { + "id": "5e317dc2-deeb-4429-b2a1-91e5cd0fd5f4", "poLineId": "c8d7a6a8-89b9-4711-9e1e-694b3e5ada72", "receivingStatus": "Late", "displaySummary": null, @@ -133,7 +166,7 @@ } }, { - "id": "5e317dc2-deeb-4429-b2a1-91e5cd0fd5f4", + "id": "5e317dc2-deeb-4429-b2a1-91e5cd0fd5f5", "poLineId": "31af5b5c-251e-4582-9896-2c9cef360284", "receivingStatus": "Late", "displaySummary": "S5", @@ -166,7 +199,7 @@ } }, { - "id": "5e317dc2-deeb-4429-b2a1-91e5cd0fd5f4", + "id": "5e317dc2-deeb-4429-b2a1-91e5cd0fd5f6", "poLineId": "31af5b5c-251e-4582-9896-2c9cef360284", "receivingStatus": "Late", "displaySummary": null, @@ -199,7 +232,7 @@ } }, { - "id": "5e317dc2-deeb-4429-b2a1-91e5cd0fd5f4", + "id": "5e317dc2-deeb-4429-b2a1-91e5cd0fd5f7", "poLineId": "31af5b5c-251e-4582-9896-2c9cef360284", "receivingStatus": "Late", "displaySummary": null, From 86db1807aad4c26a962b5f57cb4cef6b251f5935 Mon Sep 17 00:00:00 2001 From: saba_zedginidze Date: Mon, 16 Dec 2024 17:13:45 +0400 Subject: [PATCH 14/17] [MODEXPW-529] Update pointer --- folio-export-common | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/folio-export-common b/folio-export-common index 839deafc..ada96084 160000 --- a/folio-export-common +++ b/folio-export-common @@ -1 +1 @@ -Subproject commit 839deafc288914ba7bcc58a8c598b369f4af466c +Subproject commit ada96084e8f8712a21741546830906fc7160d48e From c1d4a97fc2d65e8a793c1b2a1915aa4df966136f Mon Sep 17 00:00:00 2001 From: saba_zedginidze Date: Tue, 17 Dec 2024 16:02:25 +0400 Subject: [PATCH 15/17] [MODEXPW-529] Fix sonar issue --- .../folio/dew/batch/acquisitions/edifact/mapper/CsvMapper.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/CsvMapper.java b/src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/CsvMapper.java index cd643835..c6a4f759 100644 --- a/src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/CsvMapper.java +++ b/src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/CsvMapper.java @@ -76,7 +76,7 @@ private List getClaimEntries(List orders, } private String getTitleById(CompositePoLine poLine, Piece piece) { - return poLine.getIsPackage() + return Boolean.TRUE.equals(poLine.getIsPackage()) ? ordersService.getTitleById(piece.getTitleId()).getTitle() : poLine.getTitleOrPackage(); } From db5ab0d42c88c2dc651251353059ec0f21ba10ff Mon Sep 17 00:00:00 2001 From: saba_zedginidze Date: Tue, 17 Dec 2024 16:28:46 +0400 Subject: [PATCH 16/17] [MODEXPW-529] Improve grouping logic --- .../edifact/mapper/CsvMapper.java | 26 ++++++------------- .../acquisitions/edifact/ClaimCsvEntry.java | 25 +++++++++++++++++- 2 files changed, 32 insertions(+), 19 deletions(-) diff --git a/src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/CsvMapper.java b/src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/CsvMapper.java index c6a4f759..888a71bd 100644 --- a/src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/CsvMapper.java +++ b/src/main/java/org/folio/dew/batch/acquisitions/edifact/mapper/CsvMapper.java @@ -3,7 +3,6 @@ import static java.util.stream.Collectors.groupingBy; import static org.folio.dew.utils.Constants.LINE_BREAK; -import java.util.Arrays; import java.util.Comparator; import java.util.List; import java.util.Map; @@ -51,26 +50,17 @@ private List getClaimEntries(List orders, .collect(Collectors.toMap(Pair::getLeft, Pair::getRight)); // Key extractor for grouping pieces by: Po Line Number, Display Summary, Chronology, Enumeration, and Title - Function> keyExtractor = piece -> Arrays.asList( - poLineIdToPoLine.get(piece.getPoLineId()).getPoLineNumber(), - piece.getDisplaySummary(), - piece.getChronology(), - piece.getEnumeration(), - pieceIdToTitle.get(piece.getId()) - ); + Function keyExtractor = piece -> + new ClaimCsvEntry(poLineIdToPoLine.get(piece.getPoLineId()), piece, pieceIdToTitle.get(piece.getId()), 0); - // Group pieces by the previously defined key - Map, List> claimedPieces = pieces.stream() - .collect(Collectors.groupingBy(keyExtractor)); + // Group pieces by the previously defined key (Overridden equals and hashCode methods in ClaimCsvEntry) + // Only a single piece from each group is used, as they share all necessary attributes + Map claimedPieces = pieces.stream() + .collect(Collectors.groupingBy(keyExtractor, Collectors.counting())); // Return a list of ClaimCsvEntry objects, each representing a group of claimed pieces - // Only the first piece in each group is used to get the Po Line and Title, as they share all necessary attributes - return claimedPieces.values().stream() - .map(claims -> new ClaimCsvEntry( - poLineIdToPoLine.get(claims.get(0).getPoLineId()), - claims.get(0), - pieceIdToTitle.get(claims.get(0).getId()), - claims.size())) + return claimedPieces.entrySet().stream() + .map(entry -> entry.getKey().withQuantity(entry.getValue())) .sorted(Comparator.comparing(o -> o.compositePoLine().getPoLineNumber())) .toList(); } diff --git a/src/main/java/org/folio/dew/domain/dto/acquisitions/edifact/ClaimCsvEntry.java b/src/main/java/org/folio/dew/domain/dto/acquisitions/edifact/ClaimCsvEntry.java index e0207711..ef5d48d9 100644 --- a/src/main/java/org/folio/dew/domain/dto/acquisitions/edifact/ClaimCsvEntry.java +++ b/src/main/java/org/folio/dew/domain/dto/acquisitions/edifact/ClaimCsvEntry.java @@ -1,8 +1,31 @@ package org.folio.dew.domain.dto.acquisitions.edifact; +import java.util.Objects; + import org.folio.dew.domain.dto.CompositePoLine; import org.folio.dew.domain.dto.Piece; -public record ClaimCsvEntry(CompositePoLine compositePoLine, Piece piece, String title, int quantity) { +public record ClaimCsvEntry(CompositePoLine compositePoLine, Piece piece, String title, long quantity) { + + public ClaimCsvEntry withQuantity(long quantity) { + return new ClaimCsvEntry(compositePoLine, piece, title, quantity); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + ClaimCsvEntry that = (ClaimCsvEntry) o; + return Objects.equals(compositePoLine.getPoLineNumber(), that.compositePoLine.getPoLineNumber()) + && Objects.equals(piece.getDisplaySummary(), that.piece.getDisplaySummary()) + && Objects.equals(piece.getChronology(), that.piece.getChronology()) + && Objects.equals(piece.getEnumeration(), that.piece.getEnumeration()) + && Objects.equals(title, that.title); + } + + @Override + public int hashCode() { + return Objects.hash(compositePoLine.getPoLineNumber(), piece.getDisplaySummary(), piece.getChronology(), piece.getEnumeration(), title); + } } From 25898d03a85eb1083048b692d36eb1e8527039c4 Mon Sep 17 00:00:00 2001 From: saba_zedginidze Date: Tue, 17 Dec 2024 19:30:02 +0400 Subject: [PATCH 17/17] [MODEXPW-529] Update pointer and rename export config --- folio-export-common | 2 +- .../config/{ExportConfig.java => AcquisitionExportConfig.java} | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename src/main/java/org/folio/dew/batch/acquisitions/edifact/config/{ExportConfig.java => AcquisitionExportConfig.java} (98%) diff --git a/folio-export-common b/folio-export-common index ada96084..7e5cbf2f 160000 --- a/folio-export-common +++ b/folio-export-common @@ -1 +1 @@ -Subproject commit ada96084e8f8712a21741546830906fc7160d48e +Subproject commit 7e5cbf2f3f8188f01d7e0da16d51a2819632b848 diff --git a/src/main/java/org/folio/dew/batch/acquisitions/edifact/config/ExportConfig.java b/src/main/java/org/folio/dew/batch/acquisitions/edifact/config/AcquisitionExportConfig.java similarity index 98% rename from src/main/java/org/folio/dew/batch/acquisitions/edifact/config/ExportConfig.java rename to src/main/java/org/folio/dew/batch/acquisitions/edifact/config/AcquisitionExportConfig.java index c595b519..206b256c 100644 --- a/src/main/java/org/folio/dew/batch/acquisitions/edifact/config/ExportConfig.java +++ b/src/main/java/org/folio/dew/batch/acquisitions/edifact/config/AcquisitionExportConfig.java @@ -18,7 +18,7 @@ @Configuration @ComponentScan({ "org.folio.dew.batch.acquisitions.edifact" }) -public class ExportConfig { +public class AcquisitionExportConfig { @Bean CompPoLineEdiConverter compositePOLineConverter(IdentifierTypeService identifierTypeService, MaterialTypeService materialTypeService,