/// <summary> /// Retrieves the loss ratio and total value of lost/discarded packages for each distribution centre. /// </summary> /// <returns>a list of distribution centre, loss value, loss ratio and risk level</returns> public List <DistributionCentreLossViewData> DistributionCentreLosses() { const double riskThreshold = 0.09; List <DistributionCentreLossViewData> report = new List <DistributionCentreLossViewData>(); List <DistributionCentre> distributionCentres = DistributionCentreDAO.FindAllDistributionCentres(); foreach (DistributionCentre distributionCentre in distributionCentres) { List <MedicationTypeViewData> lostList = ReportDAO.FindDistributionCentreStockByStatus(distributionCentre.ID, PackageStatus.Discarded, PackageStatus.Lost); decimal lostTotal = lostList.Sum(type => type.Value); List <MedicationTypeViewData> handledList = ReportDAO.FindDistributionCentreStockByStatus(distributionCentre.ID, PackageStatus.Distributed, PackageStatus.Discarded, PackageStatus.Lost); decimal handledTotal = handledList.Sum(type => type.Value); double lossRatio; if (handledTotal == 0) { lossRatio = 0; } else { lossRatio = Convert.ToDouble(lostTotal / handledTotal); } DistributionCentreRiskLevel riskLevel = DistributionCentreRiskLevel.Low; if (Convert.ToDouble(lossRatio) > riskThreshold) { riskLevel = DistributionCentreRiskLevel.High; } report.Add(new DistributionCentreLossViewData { DistributionCentre = distributionCentre.Name, LossRatio = lossRatio, LossValue = lostTotal, RiskLevel = riskLevel }); } return(report.OrderByDescending(x => x.LossRatio).ToList()); }
/// <summary> /// Retrieves the quantity and total value for each product type in stock at a given distribution centre. /// </summary> /// <param name="distributionCentreId">distribution centre id</param> /// <returns>a list of quantity, package type and value of packages</returns> public List <MedicationTypeViewData> DistributionCentreStock(int distributionCentreId) { return(ReportDAO.FindDistributionCentreStockByStatus(distributionCentreId, PackageStatus.InStock)); }