/* ** Views/Partial/LCA/DirectMaterial.cshtml ** Views/Partial/LCA/InDirectMaterial.cshtml ** Views/Partial/LCA/WrapMaterial.cshtml are using this controller ** this controller is responsible to provide data , function , in the view */ angular.module('CarbonFootprint') .controller('LCAMaterialController', ['$q', '$scope', '$routeParams', '$filter', '$http', 'LCADetailCacheService', 'MaterialFactory', 'MultiLanguageService', function ($q, $scope, $routeParams, $filter, $http, LCADetailCacheService, MaterialFactory, MultiLanguageService) { var resource; // set $scope.baseUrl var baseUrl = $scope.baseUrl; if (typeof (baseUrl) === 'undefined' || baseUrl == null) { var arr = window.location.href.split("/"); if (arr[3].indexOf('app') == 0) baseUrl = ''; else baseUrl = '/' + arr[3]; $scope.baseUrl = baseUrl; } MultiLanguageService.getResourceAsync() .then(function (response) { resource = response; }, function (error) { console.log(error); }); $scope.model = {}; $scope.modalFormOption = {}; $scope.fileImportOption = {}; $scope.quoteOption = {}; $q.all([LCADetailCacheService.getAllMaterialAsync($routeParams.LCAID), $http.get($scope.baseUrl+'/api/Parameter/GetSimaproCategories'), $http.get($scope.baseUrl+'/api/' + $routeParams.DetailType + '/GetSheetHeader/' + $routeParams.LCAID)]) .then(function (result) { // Fetch data var cached = result[0]; var directMaterials = $scope.model.directMaterials = $filter('filter')(cached, { MaterialType: 0, IncludedInInterrogation: true }); var indirectMaterials = $scope.model.indirectMaterials = $filter('filter')(cached, { MaterialType: 1 }); var wrapMaterials = $scope.model.wrapMaterials = $filter('filter')(cached, { MaterialType: 2 }); $scope.calcTotalKgCO2e(); var materialTypeOptions = $scope.model.materialTypeOptions = result[1].data; var sheetHeader = result[2].data.SheetHeader ? result[2].data.SheetHeader : {}; // $scope.sheetHeader is parent's object $scope.sheetHeader.SheetFillerName = sheetHeader.SheetFillerName; $scope.sheetHeader.Phone = sheetHeader.Phone; $scope.sheetHeader.Department = sheetHeader.Department; // Provide function $scope.displayDetail = function (selected) { var local = $scope.toBeEdit = angular.copy(selected); $scope.modalFormOption.show = true $scope.dataQualityOption = {}; $scope.dataQualityOption.data = {}; $scope.isEdit = true; }; $scope.createChildProcess = function (selected) { var toBeCreated = {}; if (selected.isChild) return // do nothing, if the selected is child toBeCreated.ID = 0; toBeCreated.ParentMaterialID = selected.ID; toBeCreated.LCAID = selected.LCAID toBeCreated.parentName = selected.Name; toBeCreated.MaterialType = selected.MaterialType; toBeCreated.isChild = true; $scope.toBeEdit = toBeCreated; $scope.modalFormOption.show = true; $scope.modalFormOption.onOkFn = function () { LCADetailCacheService.updateMaterialsAsync([toBeCreated]).then(function (result) { selected.ChildMaterials.unshift(result[0]); $scope.modalFormOption.show = false; $scope.calcTotalKgCO2e(); }); }; }; $scope.createProcess = function (materialType) { // New an object & select it var toBeCreated = {}; if (materialType !== 1 && materialType !== 2) { throw 'exception'; } toBeCreated.ID = 0; toBeCreated.MaterialType = materialType; toBeCreated.LCAID = $routeParams.LCAID; toBeCreated.MaterialComposites = []; toBeCreated.WeightUnit = 'kg'; toBeCreated.VolumeUnit = 'm3'; $scope.toBeEdit = toBeCreated; $scope.modalFormOption.show = true; $scope.modalFormOption.onOkFn = function () { LCADetailCacheService.updateMaterialsAsync([toBeCreated]).then(function (result) { var updateArray = materialType == 1 ? indirectMaterials : wrapMaterials; updateArray.unshift(result[0]); cached.unshift(result[0]); $scope.modalFormOption.show = false; $scope.calcTotalKgCO2e(); }); }; $scope.dataQualityOption = {}; $scope.dataQualityOption.data = {}; $scope.isEdit = false; }; $scope.export = MaterialFactory.export; $scope.importChild = function (selectedParent) { if (selectedParent.isChild) throw "exception"; $scope.fileImportOption.show = true; $scope.fileImportOption.modelBuilder = MaterialFactory, $scope.fileImportOption.saveAsync = function (parsedList) { var deferred = $q.defer(); if (parsedList && parsedList.length > 0) { angular.forEach(parsedList, function (entry) { entry.ID = 0; entry.ParentMaterialID = selectedParent.ID; entry.MaterialType = selectedParent.MaterialType; }); LCADetailCacheService.updateMaterialsAsync(parsedList).then(function (result) { angular.forEach(result, function (entry) { selectedParent.ChildMaterials.push(entry) }); deferred.resolve(null); $scope.calcTotalKgCO2e(); }); } return deferred.promise; }; }; $scope.importProcess = function (materialType) { if (materialType !== 1 && materialType !== 2) { throw 'exception' } $scope.fileImportOption.show = true; $scope.fileImportOption.modelBuilder = MaterialFactory; $scope.fileImportOption.saveAsync = function (parsedList) { var deferred = $q.defer(); if (parsedList && parsedList.length > 0) { angular.forEach(parsedList, function (entry) { entry.ID = 0; entry.MaterialType = materialType; }); LCADetailCacheService.updateMaterialsAsync(parsedList).then(function (result) { var updateArray = materialType == 1 ? indirectMaterials : wrapMaterials; angular.forEach(result, function (entry) { updateArray.push(entry); cached.push(entry); }); deferred.resolve(null); $scope.calcTotalKgCO2e(); }); } return deferred.promise; }; }; $scope.quoteProcess = function (materialType) { if (materialType !== 1 && materialType !== 2) { throw 'exception' } $scope.quoteOption.show = true; $scope.quoteOption.queryDataAsyncFn = function (LCAID) { var deferred = $q.defer(); LCADetailCacheService.getAllMaterialAsync(LCAID).then(function (result) { var filtered = $filter('filter')(result, { MaterialType: materialType }) deferred.resolve(filtered); $scope.calcTotalKgCO2e(); }); return deferred.promise; } $scope.quoteOption.saveAsyncFn = function (parsedList) { var deferred = $q.defer(); if (parsedList && parsedList.length > 0) { LCADetailCacheService.updateMaterialsAsync(parsedList).then(function (result) { var updateArray = materialType == 1 ? indirectMaterials : wrapMaterials; angular.forEach(result, function (entry) { updateArray.push(entry); cached.push(entry); }); deferred.resolve(null); $scope.calcTotalKgCO2e(); }); } $scope.calcTotalKgCO2e(); return deferred.promise; }; } $scope.editChildProcess = function (selected, parent) { var local = $scope.toBeEdit = angular.copy(selected); var localParent = angular.copy(parent); local.parentName = localParent.Name; $scope.modalFormOption.show = true; $scope.modalFormOption.onOkFn = function () { if (selected.localDisplayParameterValue && local.Scalar && local.Quantity) { local.KgCO2e = selected.localDisplayParameterValue * local.Scalar * local.Quantity; } /** * Landmine here! * Use updateMaterialsAsync to update materials will lead all child materials become null in the parent material * So we copy into cloneChildMaterials */ var cloneChildMaterials = parent.ChildMaterials; // Update cloneChildMaterials with local material angular.forEach(cloneChildMaterials, function (childMaterial, key) { if (childMaterial.ID == local.ID) { cloneChildMaterials[key] = local; } }); // Assign updated child material that calculate parent total KgCO2 with child materials localParent.ChildMaterials = cloneChildMaterials; localParent.KgCO2e = calculateParentKgCO2e(localParent); // Post data to api LCADetailCacheService.updateMaterialsAsync([local, localParent]) .then(function (result) { angular.copy(local, selected); angular.copy(localParent, parent); // child materials is null after post data, re-assign cloneChildMaterials in to parent material parent.ChildMaterials = cloneChildMaterials; $scope.modalFormOption.show = false; $scope.calcTotalKgCO2e(); }); }; }; $scope.editProcess = function (selected) { var local = $scope.toBeEdit = angular.copy(selected); if ($scope.toBeEdit.WeightUnit == undefined || $scope.toBeEdit.WeightUnit == '') $scope.toBeEdit.WeightUnit = 'kg'; if ($scope.toBeEdit.VolumeUnit == undefined || $scope.toBeEdit.VolumeUnit == '') $scope.toBeEdit.VolumeUnit = 'm3'; $scope.modalFormOption.show = true; $scope.modalFormOption.onOkFn = function () { if (selected.localDisplayParameterValue && local.Scalar && local.Quantity) { local.KgCO2e = selected.localDisplayParameterValue * local.Scalar * local.Quantity; } LCADetailCacheService.updateMaterialsAsync([local]).then(function (result) { angular.copy(local, selected); $scope.modalFormOption.show = false; $scope.calcTotalKgCO2e(); }); }; $scope.dataQualityOption = {}; $scope.dataQualityOption.data = {}; $scope.isEdit = true; }; $scope.dataQualityShow = function (selected) { $http.get($scope.baseUrl+'/api/DataQualityLevel/GetByTableId/ProductLCAProductSurveyForm_Materials/' + selected.ID ).success(function (data) { angular.copy(data, $scope.dataQualityOption.data); $scope.dataQualityOption.data.Name = selected.Name; $scope.dataQualityOption.data.LCAID = selected.LCAID; //todo !!... load pre saved data //$scope.dataQualityOption.Fi = 0.0123;//test only; //todo !!... 還需要總碳排量才能算出 碳排量佔比 $scope.dataQualityOption.showSaveBtn = $scope.lcaDetail.Status == 1; $scope.dataQualityOption.show = true; $scope.calcTotalKgCO2e(); }).error(function (data, status) { alert(data.ExceptionMessage); }); }; $scope.deleteProcess = function (selected) { var isConfirm = confirm(resource.DeleteItemMsg); if (isConfirm) { $http.delete($scope.baseUrl+'/api/Material/DeleteMaterial/' + selected.LCAID + '/' + selected.ID) .success(function () { var index; if (selected.MaterialType === 0) { index = $scope.model.directMaterials.indexOf(selected); $scope.model.directMaterials.splice(index, 1); } else if (selected.MaterialType === 1) { index = $scope.model.indirectMaterials.indexOf(selected); $scope.model.indirectMaterials.splice(index, 1); } else if (selected.MaterialType === 2) { index = $scope.model.wrapMaterials.indexOf(selected); $scope.model.wrapMaterials.splice(index, 1); } index = cached.indexOf(selected); cached.splice(index, 1); // This operate is base on selectRow directive in TableEdit.js file $scope.selectRow.unSelect(); $scope.calcTotalKgCO2e(); }); } }; // Refactor this function if possible , 選擇simapro係數包含了1.直接材料子項 or 2.選擇間接/包材(無子項) $scope.selectSimaproProcess = function (selectedMaterial, parent, isOutside = true) { $scope.simaproOption = {}; $scope.simaproOption.show = true; $scope.simaproOption.filter = 37; // SimaproOption.Material 原料 $scope.simaproOption.onOk = function (selectedParameter, selectedCategory) { selectedMaterial.ParameterValue = selectedParameter.Value; selectedMaterial.ParameterID = selectedParameter.ID; selectedMaterial.ParameterTypeID = selectedCategory.ID; selectedMaterial.ParameterValue = selectedParameter.Value; selectedMaterial.ParameterDescription = selectedParameter.DisplayNameTW + ': ' + selectedParameter.Remark; selectedMaterial.KgCO2e = selectedParameter.Value * selectedMaterial.Scalar * selectedMaterial.Quantity; selectedMaterial.Unit = selectedParameter.Unit; selectedMaterial.localDisplayParameterValue = selectedParameter.Value; selectedMaterial.ParaSourceDesc = selectedParameter.Description; selectedMaterial.MaterialComposites = []; $scope.updateKgCO2e(selectedMaterial); if (isOutside) { if (parent) { parent.KgCO2e = calculateParentKgCO2e(parent); LCADetailCacheService.updateMaterialsAsync([selectedMaterial, parent]) } else { LCADetailCacheService.updateMaterialsAsync([selectedMaterial]) } } }; }; $scope.selectSimaproProcess_Composition = function (selectedComposition) { $scope.simaproOption = {}; $scope.simaproOption.show = true; $scope.simaproOption.filter = 37; // SimaproOption.Material 原料 $scope.simaproOption.onOk = function (selectedParameter, selectedCategory) { selectedComposition.parameterValue = selectedParameter.Value; selectedComposition.parameterDescription = selectedParameter.DisplayNameTW + ': ' + selectedParameter.Remark; selectedComposition.parameterUnit = selectedParameter.Unit; $scope.updateKgCO2e($scope.toBeEdit); //LCADetailCacheService.updateMaterialsAsync([selectedMaterial]); } }; $scope.reNumber = function (materialType) { $http.post(baseUrl + '/api/Material/ReNumber/' + $routeParams.LCAID + '/' + materialType).success(function (data) { console.log('reNumber', data); location.reload(true); }).error(function (data) { console.log('error', data); }) }; }); // 新增材質組成項目 $scope.addComposite = function () { if ($scope.toBeEdit.MaterialComposites.length == 0) { $scope.toBeEdit.ParameterDescription = ''; $scope.toBeEdit.Unit = ''; } $scope.toBeEdit.MaterialComposites.push({ materialComposite: '', CASNo: '', compositePercentage: '', parameterValue: '', parameterUnit: '', parameterDescription: '' }) $scope.updateParameter(); } $scope.deleteComposite = function (index) { $scope.toBeEdit.MaterialComposites.splice(index, 1) $scope.updateParameter(); } $scope.updateScalar = function (num, mul) { $scope.updateDensity() $scope.updateActivityIntensity(); } $scope.updateActivityIntensity = function () { var weiMul = 1; if ($scope.toBeEdit.WeightUnit == 'mg') weiMul = 0.000001; else if ($scope.toBeEdit.WeightUnit == 'g') weiMul = 0.001; else if ($scope.toBeEdit.WeightUnit == 't') weiMul = 1000; $scope.toBeEdit.ActivityIntensity_BOM = $scope.toBeEdit.Scalar * weiMul * $scope.toBeEdit.Quantity_BOM; $scope.toBeEdit.ActivityIntensity = $scope.toBeEdit.Scalar * weiMul * $scope.toBeEdit.Quantity; //$scope.toBeEdit.oriKgCO2e = $scope.toBeEdit.KgCO2e; $scope.updateKgCO2e($scope.toBeEdit); } $scope.updateKgCO2e = function (selectedMaterial) { selectedMaterial.KgCO2e = selectedMaterial.ActivityIntensity * selectedMaterial.ParameterValue; selectedMaterial.KgCO2e_BOM = selectedMaterial.KgCO2e; } $scope.updateParameter = function () { var total = 0; $scope.toBeEdit.MaterialComposites.forEach( m => total += m.parameterValue * m.compositePercentage / 100 ); $scope.toBeEdit.ParameterValue = total; $scope.updateKgCO2e($scope.toBeEdit); } $scope.updateDensity = function () { var volMul = 1; if ($scope.toBeEdit.VolumeUnit == 'ml') volMul = 0.000001; else if ($scope.toBeEdit.VolumeUnit == 'L') volMul = 0.001; var weiMul = 1; if ($scope.toBeEdit.WeightUnit == 'mg') weiMul = 0.000001; else if ($scope.toBeEdit.WeightUnit == 'g') weiMul = 0.001; else if ($scope.toBeEdit.WeightUnit == 't') weiMul = 1000; $scope.toBeEdit.Density = $scope.toBeEdit.Scalar * weiMul / ($scope.toBeEdit.Volume * volMul); } var calculateParentKgCO2e = function (material) { var parentKgCO2e = 0; if (material.isChild) return material.KgCO2e; angular.forEach(material.ChildMaterials, function (childMaterial) { parentKgCO2e += childMaterial.KgCO2e; }); return parentKgCO2e; }; $scope.calcTotalKgCO2e = function () { $scope.wrapMaterialsSumKgCO2e = 0; $scope.indirectMaterialsSumKgCO2e = 0; $scope.directMaterialsSumKgCO2e = 0; angular.forEach($scope.model.wrapMaterials, function (model) { $scope.wrapMaterialsSumKgCO2e += model.KgCO2e }); angular.forEach($scope.model.indirectMaterials, function (model) { $scope.indirectMaterialsSumKgCO2e += model.KgCO2e }); angular.forEach($scope.model.directMaterials, function (model) { $scope.directMaterialsSumKgCO2e += model.KgCO2e }); } } ]);