Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

OAM-186: Added requisition template validation for Ward/Service type #98

Merged
merged 3 commits into from
Jun 3, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions src/main/java/org/openlmis/requisition/i18n/MessageKeys.java
Original file line number Diff line number Diff line change
Expand Up @@ -227,6 +227,8 @@ public abstract class MessageKeys {
+ ".validation.fieldMustBeGreaterOrEqual";
public static final String ERROR_VALIDATION_REFERENCED_OBJECT_DOES_NOT_EXIST = ERROR_PREFIX
+ ".validation.referencedObjectDoesNotExist";
public static final String ERROR_VALIDATION_CANNOT_ASSIGN_WARD_SERVICE_TYPE = ERROR_PREFIX
+ ".validation.cannotAssignWardServiceForRequisitionTemplate";
public static final String ERROR_VALIDATION_CANNOT_CONVERT_WITHOUT_APPROVED_QTY = ERROR_PREFIX
+ ".validation.cannotConvertToOrderWithoutApprovedQty";
public static final String ERROR_USER_NOT_FOUND = ERROR_PREFIX
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
import static org.openlmis.requisition.i18n.MessageKeys.ERROR_OPTION_NOT_AVAILABLE;
import static org.openlmis.requisition.i18n.MessageKeys.ERROR_SOURCE_NOT_AVAILABLE;
import static org.openlmis.requisition.i18n.MessageKeys.ERROR_SOURCE_OF_REQUISITION_TEMPLATE_COLUMN_CANNOT_BE_NULL;
import static org.openlmis.requisition.i18n.MessageKeys.ERROR_VALIDATION_CANNOT_ASSIGN_WARD_SERVICE_TYPE;
import static org.openlmis.requisition.i18n.MessageKeys.ERROR_VALIDATION_COLUMN_DEFINITION_MODIFIED;
import static org.openlmis.requisition.i18n.MessageKeys.ERROR_VALIDATION_COLUMN_DEFINITION_NOT_FOUND;
import static org.openlmis.requisition.i18n.MessageKeys.ERROR_VALIDATION_FIELD_CANNOT_BE_NULL;
Expand All @@ -47,6 +48,7 @@
import org.openlmis.requisition.domain.AvailableRequisitionColumn;
import org.openlmis.requisition.domain.SourceType;
import org.openlmis.requisition.dto.AvailableRequisitionColumnOptionDto;
import org.openlmis.requisition.dto.FacilityTypeDto;
import org.openlmis.requisition.dto.RequisitionTemplateColumnDto;
import org.openlmis.requisition.dto.RequisitionTemplateDto;
import org.openlmis.requisition.repository.AvailableRequisitionColumnRepository;
Expand All @@ -61,10 +63,10 @@
@SuppressWarnings("PMD.TooManyMethods")
public class RequisitionTemplateDtoValidator extends BaseValidator {

static final String WARD_SERVICE_TYPE = "WS";
static final String COLUMNS_MAP = "columnsMap";
static final String NUMBER_OF_PERIODS_TO_AVERAGE = "numberOfPeriodsToAverage";
static final String PROGRAM_ID = "programId";
static final String FACILITY_TYPE_ID = "facilityTypeId";
static final String PROGRAM = "program";
static final String FACILITY_TYPE = "facility type";
static final String REQUESTED_QUANTITY = "requestedQuantity";
Expand All @@ -83,6 +85,7 @@ public class RequisitionTemplateDtoValidator extends BaseValidator {
static final Set<String> STOCK_BASED_COLUMNS = Sets.asSet(
BEGINNING_BALANCE, STOCK_ON_HAND, TOTAL_RECEIVED_QUANTITY, TOTAL_CONSUMED_QUANTITY,
TOTAL_LOSSES_AND_ADJUSTMENTS, TOTAL_STOCKOUT_DAYS, AVERAGE_CONSUMPTION);
static final String FACILITY_TYPES = "facilityTypes";

private Errors errors;

Expand Down Expand Up @@ -135,10 +138,14 @@ public void validate(Object target, Errors errors) {
}

for (UUID facilityTypeId : template.getFacilityTypeIds()) {
if (null == facilityTypeReferenceDataService.findOne(facilityTypeId)) {
rejectValue(errors, FACILITY_TYPE_ID,
FacilityTypeDto facilityType = facilityTypeReferenceDataService.findOne(facilityTypeId);
if (null == facilityType) {
rejectValue(errors, FACILITY_TYPES,
new Message(ERROR_VALIDATION_REFERENCED_OBJECT_DOES_NOT_EXIST,
FACILITY_TYPE, facilityTypeId));
} else if (facilityType.getCode().equals(WARD_SERVICE_TYPE)) {
rejectValue(errors, FACILITY_TYPES,
new Message(ERROR_VALIDATION_CANNOT_ASSIGN_WARD_SERVICE_TYPE));
}
}
}
Expand Down
1 change: 1 addition & 0 deletions src/main/resources/messages_en.properties
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,7 @@ requisition.error.validation.datePhysicalStockCountCompleted.mismatch=You can't
requisition.error.validation.columnDefinitionNotFound=Cannot find column definition for column {0}
requisition.error.validation.columnDefinitionModified=Column definition for column {0} has been modified
requisition.error.validation.referencedObjectDoesNotExist=The {0} with ID {1} does not exist.
requisition.error.validation.cannotAssignWardServiceForRequisitionTemplate=Ward/Service type facilities cannot be assigned to a Requisition Template.
requisition.error.validation.sourceOfRequisitionTemplateColumnCannotBeNull=Source of requisition template column {0} cannot be null.
requisition.error.validation.stockoutDaysCantBeGreaterThanLengthOfPeriod=Total stockout days cannot be greater than length of processing period.
requisition.error.validation.cannotConvertToOrderWithoutApprovedQty=Requisition with UUID {0} cannot be converted to an order, because the approved quantity column is not enabled in the requisition template.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,4 +61,15 @@ public FacilityTypeDtoDataBuilder withActive(Boolean active) {
this.active = active;
return this;
}

public FacilityTypeDtoDataBuilder withCode(String code) {
this.code = code;
return this;
}

public FacilityTypeDtoDataBuilder withId(UUID id) {
this.id = id;
return this;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@
import static org.openlmis.requisition.i18n.MessageKeys.ERROR_OPTION_NOT_AVAILABLE;
import static org.openlmis.requisition.i18n.MessageKeys.ERROR_SOURCE_NOT_AVAILABLE;
import static org.openlmis.requisition.i18n.MessageKeys.ERROR_SOURCE_OF_REQUISITION_TEMPLATE_COLUMN_CANNOT_BE_NULL;
import static org.openlmis.requisition.i18n.MessageKeys.ERROR_VALIDATION_CANNOT_ASSIGN_WARD_SERVICE_TYPE;
import static org.openlmis.requisition.i18n.MessageKeys.ERROR_VALIDATION_COLUMN_DEFINITION_MODIFIED;
import static org.openlmis.requisition.i18n.MessageKeys.ERROR_VALIDATION_COLUMN_DEFINITION_NOT_FOUND;
import static org.openlmis.requisition.i18n.MessageKeys.ERROR_VALIDATION_FIELD_CANNOT_BE_NULL;
Expand All @@ -51,7 +52,7 @@
import static org.openlmis.requisition.validate.RequisitionTemplateDtoValidator.CALCULATED_ORDER_QUANTITY;
import static org.openlmis.requisition.validate.RequisitionTemplateDtoValidator.COLUMNS_MAP;
import static org.openlmis.requisition.validate.RequisitionTemplateDtoValidator.FACILITY_TYPE;
import static org.openlmis.requisition.validate.RequisitionTemplateDtoValidator.FACILITY_TYPE_ID;
import static org.openlmis.requisition.validate.RequisitionTemplateDtoValidator.FACILITY_TYPES;
import static org.openlmis.requisition.validate.RequisitionTemplateDtoValidator.MAX_COLUMN_DEFINITION_LENGTH;
import static org.openlmis.requisition.validate.RequisitionTemplateDtoValidator.NUMBER_OF_PERIODS_TO_AVERAGE;
import static org.openlmis.requisition.validate.RequisitionTemplateDtoValidator.PROGRAM;
Expand All @@ -64,6 +65,7 @@
import static org.openlmis.requisition.validate.RequisitionTemplateDtoValidator.TOTAL_LOSSES_AND_ADJUSTMENTS;
import static org.openlmis.requisition.validate.RequisitionTemplateDtoValidator.TOTAL_RECEIVED_QUANTITY;
import static org.openlmis.requisition.validate.RequisitionTemplateDtoValidator.TOTAL_STOCKOUT_DAYS;
import static org.openlmis.requisition.validate.RequisitionTemplateDtoValidator.WARD_SERVICE_TYPE;

import java.util.Optional;
import java.util.Random;
Expand All @@ -75,22 +77,22 @@
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import org.mockito.junit.MockitoJUnitRunner;
import org.openlmis.requisition.domain.AvailableRequisitionColumn;
import org.openlmis.requisition.domain.AvailableRequisitionColumnOption;
import org.openlmis.requisition.domain.RequisitionTemplate;
import org.openlmis.requisition.domain.RequisitionTemplateColumn;
import org.openlmis.requisition.domain.RequisitionTemplateColumnDataBuilder;
import org.openlmis.requisition.domain.RequisitionTemplateDataBuilder;
import org.openlmis.requisition.dto.AvailableRequisitionColumnOptionDto;
import org.openlmis.requisition.dto.FacilityTypeDto;
import org.openlmis.requisition.dto.RequisitionTemplateColumnDto;
import org.openlmis.requisition.dto.RequisitionTemplateDto;
import org.openlmis.requisition.repository.AvailableRequisitionColumnRepository;
import org.openlmis.requisition.service.referencedata.FacilityTypeReferenceDataService;
import org.openlmis.requisition.service.referencedata.ProgramReferenceDataService;
import org.openlmis.requisition.testutils.AvailableRequisitionColumnDataBuilder;
import org.openlmis.requisition.testutils.AvailableRequisitionColumnOptionDataBuilder;
import org.openlmis.requisition.testutils.FacilityTypeDtoDataBuilder;
import org.openlmis.requisition.testutils.ProgramDtoDataBuilder;
import org.openlmis.requisition.utils.Message;
import org.springframework.validation.Errors;
Expand Down Expand Up @@ -517,11 +519,26 @@ public void shouldRejectIfFacilityTypeWithSpecifiedIdDoesNotExist() throws Excep
when(facilityTypeReferenceDataService.findOne(facilityTypeId)).thenReturn(null);

validator.validate(requisitionTemplate, errors);
verify(errors).rejectValue(eq(FACILITY_TYPE_ID),
verify(errors).rejectValue(eq(FACILITY_TYPES),
eq(new Message(ERROR_VALIDATION_REFERENCED_OBJECT_DOES_NOT_EXIST,
FACILITY_TYPE, facilityTypeId).toString()));
}

@Test
public void shouldRejectIfFacilityTypeIsWardService() throws Exception {
RequisitionTemplateDto requisitionTemplate = generateTemplate();
UUID facilityTypeId = requisitionTemplate.getFacilityTypeIds().iterator().next();
when(facilityTypeReferenceDataService.findOne(facilityTypeId))
.thenReturn(new FacilityTypeDtoDataBuilder()
.withId(facilityTypeId)
.withCode(WARD_SERVICE_TYPE)
.buildAsDto());

validator.validate(requisitionTemplate, errors);
verify(errors).rejectValue(eq(FACILITY_TYPES),
eq(new Message(ERROR_VALIDATION_CANNOT_ASSIGN_WARD_SERVICE_TYPE).toString()));
}

@Test
public void shouldRejectWhenSourceInRequisitionTemplateColumnIsNull() throws Exception {
RequisitionTemplateDto requisitionTemplate = generateTemplate();
Expand Down Expand Up @@ -709,7 +726,7 @@ private void mockResponses(RequisitionTemplateDto template) {

for (UUID facilityTypeId : template.getFacilityTypeIds()) {
when(facilityTypeReferenceDataService.findOne(facilityTypeId)).thenReturn(
new FacilityTypeDto());
new FacilityTypeDtoDataBuilder().buildAsDto());
}
}

Expand Down
Loading