package net.techreadiness.batch.org.info;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import javax.inject.Inject;
import javax.inject.Named;
import net.techreadiness.batch.BaseItemWriter;
import net.techreadiness.batch.Binder;
import net.techreadiness.batch.org.OrgData;
import net.techreadiness.service.OrganizationService;
import net.techreadiness.service.ServiceContext;
import net.techreadiness.service.common.ValidationError;
import net.techreadiness.service.exception.FaultInfo;
import net.techreadiness.service.exception.ValidationServiceException;
import net.techreadiness.service.object.Org;
import org.apache.commons.lang3.StringUtils;
import org.springframework.batch.item.ItemWriter;
import org.springframework.context.MessageSource;
public class OrgInfoWriter extends BaseItemWriter implements ItemWriter<OrgData> {
@Inject
private OrganizationService orgService;
@Inject
@Named("orgInfoBinder")
private Binder<OrgData> binder;
@Inject
private MessageSource messageSource;
private Boolean dataIsIncomplete = false;
@Override
public void write(List<? extends OrgData> items) throws Exception {
ServiceContext serviceContext = getServiceContext();
for (OrgData orgData : items) {
ValidationError typeError = null;
Org org = orgService.getMatch(serviceContext, orgData.getOrg());
if (org == null) {
String msg = messageSource.getMessage("validation.org.noMatch", new Object[] { orgData.getOrg().getCode() },
Locale.getDefault());
ValidationError error = new ValidationError("code", "Code", msg);
ValidationServiceException e = new ValidationServiceException(new FaultInfo());
e.getFaultInfo().getAttributeErrors().add(error);
throw e;
}
if (!org.getOrgTypeCode().equals("school")) {
String errorMsg = messageSource.getMessage("validation.org.mustBeSchool", new Object[] { org.getLocalCode(),
org.getOrgTypeCode() }, Locale.getDefault());
typeError = new ValidationError("code", "Code", errorMsg);
}
OrgData merged = new OrgData();
merged.setOrg(org);
merged = binder.bind(merged, orgData.getFieldSet());
try {
orgService.addOrUpdate(serviceContext, merged.getOrg());
org = orgService.getById(getServiceContext(), org.getOrgId());
dataIsIncomplete = checkForMissingData(org);
if (dataIsIncomplete && org.getDataEntryComplete() != null && org.getDataEntryComplete().equals("true")) {
org.setDataEntryComplete("false");
org.setDataEntryCompleteUser(getServiceContext().getUserName());
org.setDataEntryCompleteDate(new Date());
}
orgService.addOrUpdate(serviceContext, org);
} catch (ValidationServiceException e) {
if (typeError != null) {
e.getFaultInfo().getAttributeErrors().add(typeError);
}
throw e;
}
if (typeError != null) {
ValidationServiceException e = new ValidationServiceException(new FaultInfo());
e.getFaultInfo().getAttributeErrors().add(typeError);
throw e;
}
}
}
public Boolean checkForMissingData(Org org) {
int errorCount = 0;
if (org.getInternetUtilization() == null || StringUtils.isBlank(org.getInternetUtilization())) {
errorCount++;
}
if (org.getInternetSpeed() == null || StringUtils.isBlank(org.getInternetSpeed())) {
errorCount++;
}
if (org.getNetworkSpeed() == null || StringUtils.isBlank(org.getNetworkSpeed())) {
errorCount++;
}
if (org.getNetworkUtilization() == null || StringUtils.isBlank(org.getNetworkUtilization())) {
errorCount++;
}
if (org.getTestingWindowLength() == null || StringUtils.isBlank(org.getTestingWindowLength())) {
errorCount++;
}
if (org.getSessionsPerDay() == null || StringUtils.isBlank(org.getSessionsPerDay())) {
errorCount++;
}
int enrollmentCountTotal = getAnsweredEnrollmentCount(org);
if (enrollmentCountTotal == 0) {
errorCount++;
}
if (errorCount == 0) {
return false;
}
return true;
}
private static int getAnsweredEnrollmentCount(Org org) {
int count = (StringUtils.isBlank(org.getEnrollmentCountK()) ? 0 : 1)
+ (StringUtils.isBlank(org.getEnrollmentCount1()) ? 0 : 1)
+ (StringUtils.isBlank(org.getEnrollmentCount2()) ? 0 : 1)
+ (StringUtils.isBlank(org.getEnrollmentCount3()) ? 0 : 1)
+ (StringUtils.isBlank(org.getEnrollmentCount4()) ? 0 : 1)
+ (StringUtils.isBlank(org.getEnrollmentCount5()) ? 0 : 1)
+ (StringUtils.isBlank(org.getEnrollmentCount6()) ? 0 : 1)
+ (StringUtils.isBlank(org.getEnrollmentCount7()) ? 0 : 1)
+ (StringUtils.isBlank(org.getEnrollmentCount8()) ? 0 : 1)
+ (StringUtils.isBlank(org.getEnrollmentCount9()) ? 0 : 1)
+ (StringUtils.isBlank(org.getEnrollmentCount10()) ? 0 : 1)
+ (StringUtils.isBlank(org.getEnrollmentCount11()) ? 0 : 1)
+ (StringUtils.isBlank(org.getEnrollmentCount12()) ? 0 : 1);
return count;
}
}