/* ** Views/Partial/LCA/WasteTransport.cshtml is using this controller */ var arr = window.location.href.split("/"); if (arr[3].indexOf('app') == 0) baseUrl = ''; else baseUrl = '/' + arr[3]; angular.module('CarbonFootprint') .controller('LCAWasteTransportCtrl', ['$scope', '$http', '$routeParams', 'JoinSurveyItemAndParameter', '$q', 'MultiLanguageService', 'ExportCsvService', function ($scope, $http, $routeParams, JoinService, $q, MultiLanguageService, ExportCsvService) { // Multi-language resource object var resource; var options; // This property controlls modal form, will be passed to table-edit-modal directive $scope.modalFormOption = {}; $scope.model = []; $scope.summary = []; $scope.sumKgCO2e = 0; $scope.createProcess = function () { var toBeCreated = {}; toBeCreated.ID = 0; toBeCreated.LCAID = $routeParams.LCAID; // Reset transport type dropdown list options $scope.transportTypes = []; // For modal form $scope.selectRow.toBeEdit = toBeCreated; $scope.modalFormOption.show = true; $scope.dataQualityOption = {}; $scope.dataQualityOption.data = {}; $scope.isEdit = false; // 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; } $scope.save = function () { JoinService.joinAsync([toBeCreated]).then(function () { //console.log(toBeCreated); // Update Ton*Km & KgCO2e properties setTonKm([toBeCreated]); setKgCO2e([toBeCreated]); $http.post($scope.baseUrl+'/api/WasteTransport/Save/' + toBeCreated.LCAID + '/' + toBeCreated.ID , toBeCreated).success(function (data) { // Join transport data into model data.ModeOfTransport = getModeOfTransport(options[data.ParameterID]); data.TransportType = getTransportType(options[data.ParameterID]); $scope.model.unshift(data); $scope.modalFormOption.show = false; calcTotalKgCO2e(); }) .error(function (error) { console.log(error); }); }); }; }; $scope.editProcess = function (selected) { var toBeEdit = $scope.selectRow.toBeEdit = angular.copy(selected); // Reset transport type dropdown list options $scope.transportTypes = []; angular.forEach(options, function (value) { if (value.search(toBeEdit.ModeOfTransport) !== -1 && toBeEdit.ModeOfTransport) { var transportType = getTransportType(value); $scope.transportTypes.push(transportType); } }); $scope.transportTypes = filterDuplicatedData($scope.transportTypes); $scope.modalFormOption.show = true; $scope.dataQualityOption = {}; $scope.dataQualityOption.data = {}; $scope.isEdit = true; $scope.save = function () { JoinService.joinAsync([toBeEdit]).then(function () { //console.log(toBeEdit); // Update Ton*Km & KgCO2e properties setTonKm([toBeEdit]); setKgCO2e([toBeEdit]); //console.log(toBeEdit); $http.post($scope.baseUrl+'/api/WasteTransport/Save/' + toBeEdit.LCAID + '/' + toBeEdit.ID, toBeEdit) .success(function () { // Update waste transport data toBeEdit.ModeOfTransport = getModeOfTransport(options[toBeEdit.ParameterID]); toBeEdit.TransportType = getTransportType(options[toBeEdit.ParameterID]); angular.copy(toBeEdit, selected); $scope.modalFormOption.show = false; calcTotalKgCO2e(); }) .error(function (error) { console.log(error); }); }); }; }; $scope.dataQualityShow = function (selected) { $http.get($scope.baseUrl+'/api/DataQualityLevel/GetByTableId/ProductLCAFabSurveyForm_WasteTransports/' + 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; }).error(function (data, status) { alert(data.ExceptionMessage); }); }; $scope.selectSimaproProcess = function (selected, isOutside = true) { $scope.simaproOption = {}; $scope.simaproOption.show = true; $scope.simaproOption.filter = 13; // SimaproOption.GoodsTransportation 運輸 $scope.simaproOption.onOk = function (selectedParameter, selectedCategory) { //console.log(selectedParameter); selected.ParameterID = selectedParameter.ID; selected.ParameterTypeID = selectedCategory.ID; selected.ParameterValue = selectedParameter.Value; selected.ParameterDescription = selectedParameter.DisplayNameTW + ': ' + selectedParameter.Remark; selected.ParameterUnit = selectedParameter.Unit; selected.localDisplayParameterValue = selectedParameter.Value; selected.ParameterSource = 2; if (isOutside) { LCADetailCacheService.updateMaterialsAsync([selected]); } //$scope.updateKgCO2e(selected); //console.log(selected); //LCADetailCacheService.updateMaterialsAsync([selected]); } }; $scope.updateKgCO2e = function (selected) { selected.KgCO2e = selected.Scalar * selected.ParameterValue; } $scope.deleteProcess = function (selected) { var isConfirm = confirm(resource.DeleteItemMsg); if (isConfirm) { $http.delete($scope.baseUrl+'/api/WasteTransport/Delete/' + selected.ID) .success(function () { var index = $scope.model.indexOf(selected); $scope.model.splice(index, 1); // This operate is base on selectRow directive in TableEdit.js file $scope.selectRow.unSelect(); calcTotalKgCO2e(); }) .error(function (error) { console.log(error); }); } }; $scope.quoteCurrentTableData = function () { }; /* modelBuilder for create & export */ /** Caution!: The 'ParameterID' property depends on 'options'. This modelBuilder is binded with this controller. Refactoring modelBuilder.create() with more arugments will be better **/ $scope.modelBuilder = { create: function (data, LCAID) { try { // get DQIID by DQIName var DQIID; var DQIName = data[9]; if (DQIName == resource['MetaDataDQI1']) { DQIID = 0; } else if (DQIName == resource['MetaDataDQI2']) { DQIID = 1; } else if (DQIName == resource['MetaDataDQI3']) { DQIID = 2; } var model = { JourneyNO: data[0], StartLocation: data[1], EndLocation: data[2], TransportDistance: parseFloat(data[3]) ? data[3] : 0, WasteName: data[4], TransportWeight: parseFloat(data[5]) ? data[5] : 0, ParameterValue: parseFloat(data[6]) ? data[6] : 0, ParameterUnit: data[7], ParameterDescription: data[8], DQI: DQIID, LCAID: LCAID }; // check imported data length and model length (-1 for LCAID) if (data.length !== getObjectSize(model) - 1) { throw resource['EXCELFileFormatWrong']; } // if find incorrect DQI if (model.DQI === undefined) { throw resource['MataDataDQI'] + resource['ErrorText'] + '\'' + resource['MetaDataDQI1'] + '\',\'' + resource['MetaDataDQI2'] + '\',\'' + resource['MetaDataDQI3'] + '\''; } // if find incorrect ParameterID //if (model.ParameterID === undefined) { // throw resource['ModeOfTransport'] + '/' + resource['TransportVanType'] + ' Error'; //} return model; } catch (err) { return { error: err }; } }, export: function (list, exportType = 'txt') { if (exportType == 'csv') { var data = []; // header data.push([ resource['JourneyNO'], resource['StartLocation'], resource['EndLocation'], resource['TransportDistance'] + ' (km)', resource['WasteName'], resource['WasteOtherScalar'], resource['Parameter'], resource['ParameterUnit'], resource['ParaDesc'], resource['MataDataDQI'] ]); // body angular.forEach(list, function (entry) { var csv = []; //column 1 csv.push(entry.JourneyNO); //column 2 csv.push(entry.StartLocation); //column 3 csv.push(entry.EndLocation); //column 4 csv.push(entry.TransportDistance); //column 5 csv.push(entry.WasteName); //column 6 csv.push(entry.TransportWeight); //column 7 csv.push(entry.ParameterValue); //column 8 csv.push(entry.ParameterUnit); //column 9 csv.push(entry.ParameterDescription); //column 10 if (entry.DQI == 0) { csv.push(resource['MetaDataDQI1']); } else if (entry.DQI == 1) { csv.push(resource['MetaDataDQI2']); } else if (entry.DQI == 2) { csv.push(resource['MetaDataDQI3']); } data.push(csv); }); ExportCsvService.startExport(data, "Export_WasteTransport.csv"); } else { var csv = '\uFEFF'; var link; var delimeter = '\t'; // header csv += resource['JourneyNO'] + delimeter + resource['ModeOfTransport'] + delimeter + resource['StartLocation'] + delimeter + resource['EndLocation'] + delimeter + resource['TransportDistance'] + delimeter + resource['TransportVanType'] + delimeter + resource['WasteName'] + delimeter + resource['WasteOtherScalar'] + delimeter + resource['MataDataDQI']; // body angular.forEach(list, function (entry) { csv += '\r\n'; //column 1 csv += entry.JourneyNO + delimeter; //column 2 csv += entry.ModeOfTransport + delimeter; //column 3 csv += entry.StartLocation + delimeter; //column 4 csv += entry.EndLocation + delimeter; //column 5 csv += entry.TransportDistance + delimeter; //column 6 csv += entry.TransportType + delimeter; //column 7 csv += entry.WasteName + delimeter; //column 8 csv += entry.TransportWeight + delimeter; //column 9 if (entry.DQI == 0) { csv += resource['MetaDataDQI1']; } else if (entry.DQI == 1) { csv += resource['MetaDataDQI2']; } else if (entry.DQI == 2) { csv += resource['MetaDataDQI3']; } }); var filename = "Export_WasteTransport.txt"; require([baseUrl+'/Scripts/FileSaver.js'], function requrieSuccess(SaveAs) { var textFileAsBlob = new Blob([csv], { type: 'text;charset=utf-8,' }); saveAs(textFileAsBlob, filename) }, function requireError(error) { } ); } } }; /* file import options & modal control */ $scope.fileImportOptions = { modelBuilder: $scope.modelBuilder, saveAsync: batchCreateAndUpdateCache }; $scope.fileImportModal = { show: false }; /* quote options & modal control */ $scope.quoteOptions = { queryDataAsyncFn: function (LCAID) { var deferred = $q.defer(); getAllDataAsync(LCAID).then(function (data) { deferred.resolve(data.WasteTransports); }); return deferred.promise; }, saveAsyncFn: batchCreateAndUpdateCache }; $scope.quoteModal = { show: false }; // Get data and prepare $scope.model getAllDataAsync($routeParams.LCAID) .then(function (response) { options = response.Options; var sheetHeader = response.SheetHeader ? response.SheetHeader : {}; if (response.WasteTransports) { $scope.model = response.WasteTransports; } // Get each model's ModeOfTransport and TransportType by "ParameterID" angular.forEach($scope.model, function (model) { model.ModeOfTransport = getModeOfTransport(options[model.ParameterID]); model.TransportType = getTransportType(options[model.ParameterID]); }); calcTotalKgCO2e(); // Sources of dropdown lists $scope.modeOfTransports = []; // Extract modeOfTransports angular.forEach(options, function (value) { var modeOfTransport = getModeOfTransport(value); $scope.modeOfTransports.push(modeOfTransport); }); // Duplicated modeOfTransports $scope.modeOfTransports = filterDuplicatedData($scope.modeOfTransports); // $scope.sheetHeader is parent's object $scope.sheetHeader.SheetFillerName = sheetHeader.SheetFillerName; $scope.sheetHeader.Phone = sheetHeader.Phone; $scope.sheetHeader.Department = sheetHeader.Department; }, function (error) { console.log(error); }); // Get multilanguage resource MultiLanguageService.getResourceAsync() .then(function (response) { resource = response; }, function (error) { console.log(error); }); /** * Private function: save all async * @param {[Array]} : array of parsed objects * @return {[promise]} */ function batchCreateAndUpdateCache(parsedList) { var deferred = $q.defer(); // Calculate KgCO2e and sava all JoinService.joinAsync(parsedList) .then(function () { // update KgCO2e properties setTonKm(parsedList); setKgCO2e(parsedList); $http.post($scope.baseUrl+'/api/WasteTransport/SaveAll/', parsedList) .success(function (data) { // Close modals $scope.fileImportModal.show = false; $scope.quoteModal.show = false; // Update waste transport data angular.forEach(data.result, function (model) { model.ModeOfTransport = getModeOfTransport(options[model.ParameterID]); model.TransportType = getTransportType(options[model.ParameterID]); }); // concat created data and $scope.model $scope.model = data.result.concat($scope.model); calcTotalKgCO2e(); deferred.resolve(data); }) .error(function (e) { console.log(e.Message); }); }); return deferred.promise; } /** * Update the KgCO2e property of the model objects * @param {[Array]} : array of model objects */ function setKgCO2e(models) { angular.forEach(models, function (entry) { if (entry.ParameterValue && entry.Scalar) { entry.KgCO2e = entry.ParameterValue * entry.Scalar; } }); } /** * Update the Ton * Km property of the model objects * @param {[Array]} : array of model objects */ function setTonKm(models) { angular.forEach(models, function (entry) { if (entry.TransportWeight && entry.TransportDistance) { entry.Scalar = entry.TransportWeight * entry.TransportDistance / 1000; } }); } /* Private function: get all list data from server */ function getAllDataAsync(LCAID) { var deferred = $q.defer(); $http.get($scope.baseUrl+'/api/WasteTransport/GetByLcaId/' + LCAID) .success(function (data) { deferred.resolve(data); }) .error(function () { deferred.resolve(null); }); return deferred.promise; } $scope.$watch('selectRow.toBeEdit.ModeOfTransport', function (modeOfTransport) { // If modeOfTransport is changed then reset transportTypes $scope.transportTypes = []; angular.forEach(options, function (value, key) { if (value.search(modeOfTransport) !== -1 && modeOfTransport) { var transportType = getTransportType(value); $scope.transportTypes[key] = transportType; } }); }); // Update model parameter id $scope.$watch('selectRow.toBeEdit.TransportType', function () { var toBeEdit = $scope.selectRow.toBeEdit; angular.forEach(options, function (value, key) { if (value.search(toBeEdit.ModeOfTransport) !== -1 && value.search(toBeEdit.TransportType) !== -1 && toBeEdit.ModeOfTransport && toBeEdit.TransportType) { toBeEdit.ParameterID = key; } }); }); /** * Get substring "modeOfTransport" from a string * @param String * @returns String */ function getModeOfTransport(value) { return angular.isString(value) ? value.slice(0, value.indexOf(',')) : null; } /** * Get substring "transportType" from a string * @param String * @returns String */ function getTransportType(value) { return angular.isString(value) ? value.slice(value.indexOf(',') + 1, value.length) : null; } /** * Remove identical element from the array * @parem Array * @returns Array */ function filterDuplicatedData(array) { var filteredArray = []; angular.forEach(array, function (value) { if ($.inArray(value, filteredArray) === -1) { filteredArray.push(value); } }); return filteredArray; } function calcTotalKgCO2e() { $scope.summary = Enumerable.From($scope.model).GroupBy("$.WasteName", "$.KgCO2e", function (key, group) { return { WasteName: key, totalKgCO2e: Enumerable.From(group).Sum(), AllocationKgCO2e: Enumerable.From(group).Sum() * $scope.Ratio }; }).ToArray(); var sumKgCO2e = 0; angular.forEach($scope.summary, function (item) { sumKgCO2e += item.totalKgCO2e; }); $scope.sumKgCO2e = sumKgCO2e; } $scope.onAllocationChange = function (Allocation) { $scope.Allocation = Allocation if ($scope.Allocation == 0) //重量分配 //$scope.Ratio = $scope.calculate($scope.lcaDetail.ProductProductionPcs, $scope.product.Weight, $scope.lcaDetail.FabProductionWeight); $scope.Ratio = $scope.calculate($scope.lcaDetail.ProductProductionPcs * $scope.product.Weight / $scope.lcaDetail.FabProductionWeight, 1, $scope.lcaDetail.ProductProductionPcs); else if ($scope.Allocation == 1) //面積分配 //$scope.Ratio = $scope.calculate($scope.lcaDetail.ProductProductionPcs, $scope.product.AreaSize, $scope.lcaDetail.FabProductionArea); $scope.Ratio = $scope.calculate($scope.lcaDetail.ProductProductionPcs * $scope.product.AreaSize / $scope.lcaDetail.FabProductionArea, 1, $scope.lcaDetail.ProductProductionPcs); else if ($scope.Allocation == 2) //產量分配 //$scope.Ratio = $scope.calculate($scope.lcaDetail.ProductProductionPcs, 1, $scope.lcaDetail.FabProductionPcs); $scope.Ratio = $scope.calculate($scope.lcaDetail.ProductProductionPcs, 1, $scope.lcaDetail.FabProductionPcs); else if ($scope.Allocation == 3) //經濟分配 //$scope.Ratio = $scope.calculate($scope.lcaDetail.ProductProductionPcs, $scope.lcaDetail.ProductProductionEconomic, $scope.lcaDetail.FabProductionEconomic); $scope.Ratio = $scope.calculate($scope.lcaDetail.ProductProductionPcs * $scope.lcaDetail.ProductProductionEconomic / $scope.lcaDetail.FabProductionEconomic, 1, $scope.lcaDetail.ProductProductionPcs); else if ($scope.Allocation == 4) //工時分配 //$scope.Ratio = $scope.calculate($scope.lcaDetail.ProductProductionPcs, $scope.lcaDetail.ProductProductionHour, $scope.lcaDetail.FabProductionHour); $scope.Ratio = $scope.calculate($scope.lcaDetail.ProductProductionPcs * $scope.lcaDetail.ProductProductionHour / $scope.lcaDetail.FabProductionHour, 1, $scope.lcaDetail.ProductProductionPcs); else if ($scope.Allocation == 99) $scope.Ratio = 1; $http.post($scope.baseUrl+'/api/LCA/SaveAllocation/' + $routeParams.LCAID + '/' + $routeParams.DetailType + '/' + $scope.Allocation) .success(function (data) { calcTotalKgCO2e(); $scope.modifyCacheAllocation(); }) } }]);