/*
* Electronic Logistics Management Information System (eLMIS) is a supply chain management system for health commodities in a developing country setting.
*
* Copyright (C) 2015 John Snow, Inc (JSI). This program was produced for the U.S. Agency for International Development (USAID). It was prepared under the USAID | DELIVER PROJECT, Task Order 4.
*
* This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.openlmis.ivdform.domain.reports;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import org.openlmis.core.domain.BaseModel;
import org.openlmis.core.domain.Facility;
import org.openlmis.core.domain.ProcessingPeriod;
import org.openlmis.core.domain.ProgramProduct;
import org.openlmis.core.exception.DataException;
import org.openlmis.core.serializer.DateDeserializer;
import org.openlmis.demographics.domain.AnnualFacilityEstimateEntry;
import org.openlmis.ivdform.domain.VaccineDisease;
import org.openlmis.ivdform.domain.VaccineProductDose;
import org.openlmis.ivdform.domain.Vitamin;
import org.openlmis.ivdform.domain.VitaminSupplementationAgeGroup;
import org.openlmis.ivdform.domain.config.VaccineIvdTabVisibility;
import java.util.*;
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class VaccineReport extends BaseModel {
private Long periodId;
private Long programId;
private Long facilityId;
private ReportStatus status;
private Long supervisoryNodeId;
private ProcessingPeriod period;
private Facility facility;
private String majorImmunizationActivities;
private Long fixedImmunizationSessions;
private Long plannedOutreachImmunizationSessions;
private Long outreachImmunizationSessions;
private Long outreachImmunizationSessionsCanceled;
private DropOutRate dropOutRate;
@JsonDeserialize(using = DateDeserializer.class)
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd")
private Date submissionDate;
private List<VaccineIvdTabVisibility> tabVisibilitySettings;
private List<LogisticsLineItem> logisticsLineItems;
private List<LogisticsLineItem> vaccineProductsLogisticsLineItems;
private List<AdverseEffectLineItem> adverseEffectLineItems;
private List<CampaignLineItem> campaignLineItems;
private List<AnnualFacilityEstimateEntry> facilityDemographicEstimates;
private List<VitaminSupplementationLineItem> vitaminSupplementationLineItems;
private List<LogisticsColumn> columnTemplate;
private List<VaccineCoverageItem> coverageLineItems;
private List<DiseaseLineItem> diseaseLineItems;
private List<ColdChainLineItem> coldChainLineItems;
private List<ReportStatusChange> reportStatusChanges;
public String rejectionComment;
public void initializeLogisticsLineItems(List<ProgramProduct> programProducts, VaccineReport previousReport, Boolean defaultFieldsToZero) {
logisticsLineItems = new ArrayList<>();
Map<String, LogisticsLineItem> previousLineItemMap = new HashMap<>();
if (previousReport != null) {
for (LogisticsLineItem lineItem : previousReport.getLogisticsLineItems()) {
previousLineItemMap.put(lineItem.getProductCode(), lineItem);
}
}
for (ProgramProduct pp : programProducts) {
LogisticsLineItem item = new LogisticsLineItem();
item.setReportId(id);
item.setProductId(pp.getProduct().getId());
item.setProductCode(pp.getProduct().getCode());
item.setProductName(pp.getProduct().getPrimaryName());
item.setProductCategory(pp.getProductCategory().getName());
item.setDosageUnit(pp.getProduct().getDosageUnit().getCode());
item.setDisplayOrder(pp.getDisplayOrder());
if (previousReport != null) {
LogisticsLineItem lineitem = previousLineItemMap.get(item.getProductCode());
if (lineitem != null) {
item.setOpeningBalance(lineitem.getClosingBalance());
item.setClosingBalance(item.getOpeningBalance());
}
}
if(defaultFieldsToZero){
if(item.getOpeningBalance() == null){
item.setOpeningBalance(0L);
}
item.setClosingBalance(item.getOpeningBalance());
item.setQuantityReceived(0L);
item.setQuantityIssued(0L);
item.setQuantityVvmAlerted(0L);
item.setQuantityExpired(0L);
item.setQuantityDiscardedOpened(0L);
item.setQuantityDiscardedUnopened(0L);
item.setQuantityWastedOther(0L);
item.setDaysStockedOut(0L);
}
logisticsLineItems.add(item);
}
}
public void initializeDiseaseLineItems(List<VaccineDisease> diseases, Boolean defaultFieldsToZero) {
diseaseLineItems = new ArrayList<>();
for (VaccineDisease disease : diseases) {
DiseaseLineItem lineItem = new DiseaseLineItem();
lineItem.setReportId(id);
lineItem.setDiseaseId(disease.getId());
lineItem.setDiseaseName(disease.getName());
lineItem.setDisplayOrder(disease.getDisplayOrder());
if(defaultFieldsToZero){
lineItem.setCases(0L);
lineItem.setDeath(0L);
}
diseaseLineItems.add(lineItem);
}
}
public void initializeCoverageLineItems(List<VaccineProductDose> dosesToCover, Boolean defaultFieldsToZero) {
coverageLineItems = new ArrayList<>();
for (VaccineProductDose dose : dosesToCover) {
VaccineCoverageItem item = new VaccineCoverageItem();
item.setReportId(id);
item.setDoseId(dose.getDoseId());
item.setTrackMale(dose.getTrackMale());
item.setTrackFemale(dose.getTrackFemale());
item.setDisplayOrder(dose.getDisplayOrder());
item.setDisplayName(dose.getDisplayName());
item.setProductName(dose.getProductName());
item.setProductId(dose.getProductId());
if(defaultFieldsToZero){
item.setRegularMale(0L);
item.setRegularFemale(0L);
item.setCampaignMale(0L);
item.setCampaignFemale(0L);
item.setOutreachMale(0L);
item.setOutreachFemale(0L);
}
coverageLineItems.add(item);
}
}
public void initializeColdChainLineItems(List<ColdChainLineItem> lineItems, Boolean defaultFieldsToZero) {
if(defaultFieldsToZero) {
for (ColdChainLineItem lineItem : lineItems) {
lineItem.setMinTemp(0F);
lineItem.setMaxTemp(0F);
lineItem.setMinEpisodeTemp(0F);
lineItem.setMaxEpisodeTemp(0F);
}
}
coldChainLineItems = lineItems;
}
public void initializeVitaminLineItems(List<Vitamin> vitamins, List<VitaminSupplementationAgeGroup> ageGroups, Boolean defaultFieldsToZero) {
this.vitaminSupplementationLineItems = new ArrayList<>();
Long displayOrder = 1L;
for (Vitamin vitamin : vitamins) {
for (VitaminSupplementationAgeGroup ageGroup : ageGroups) {
VitaminSupplementationLineItem item = new VitaminSupplementationLineItem();
item.setVitaminAgeGroupId(ageGroup.getId());
item.setDisplayOrder(displayOrder);
item.setVitaminName(vitamin.getName());
item.setVaccineVitaminId(vitamin.getId());
item.setAgeGroup(ageGroup.getName());
if(defaultFieldsToZero){
item.setMaleValue(0L);
item.setFemaleValue(0L);
}
this.vitaminSupplementationLineItems.add(item);
displayOrder++;
}
}
}
public void validateBasicHeaders(){
if(this.getPeriodId() == null || this.getFacilityId() == null || this.getProgramId() == null){
throw new DataException("error.ivd.form.submitted.misses.required.fields");
}
}
public void copyValuesFrom(VaccineReport report) {
this.setRejectionComment(report.rejectionComment);
this.setFixedImmunizationSessions(report.fixedImmunizationSessions);
this.setMajorImmunizationActivities(report.majorImmunizationActivities);
this.setOutreachImmunizationSessions(report.outreachImmunizationSessions);
this.setOutreachImmunizationSessionsCanceled(report.outreachImmunizationSessionsCanceled);
this.setSubmissionDate(report.getSubmissionDate());
}
}