Skip to content

Commit 2acbe94

Browse files
authored
Merge pull request #111 from OpenLMIS/OPSD-13
OPSD-13: Made transferring stock data from requisition to stock manag…
2 parents cd1fbca + 2becb81 commit 2acbe94

File tree

5 files changed

+171
-17
lines changed

5 files changed

+171
-17
lines changed

src/main/java/org/openlmis/requisition/web/BatchRequisitionController.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@
7575
import org.slf4j.ext.XLoggerFactory;
7676
import org.slf4j.profiler.Profiler;
7777
import org.springframework.beans.factory.annotation.Autowired;
78+
import org.springframework.beans.factory.annotation.Value;
7879
import org.springframework.http.HttpStatus;
7980
import org.springframework.http.ResponseEntity;
8081
import org.springframework.stereotype.Controller;
@@ -107,6 +108,9 @@ public class BatchRequisitionController extends BaseRequisitionController {
107108
@Autowired
108109
private PeriodReferenceDataService periodReferenceDataService;
109110

111+
@Value("${transferDataToStockManagement.enabled}")
112+
private boolean isTransferStockDataFromRequisitionToStockManagementEnabled;
113+
110114
/**
111115
* Attempts to retrieve requisitions with the provided UUIDs.
112116
*/
@@ -210,7 +214,9 @@ public ResponseEntity<RequisitionsProcessingStatusDto> approve(
210214
facilities, periods, approveParams, approvedProducts);
211215
}
212216

213-
submitStockEvent(profiler, user, requisitions, orderables);
217+
if (isTransferStockDataFromRequisitionToStockManagementEnabled) {
218+
submitStockEvent(profiler, user, requisitions, orderables);
219+
}
214220

215221
ResponseEntity<RequisitionsProcessingStatusDto> response =
216222
buildResponse(processingStatus, profiler, HttpStatus.OK);

src/main/java/org/openlmis/requisition/web/RequisitionController.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@
5656
import org.openlmis.requisition.utils.Pagination;
5757
import org.slf4j.profiler.Profiler;
5858
import org.springframework.beans.factory.annotation.Autowired;
59+
import org.springframework.beans.factory.annotation.Value;
5960
import org.springframework.context.i18n.LocaleContextHolder;
6061
import org.springframework.data.domain.Page;
6162
import org.springframework.data.domain.Pageable;
@@ -88,6 +89,9 @@ public class RequisitionController extends BaseRequisitionController {
8889
@Autowired
8990
private SupervisoryNodeReferenceDataService supervisoryNodeService;
9091

92+
@Value("${transferDataToStockManagement.enabled}")
93+
private boolean isTransferStockDataFromRequisitionToStockManagementEnabled;
94+
9195
/**
9296
* Allows creating new requisitions.
9397
*
@@ -457,7 +461,8 @@ public BasicRequisitionDto approveRequisition(
457461
BasicRequisitionDto requisitionDto = buildBasicDto(profiler, requisition);
458462
RequisitionTemplate requisitionTemplate = requisition.getTemplate();
459463
if (!requisitionTemplate.isPopulateStockOnHandFromStockCards()
460-
&& !requisitionTemplate.isPatientsTabEnabled()) {
464+
&& !requisitionTemplate.isPatientsTabEnabled()
465+
&& isTransferStockDataFromRequisitionToStockManagementEnabled) {
461466
submitStockEvent(requisition, user.getId(), orderables);
462467
}
463468

src/main/resources/application.properties

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,4 +81,6 @@ spring.data.rest.maxPageSize=2147483647
8181
#why 2000 ? Check https://stackoverflow.com/a/417184
8282
request.maxUrlLength=2000
8383

84-
unskip.requisition.item.when.approving=${UNSKIP_REQUISITION_ITEM_WHEN_APPROVING:false}
84+
unskip.requisition.item.when.approving=${UNSKIP_REQUISITION_ITEM_WHEN_APPROVING:false}
85+
86+
transferDataToStockManagement.enabled=${TRANSFER_DATA_TO_STOCK_MANAGEMENT:true}

src/test/java/org/openlmis/requisition/web/BatchRequisitionControllerTest.java

Lines changed: 118 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,28 +15,52 @@
1515

1616
package org.openlmis.requisition.web;
1717

18+
import static org.mockito.ArgumentMatchers.anyCollection;
19+
import static org.mockito.ArgumentMatchers.anyMap;
20+
import static org.mockito.ArgumentMatchers.anySet;
1821
import static org.mockito.Matchers.any;
1922
import static org.mockito.Matchers.anyList;
2023
import static org.mockito.Mockito.doReturn;
2124
import static org.mockito.Mockito.never;
2225
import static org.mockito.Mockito.verify;
26+
import static org.mockito.Mockito.verifyNoInteractions;
2327
import static org.mockito.Mockito.when;
2428
import static org.mockito.internal.verification.VerificationModeFactory.atLeastOnce;
2529

30+
import com.google.common.collect.Maps;
2631
import java.util.ArrayList;
32+
import java.util.Arrays;
33+
import java.util.Collections;
34+
import java.util.UUID;
35+
2736
import org.junit.Before;
2837
import org.junit.Test;
2938
import org.mockito.InjectMocks;
3039
import org.mockito.Mock;
3140
import org.mockito.MockitoAnnotations;
41+
import org.openlmis.requisition.domain.requisition.Requisition;
42+
import org.openlmis.requisition.domain.requisition.RequisitionStatus;
3243
import org.openlmis.requisition.dto.ReleasableRequisitionBatchDto;
3344
import org.openlmis.requisition.dto.UserDto;
45+
import org.openlmis.requisition.dto.stockmanagement.StockEventDto;
3446
import org.openlmis.requisition.errorhandling.ValidationResult;
47+
import org.openlmis.requisition.i18n.MessageService;
48+
import org.openlmis.requisition.repository.RequisitionRepository;
3549
import org.openlmis.requisition.service.PermissionService;
3650
import org.openlmis.requisition.service.RequisitionService;
51+
import org.openlmis.requisition.service.referencedata.FacilityReferenceDataService;
52+
import org.openlmis.requisition.service.referencedata.FacilityTypeApprovedProductReferenceDataService;
53+
import org.openlmis.requisition.service.referencedata.OrderableReferenceDataService;
54+
import org.openlmis.requisition.service.referencedata.PeriodReferenceDataService;
55+
import org.openlmis.requisition.service.referencedata.SupervisoryNodeReferenceDataService;
56+
import org.openlmis.requisition.service.referencedata.SupplyLineReferenceDataService;
57+
import org.openlmis.requisition.service.referencedata.UserReferenceDataService;
58+
import org.openlmis.requisition.service.stockmanagement.StockEventStockManagementService;
3759
import org.openlmis.requisition.testutils.DtoGenerator;
3860
import org.openlmis.requisition.testutils.ReleasableRequisitionBatchDtoDataBuilder;
3961
import org.openlmis.requisition.utils.AuthenticationHelper;
62+
import org.openlmis.requisition.utils.StockEventBuilder;
63+
import org.springframework.test.util.ReflectionTestUtils;
4064

4165
public class BatchRequisitionControllerTest {
4266

@@ -49,14 +73,56 @@ public class BatchRequisitionControllerTest {
4973
@Mock
5074
PermissionService permissionService;
5175

76+
@Mock
77+
RequisitionRepository requisitionRepository;
78+
79+
@Mock
80+
UserReferenceDataService userReferenceDataService;
81+
82+
@Mock
83+
SupervisoryNodeReferenceDataService supervisoryNodeReferenceDataService;
84+
85+
@Mock
86+
OrderableReferenceDataService orderableReferenceDataService;
87+
88+
@Mock
89+
FacilityReferenceDataService facilityReferenceDataService;
90+
91+
@Mock
92+
PeriodReferenceDataService periodReferenceDataService;
93+
94+
@Mock
95+
FacilityTypeApprovedProductReferenceDataService facilityTypeApprovedService;
96+
97+
@Mock
98+
SupplyLineReferenceDataService supplyLineReferenceDataService;
99+
100+
@Mock
101+
MessageService messageService;
102+
103+
@Mock
104+
StockEventBuilder stockEventBuilder;
105+
106+
@Mock
107+
StockEventStockManagementService stockEventStockManagementService;
108+
109+
@Mock
110+
Requisition requisition;
111+
52112
@InjectMocks
53-
BatchRequisitionController batchRequisitionController;
113+
private BatchRequisitionController batchRequisitionController;
114+
115+
private final UUID uuid1 = UUID.fromString("00000000-0000-0000-0000-000000000001");
116+
117+
private final UUID uuid2 = UUID.fromString("00000000-0000-0000-0000-000000000002");
118+
119+
private UserDto currentUser;
54120

55121
@Before
56122
public void setUp() {
57123
MockitoAnnotations.initMocks(this);
58124

59-
UserDto currentUser = DtoGenerator.of(UserDto.class);
125+
currentUser = DtoGenerator.of(UserDto.class);
60126
when(authenticationHelper.getCurrentUser()).thenReturn(currentUser);
61127
}
62128

@@ -98,4 +164,54 @@ public void batchReleaseRequisitionsWithoutOrderWhenUserHasPermission() {
98164
verify(requisitionService, atLeastOnce()).releaseWithoutOrder(any());
99165
}
100166

167+
@Test
168+
public void approveMultipleRequisitionsWhenTransferStockDataIsEnabled() {
169+
ReflectionTestUtils.setField(batchRequisitionController,
170+
"isTransferStockDataFromRequisitionToStockManagementEnabled", true);
171+
when(requisitionRepository.readDistinctByIdIn(anyList()))
172+
.thenReturn(Collections.singletonList(requisition));
173+
when(requisition.getStatus()).thenReturn(RequisitionStatus.APPROVED);
174+
175+
StockEventDto stockEventDto = DtoGenerator.of(StockEventDto.class);
176+
when(stockEventBuilder.fromRequisition(any(Requisition.class), any(), anyMap()))
177+
.thenReturn(stockEventDto);
178+
179+
batchRequisitionController.approve(Arrays.asList(uuid1, uuid2));
180+
181+
verify(authenticationHelper).getCurrentUser();
182+
verify(requisitionRepository).readDistinctByIdIn(anyCollection());
183+
verify(userReferenceDataService).getPermissionStrings(currentUser.getId());
184+
verify(supervisoryNodeReferenceDataService).findByIds(anyList());
185+
verify(orderableReferenceDataService).findByIdentities(anySet());
186+
verify(facilityReferenceDataService).search(anySet());
187+
verify(periodReferenceDataService).search(anySet());
188+
verify(facilityTypeApprovedService).findByIdentities(anySet());
189+
verify(stockEventBuilder).fromRequisition(requisition, currentUser.getId(), Maps.newHashMap());
190+
verify(stockEventStockManagementService).submit(stockEventDto);
191+
}
192+
193+
@Test
194+
public void approveMultipleRequisitionsWhenTransferStockDataIsDisabled() {
195+
ReflectionTestUtils.setField(batchRequisitionController,
196+
"isTransferStockDataFromRequisitionToStockManagementEnabled", false);
197+
when(requisitionRepository.readDistinctByIdIn(anyList()))
198+
.thenReturn(Collections.singletonList(requisition));
199+
when(requisition.getStatus()).thenReturn(RequisitionStatus.APPROVED);
200+
201+
StockEventDto stockEventDto = DtoGenerator.of(StockEventDto.class);
202+
when(stockEventBuilder.fromRequisition(any(Requisition.class), any(), anyMap()))
203+
.thenReturn(stockEventDto);
204+
205+
batchRequisitionController.approve(Arrays.asList(uuid1, uuid2));
206+
207+
verify(authenticationHelper).getCurrentUser();
208+
verify(requisitionRepository).readDistinctByIdIn(anyCollection());
209+
verify(userReferenceDataService).getPermissionStrings(currentUser.getId());
210+
verify(supervisoryNodeReferenceDataService).findByIds(anyList());
211+
verify(orderableReferenceDataService).findByIdentities(anySet());
212+
verify(facilityReferenceDataService).search(anySet());
213+
verify(periodReferenceDataService).search(anySet());
214+
verify(facilityTypeApprovedService).findByIdentities(anySet());
215+
verifyNoInteractions(stockEventBuilder, stockEventStockManagementService);
216+
}
101217
}

src/test/java/org/openlmis/requisition/web/RequisitionControllerTest.java

Lines changed: 37 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
import static org.mockito.Mockito.never;
4444
import static org.mockito.Mockito.times;
4545
import static org.mockito.Mockito.verify;
46+
import static org.mockito.Mockito.verifyNoInteractions;
4647
import static org.mockito.Mockito.verifyNoMoreInteractions;
4748
import static org.mockito.Mockito.verifyZeroInteractions;
4849
import static org.mockito.Mockito.when;
@@ -965,28 +966,52 @@ public void shouldApproveAuthorizedRequisitionWithParentNodeAndSupplyLineForProg
965966
}
966967

967968
@Test
968-
public void shouldApproveAuthorizedRequisitionWithoutParentNode() {
969+
public void shouldApproveAuthorizedRequisitionWithoutParentNodeWhenTransferStockDataIsEnabled() {
970+
ReflectionTestUtils.setField(requisitionController,
971+
"isTransferStockDataFromRequisitionToStockManagementEnabled", true);
969972
final SupplyLineDto supplyLineDto = prepareForApproveWithSupplyLine();
970973
when(authorizedRequsition.getEmergency()).thenReturn(false);
971974
StockEventDto stockEventDto = DtoGenerator.of(StockEventDto.class);
972975
when(stockEventBuilderBuilder.fromRequisition(any(Requisition.class), any(), anyMap()))
973-
.thenReturn(stockEventDto);
976+
.thenReturn(stockEventDto);
974977

975978
requisitionController.approveRequisition(authorizedRequsition.getId(), request, response);
976979

977-
verify(requisitionService, times(1)).validateCanApproveRequisition(
978-
any(Requisition.class),
979-
any(UUID.class));
980-
980+
verify(requisitionService).validateCanApproveRequisition(
981+
any(Requisition.class),
982+
any(UUID.class));
983+
verify(authorizedRequsition)
984+
.validateCanChangeStatus(dateHelper.getCurrentDateWithSystemZone(),
985+
true, Maps.newHashMap(), Maps.newHashMap());
986+
verify(requisitionService).doApprove(eq(null), any(), any(), eq(authorizedRequsition),
987+
eq(singletonList(supplyLineDto)), any(ProcessingPeriodDto.class), any(Profiler.class));
981988
verify(stockEventBuilderBuilder).fromRequisition(authorizedRequsition,
982-
currentUser.getId(), Maps.newHashMap());
989+
currentUser.getId(), Maps.newHashMap());
983990
verify(stockEventService).submit(stockEventDto);
984-
verify(requisitionService, times(1)).doApprove(eq(null), any(), any(),
985-
eq(authorizedRequsition), eq(singletonList(supplyLineDto)), any(ProcessingPeriodDto.class),
986-
any(Profiler.class));
991+
}
992+
993+
@Test
994+
public void shouldApproveAuthorizedRequisitionWithoutParentNodeWhenTransferStockDataIsDisabled() {
995+
ReflectionTestUtils.setField(requisitionController,
996+
"isTransferStockDataFromRequisitionToStockManagementEnabled", false);
997+
final SupplyLineDto supplyLineDto = prepareForApproveWithSupplyLine();
998+
when(authorizedRequsition.getEmergency()).thenReturn(false);
999+
StockEventDto stockEventDto = DtoGenerator.of(StockEventDto.class);
1000+
when(stockEventBuilderBuilder.fromRequisition(any(Requisition.class), any(), anyMap()))
1001+
.thenReturn(stockEventDto);
1002+
1003+
requisitionController.approveRequisition(authorizedRequsition.getId(), request, response);
1004+
1005+
verify(requisitionService).validateCanApproveRequisition(
1006+
any(Requisition.class),
1007+
any(UUID.class));
9871008
verify(authorizedRequsition)
988-
.validateCanChangeStatus(dateHelper.getCurrentDateWithSystemZone(),
989-
true, Maps.newHashMap(), Maps.newHashMap());
1009+
.validateCanChangeStatus(dateHelper.getCurrentDateWithSystemZone(),
1010+
true, Maps.newHashMap(), Maps.newHashMap());
1011+
verify(requisitionService).doApprove(eq(null), any(),
1012+
any(), eq(authorizedRequsition), eq(singletonList(supplyLineDto)),
1013+
any(ProcessingPeriodDto.class), any(Profiler.class));
1014+
verifyNoInteractions(stockEventBuilderBuilder, stockEventService);
9901015
}
9911016

9921017
@Test

0 commit comments

Comments
 (0)