/*
* 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.report.service;
import org.openlmis.report.model.params.PerformanceByDropoutRateParam;
import org.openlmis.report.model.report.vaccine.StatusOfVaccinationSuppliesReceivedReport;
import org.openlmis.report.model.report.vaccine.StatusOfVaccinationSuppliesRecievedDetail;
import org.openlmis.report.repository.PerformanceByDropoutRateByDistrictRepository;
import org.openlmis.report.repository.StatusOfVaccinationSuppliesRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.Map;
@Component
public class StatusOfVaccinationSupplyService {
@Autowired
private StatusOfVaccinationSuppliesRepository repository;
@Autowired
private PerformanceByDropoutRateByDistrictRepository dropoutRateByDistrictRepository;
public StatusOfVaccinationSuppliesReceivedReport loadStatusOfVaccineSupplyReport(Map<String, String[]> filterCriteria) {
StatusOfVaccinationSuppliesReceivedReport suppliesReceivedReport ;
boolean isFacilityReport ;
boolean isRegionReport ;
List<StatusOfVaccinationSuppliesRecievedDetail> statusOfVaccinationSuppliesFacilityDistrictList;
List<StatusOfVaccinationSuppliesRecievedDetail> statusOfVaccinationSuppliesRegionList = null;
Map<String, StatusOfVaccinationSuppliesRecievedDetail> facilityOrDistrictPopulationMap ;
Map<String, StatusOfVaccinationSuppliesRecievedDetail> regionPopulationMap ;
PerformanceByDropoutRateParam filterParam ;
filterParam = ReportsCommonUtilService.prepareParam(filterCriteria);
isRegionReport = filterParam.getGeographic_zone_id() == 0 ? true : false;
isFacilityReport = dropoutRateByDistrictRepository.isDistrictLevel(filterParam.getGeographic_zone_id());
if (isFacilityReport) {
statusOfVaccinationSuppliesFacilityDistrictList = this.repository.loadStatusOfVaccineSupplyForFacilityReports(filterParam);
facilityOrDistrictPopulationMap = this.repository.loadPopulationForFacilityReports(filterParam);
this.extractPopulationInformation(statusOfVaccinationSuppliesFacilityDistrictList,facilityOrDistrictPopulationMap,ReportsCommonUtilService.FACILLITY_REPORT);
} else {
statusOfVaccinationSuppliesFacilityDistrictList = this.repository.loadStatusOfVaccineSupplyForDistrict(filterParam);
facilityOrDistrictPopulationMap = this.repository.loadPopulationForDistrict(filterParam);
this.extractPopulationInformation(statusOfVaccinationSuppliesFacilityDistrictList,facilityOrDistrictPopulationMap,ReportsCommonUtilService.DISTRICT_REPORT);
if (isRegionReport) {
statusOfVaccinationSuppliesRegionList = this.repository.loadStatusOfVaccineSupplyForRegionReports(filterParam);
regionPopulationMap = this.repository.loadPopulationForRegionReports(filterParam);
this.extractPopulationInformation(statusOfVaccinationSuppliesRegionList,regionPopulationMap,ReportsCommonUtilService.REGION_REPORT);
}
}
suppliesReceivedReport = this.aggeregaeReportValue(statusOfVaccinationSuppliesFacilityDistrictList);
suppliesReceivedReport.setFacilityDistrictVaccineStatusList(statusOfVaccinationSuppliesFacilityDistrictList);
suppliesReceivedReport.setRegionVaccineStatusList(statusOfVaccinationSuppliesRegionList);
suppliesReceivedReport.setFacilityReport(isFacilityReport);
suppliesReceivedReport.setRegionReport(isRegionReport);
return suppliesReceivedReport;
}
private void extractPopulationInformation(List<StatusOfVaccinationSuppliesRecievedDetail> statusOfVaccinationSuppliesFacilityDistrictList,
Map<String, StatusOfVaccinationSuppliesRecievedDetail> populationListMap, int geoLevel) {
for (StatusOfVaccinationSuppliesRecievedDetail vaccinationSuppliesRecievedDetail : statusOfVaccinationSuppliesFacilityDistrictList) {
Long population;
String geoLevelName ;
StatusOfVaccinationSuppliesRecievedDetail populationInfo ;
if (geoLevel == ReportsCommonUtilService.FACILLITY_REPORT) {
geoLevelName = vaccinationSuppliesRecievedDetail.getFacility_name();
} else if (geoLevel == ReportsCommonUtilService.DISTRICT_REPORT) {
geoLevelName = vaccinationSuppliesRecievedDetail.getDistrict_name();
} else {
geoLevelName = vaccinationSuppliesRecievedDetail.getRegion_name();
}
geoLevelName+="_"+vaccinationSuppliesRecievedDetail.getPeriod_name();
populationInfo = populationListMap.get(geoLevelName);
population = populationInfo != null ? populationInfo.getTargetpopulation() : 0L;
vaccinationSuppliesRecievedDetail.setTargetpopulation(population);
}
}
public StatusOfVaccinationSuppliesReceivedReport aggeregaeReportValue(List<StatusOfVaccinationSuppliesRecievedDetail> statusOfVaccinationSuppliesFacilityDistrictList) {
StatusOfVaccinationSuppliesReceivedReport suppliesReceivedReport = new StatusOfVaccinationSuppliesReceivedReport();
float totalReceived = 0f;
float totalOnHand = 0f;
float totalIssued = 0f;
float totalUsed = 0f;
float totalWasted = 0f;
float totalAdminstered = 0f;
Long totalPopulation = 0L;
for (StatusOfVaccinationSuppliesRecievedDetail statusOfVaccinationSuppliesRecievedDetail : statusOfVaccinationSuppliesFacilityDistrictList) {
totalReceived += statusOfVaccinationSuppliesRecievedDetail.getReceived();
totalOnHand += statusOfVaccinationSuppliesRecievedDetail.getOnhand();
totalIssued += statusOfVaccinationSuppliesRecievedDetail.getIssued();
totalUsed += statusOfVaccinationSuppliesRecievedDetail.getUsed();
totalWasted += statusOfVaccinationSuppliesRecievedDetail.getWasted();
totalAdminstered += statusOfVaccinationSuppliesRecievedDetail.getAdministered();
totalPopulation += statusOfVaccinationSuppliesRecievedDetail.getTargetpopulation();
}
suppliesReceivedReport.setTotalReceived(totalReceived);
suppliesReceivedReport.setTotalOnHand(totalOnHand);
suppliesReceivedReport.setTotalIssued(totalIssued);
suppliesReceivedReport.setTotalUsed(totalUsed);
suppliesReceivedReport.setTotalWasted(totalWasted);
suppliesReceivedReport.setTotalAdminstered(totalAdminstered);
suppliesReceivedReport.setTotalPopulation(totalPopulation);
return suppliesReceivedReport;
}
}