ReportClaimPropertiesFactory.java
package uk.gov.dhsc.htbhf.claimant.reporting.payload;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import uk.gov.dhsc.htbhf.claimant.message.context.ReportClaimMessageContext;
import uk.gov.dhsc.htbhf.claimant.model.UpdatableClaimantField;
import uk.gov.dhsc.htbhf.claimant.reporting.ClaimantCategoryCalculator;
import java.time.LocalDate;
import java.time.temporal.ChronoUnit;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import static org.springframework.util.ObjectUtils.isEmpty;
import static uk.gov.dhsc.htbhf.claimant.reporting.payload.CustomDimension.NUMBER_OF_WEEKS_PREGNANT;
import static uk.gov.dhsc.htbhf.claimant.reporting.payload.CustomMetric.WEEKS_PREGNANT;
import static uk.gov.dhsc.htbhf.claimant.reporting.payload.EventCategory.CLAIM;
import static uk.gov.dhsc.htbhf.claimant.reporting.payload.EventProperties.EVENT_LABEL;
/**
* Factory class for creating a map of parameters for claims reported to google analytics measurement protocol.
*/
@Component
public class ReportClaimPropertiesFactory extends ReportPropertiesFactory {
public ReportClaimPropertiesFactory(@Value("${google-analytics.tracking-id}") String trackingId,
ClaimantCategoryCalculator claimantCategoryCalculator) {
super(trackingId, claimantCategoryCalculator);
}
public Map<String, String> createReportPropertiesForClaimEvent(ReportClaimMessageContext context) {
Map<String, String> reportProperties = new LinkedHashMap<>();
reportProperties.putAll(mapValuesToString(createMandatoryPropertiesMap()));
reportProperties.putAll(mapValuesToString(createEventPropertiesMap(context, CLAIM, 0)));
if (updatedClaimFieldsExists(context)) {
reportProperties.put(EVENT_LABEL.getFieldName(), convertToCommaSeparatedString(context.getUpdatedClaimantFields()));
}
reportProperties.putAll(mapValuesToString(createCommonCustomDimensions(context)));
reportProperties.putAll(mapValuesToString(createCommonCustomMetrics(context)));
reportProperties.putAll(mapValuesToString(createCustomPropertiesMapForClaimEvent(context)));
return reportProperties;
}
private boolean updatedClaimFieldsExists(ReportClaimMessageContext context) {
return !isEmpty(context.getUpdatedClaimantFields());
}
private String convertToCommaSeparatedString(List<UpdatableClaimantField> updatedClaimFields) {
return updatedClaimFields.stream().map(UpdatableClaimantField::getFieldName).collect(Collectors.joining(", "));
}
private Map<String, Object> createCustomPropertiesMapForClaimEvent(ReportClaimMessageContext context) {
Map<String, Object> customProperties = new HashMap();
LocalDate expectedDeliveryDate = context.getClaim().getClaimant().getExpectedDeliveryDate();
LocalDate atDate = context.getTimestamp().toLocalDate();
if (isClaimantPregnant(expectedDeliveryDate, atDate)) {
LocalDate conception = expectedDeliveryDate.minusWeeks(PREGNANCY_DURATION_IN_WEEKS);
long weeksPregnant = ChronoUnit.WEEKS.between(conception, atDate);
customProperties.put(WEEKS_PREGNANT.getFieldName(), weeksPregnant);
customProperties.put(NUMBER_OF_WEEKS_PREGNANT.getFieldName(), weeksPregnant);
}
return customProperties;
}
}