using System; using System.Collections.Generic; using System.Linq; using System.Web; using Weee.Models; using Weee.Models.ExtensionMethods; namespace Weee.Supports { public class CarbonEmissionCalculator { public static decimal GetMaterialProductionAndTransportPhase(ICollection materials) { return CalculateMaterialProductionAndTransportPhase(materials); } public static decimal GetProductionPhase(ProductLCA productLca) { //warning , this code is duplicated in ProductLCAInventoryExcelExporter.cs private function "InsertProductCO2DataInManufacturing" var snapshot = productLca.SnapShotSurveyResult; if (snapshot == null) return 0m; var scopeOneData = snapshot.Scope1FabResult * snapshot.constantFactorInWorkHour; var scopeTwoData = snapshot.Scope2FabResult * snapshot.constantFactorInWorkHour; var scopeThreeData = snapshot.Scope3FabResult * snapshot.constantFactorInWorkHour; var primaryData = scopeOneData + scopeThreeData + scopeTwoData; var secondaryDataOfManufacturing = (snapshot.SecondaryWasteResult + snapshot.SecondaryWasteTransportResult) * snapshot.constantFactorInWorkHour; var lcaResultCO2 = secondaryDataOfManufacturing + primaryData; return lcaResultCO2.HasValue ? lcaResultCO2.Value : 0m; } public static decimal GetDeliveryPhase(ProductLCA productLca) { return CalculateDeliveryPhase(productLca); } public static decimal GetAbandonedPhase(InventoryStageData inventoryStageData) { return CalculateAbandonedPhase(inventoryStageData); } public static decimal GetSecondDataTypeOfPartsKgCO2e(ICollection materials) { //land mine ! this is related to ProductLCAInventoryExcelExporter.InsertCO2Inventory return materials.Where(x => x.RequestSent != null) .Where(x => x.RequestSent.AcceptReplyDate != null) .Where(x => x.RequestSent.RepliedByWhichLCA != null) .Sum(x => x.KgCO2e); } public static decimal GetPrimaryDataTypeOfPartsKgCO2e(ICollection materials) { decimal primaryDataTypeOfPartsKgCO2e = 0; foreach (var material in materials) { var requestSent = material.RequestSent; var repliedLca = requestSent != null ? requestSent.RepliedByWhichLCA : null; if (requestSent == null || repliedLca == null) continue; var totalKgCO2e = CalculateTotalKgCO2e(repliedLca); var distributeWeight = CalculateDistributeWeight(repliedLca); var distributeArea = CalculateDistributeArea(repliedLca); var distributeHour = CalculateDistributeHour(repliedLca); if (requestSent.DivideBy == ProductLCAReplyRequest.DivideByOptions.byWeight && distributeWeight != 0) { primaryDataTypeOfPartsKgCO2e += totalKgCO2e / distributeWeight; } else if (requestSent.DivideBy == ProductLCAReplyRequest.DivideByOptions.byArea && distributeArea != 0) { primaryDataTypeOfPartsKgCO2e += totalKgCO2e / distributeArea; } else if (requestSent.DivideBy == ProductLCAReplyRequest.DivideByOptions.byWorkHour && distributeHour != 0) { primaryDataTypeOfPartsKgCO2e += totalKgCO2e / distributeHour; } } return primaryDataTypeOfPartsKgCO2e; } public static decimal GetMaterialScopeOneDistributeKgCO2e(ICollection materials) { decimal materialScopeOneDistributeKgCO2e = 0; foreach (var material in materials) { var requestSent = material.RequestSent; var repliedLca = requestSent != null ? requestSent.RepliedByWhichLCA : null; if (requestSent == null || repliedLca == null || repliedLca.SnapShotSurveyResult == null) continue; var scopeOneKgCO2e = repliedLca.SnapShotSurveyResult.Scope1FabResult; if (requestSent.DivideBy == ProductLCAReplyRequest.DivideByOptions.byWeight && CalculateDistributeWeight(repliedLca) != 0) { materialScopeOneDistributeKgCO2e += scopeOneKgCO2e / CalculateDistributeWeight(repliedLca); } else if (requestSent.DivideBy == ProductLCAReplyRequest.DivideByOptions.byArea && CalculateDistributeArea(repliedLca) != 0) { materialScopeOneDistributeKgCO2e += scopeOneKgCO2e / CalculateDistributeArea(repliedLca); } else if (requestSent.DivideBy == ProductLCAReplyRequest.DivideByOptions.byWorkHour && CalculateDistributeHour(repliedLca) != 0) { materialScopeOneDistributeKgCO2e += scopeOneKgCO2e / CalculateDistributeHour(repliedLca); } } return materialScopeOneDistributeKgCO2e; } public static decimal GetMaterialScopeTwoDistributeKgCO2e(ICollection materials) { decimal materialScopeTwoDistributeKgCO2e = 0; foreach (var material in materials) { var requestSent = material.RequestSent; var repliedLca = requestSent != null ? requestSent.RepliedByWhichLCA : null; if (requestSent == null || repliedLca == null || repliedLca.SnapShotSurveyResult == null) continue; var scopeTwoKgCO2e = repliedLca.SnapShotSurveyResult.Scope2FabResult; if (requestSent.DivideBy == ProductLCAReplyRequest.DivideByOptions.byWeight && CalculateDistributeWeight(repliedLca) != 0) { materialScopeTwoDistributeKgCO2e += scopeTwoKgCO2e / CalculateDistributeWeight(repliedLca); } else if (requestSent.DivideBy == ProductLCAReplyRequest.DivideByOptions.byArea && CalculateDistributeArea(repliedLca) != 0) { materialScopeTwoDistributeKgCO2e += scopeTwoKgCO2e / CalculateDistributeArea(repliedLca); } else if (requestSent.DivideBy == ProductLCAReplyRequest.DivideByOptions.byWorkHour && CalculateDistributeHour(repliedLca) != 0) { materialScopeTwoDistributeKgCO2e += scopeTwoKgCO2e / CalculateDistributeHour(repliedLca); } } return materialScopeTwoDistributeKgCO2e; } public static decimal GetMaterialScopeThreeDistributeKgCO2e(ICollection materials) { decimal materialScopeThreeDistributeKgCO2e = 0; foreach (var material in materials) { var requestSent = material.RequestSent; var repliedLca = requestSent != null ? requestSent.RepliedByWhichLCA : null; if (requestSent == null || repliedLca == null || repliedLca.SnapShotSurveyResult == null) continue; var scopeThreeKgCO2e = repliedLca.SnapShotSurveyResult.Scope3FabResult; if (requestSent.DivideBy == ProductLCAReplyRequest.DivideByOptions.byWeight && CalculateDistributeWeight(repliedLca) != 0) { materialScopeThreeDistributeKgCO2e += scopeThreeKgCO2e / CalculateDistributeWeight(repliedLca); } else if (requestSent.DivideBy == ProductLCAReplyRequest.DivideByOptions.byArea && CalculateDistributeArea(repliedLca) != 0) { materialScopeThreeDistributeKgCO2e += scopeThreeKgCO2e / CalculateDistributeArea(repliedLca); } else if (requestSent.DivideBy == ProductLCAReplyRequest.DivideByOptions.byWorkHour && CalculateDistributeHour(repliedLca) != 0) { materialScopeThreeDistributeKgCO2e += scopeThreeKgCO2e / CalculateDistributeHour(repliedLca); } } return materialScopeThreeDistributeKgCO2e; } public static decimal GetWasteTransportDistributeByHour(ProductLCA productLca) { if (productLca == null || productLca.SnapShotSurveyResult == null || productLca.SnapShotSurveyResult.constantFactorInWorkHour == null) return 0; return productLca.SnapShotSurveyResult.SecondaryWasteTransportResult * productLca.SnapShotSurveyResult.constantFactorInWorkHour.Value; } private static decimal CalculateMaterialProductionAndTransportPhase(ICollection materials) { decimal materialProductionAndTransportPhase = 0; foreach (var material in materials) { var requestSent = material.RequestSent; ProductLCA repliedLca = requestSent != null ? requestSent.RepliedByWhichLCA : new ProductLCA(); decimal totalKgCO2e = CalculateTotalKgCO2e(repliedLca); if (requestSent == null || repliedLca == null) { materialProductionAndTransportPhase += material.KgCO2e; continue; } if (requestSent.DivideBy == ProductLCAReplyRequest.DivideByOptions.byWeight && CalculateDistributeWeight(repliedLca) != 0) { decimal totalKgCO2eDistributeByWeight = totalKgCO2e / CalculateDistributeWeight(repliedLca); materialProductionAndTransportPhase += (totalKgCO2eDistributeByWeight + repliedLca.SnapShotSurveyResult.SecondaryDirectMaterialResult + repliedLca.SnapShotSurveyResult.SecondaryIndirectMaterialResult + repliedLca.SnapShotSurveyResult.SecondaryWrapMaterialResult + repliedLca.SnapShotSurveyResult.SecondaryTransportResult) * material.Quantity; } else if (requestSent.DivideBy == ProductLCAReplyRequest.DivideByOptions.byArea && CalculateDistributeArea(repliedLca) != 0) { decimal totalKgCO2eDistributeByArea = totalKgCO2e / CalculateDistributeArea(repliedLca); materialProductionAndTransportPhase += (totalKgCO2eDistributeByArea + repliedLca.SnapShotSurveyResult.SecondaryDirectMaterialResult + repliedLca.SnapShotSurveyResult.SecondaryIndirectMaterialResult + repliedLca.SnapShotSurveyResult.SecondaryWrapMaterialResult + repliedLca.SnapShotSurveyResult.SecondaryTransportResult) * material.Quantity; } else if (requestSent.DivideBy == ProductLCAReplyRequest.DivideByOptions.byWorkHour && CalculateDistributeHour(repliedLca) != 0) { decimal totalKgCO2eDistributeByHour = totalKgCO2e / CalculateDistributeHour(repliedLca); materialProductionAndTransportPhase += (totalKgCO2eDistributeByHour + repliedLca.SnapShotSurveyResult.SecondaryDirectMaterialResult + repliedLca.SnapShotSurveyResult.SecondaryIndirectMaterialResult + repliedLca.SnapShotSurveyResult.SecondaryWrapMaterialResult + repliedLca.SnapShotSurveyResult.SecondaryTransportResult) * material.Quantity; } } return materialProductionAndTransportPhase; } private static decimal CalculateProductionPhase(ProductLCA productLca) { decimal distributeTotalKgCO2e = 0; if (CalculateDistributeWeight(productLca) != 0) { distributeTotalKgCO2e = CalculateTotalKgCO2e(productLca) / CalculateDistributeWeight(productLca); } else if (CalculateDistributeArea(productLca) != 0) { distributeTotalKgCO2e = CalculateTotalKgCO2e(productLca) / CalculateDistributeArea(productLca); } else if (CalculateDistributeHour(productLca) != 0) { distributeTotalKgCO2e = CalculateDistributeArea(productLca) / CalculateDistributeHour(productLca); } return distributeTotalKgCO2e + productLca.Materials.Sum(x => x.KgCO2e); } private static decimal CalculateDeliveryPhase(ProductLCA productLca) { return productLca.SnapShotSurveyResult.SecondaryTransportResult; } private static decimal CalculateAbandonedPhase(InventoryStageData inventoryStageData) { return inventoryStageData != null ? inventoryStageData.ProductAbandonedStageCarbonFootprint : 0; } private static decimal CalculateTotalKgCO2e(ProductLCA productLca) { if (productLca == null || productLca.SnapShotSurveyResult == null) return 0; return productLca.SnapShotSurveyResult.Scope1FabResult + productLca.SnapShotSurveyResult.Scope2FabResult + productLca.SnapShotSurveyResult.Scope3FabResult + productLca.SnapShotSurveyResult.SecondaryWasteResult + productLca.SnapShotSurveyResult.SecondaryWasteTransportResult; } private static decimal CalculateDistributeWeight(ProductLCA productLca) { if (productLca.SnapShotSurveyResult == null || productLca.SnapShotSurveyResult.constantFactorInWeight == null || productLca.SnapShotSurveyResult.constantFactorInWeight.Value == 0m) return 0; return (1m / productLca.SnapShotSurveyResult.constantFactorInWeight.Value); } private static decimal CalculateDistributeArea(ProductLCA productLca) { if (productLca.SnapShotSurveyResult == null || productLca.SnapShotSurveyResult.constantFactorInArea == null || productLca.SnapShotSurveyResult.constantFactorInArea.Value == 0m) return 0; return (1m / productLca.SnapShotSurveyResult.constantFactorInArea.Value); } private static decimal CalculateDistributeHour(ProductLCA productLca) { if (productLca.SnapShotSurveyResult == null || productLca.SnapShotSurveyResult.constantFactorInWorkHour == null || productLca.SnapShotSurveyResult.constantFactorInWorkHour.Value == 0m) return 0; return (1m / productLca.SnapShotSurveyResult.constantFactorInWorkHour.Value); } } }