———————————————— angular.module('shiftworx'). directive('reportingSidebar', reportingSidebar); function reportingSidebar() { // Runs during compile return { //name: '', // priority: 1, // terminal: true, scope: false, //{ /*user: '=', software_key: '=', machineObj: '=',*/ //}, // {} = isolate, true = child, false/undefined = no change controller: reportingSidebarCtrl, // require: 'ngModel', // Array = multiple requires, ? = optional, ^ = check parent elements restrict: 'E', // E = Element, A = Attribute, C = Class, M = Comment // template: '
hi
', templateUrl: "app/web/components/CR/reportingSidebar.html?v=0.1" // replace: true, // transclude: true, // compile: function(tElement, tAttrs, function transclude(function(scope, cloneLinkingFn){ return function linking(scope, elm, attrs){}})), //link: function($scope, iElm, iAttrs, controller) { //} }; } reportingSidebarCtrl.$inject = ['$scope', '$element', '$attrs', '$transclude', '$http', '$location', '$route', '$filter', '$q', 'cr', '_', 'GlobalService']; function reportingSidebarCtrl($scope, $element, $attrs, $transclude, $http, $location, $route, $filter, $q, cr, _, GlobalService) { $scope.disableInputs = false; $scope.cloudReportSelect = ''; $scope.applicationKey = 'custom-report'; $scope.shiftNumCounter = 1; $scope.dateDays = []; $scope.shiftAdditonCounter = 0; $scope.isThereData = false; $scope.isCountData = false; $scope.isTimerData = false; $scope.hardwareSelected = {}; $scope.hardCall = ''; $scope.showItems = true; $scope.shiftsComplete = []; $scope.downloadReport = function() { alert('Placeholder for PDF download'); }; $scope.saveCloudReport = function() { if ($scope.reporting.xaxis === 'CustomDateRange') { alert('Saving a cloud report is not available on Custom Date Range...yet!') } else { // console.log($scope.reporting); //if ($scope.reporting.reportID === undefined) { $scope.cloudSave.push({ reportID: GlobalService.makeid(), reportName: $scope.reporting.reportName, machine: $scope.reporting.machineSelect, graphType: $scope.reporting.type, xaxis: $scope.reporting.xaxis, viewDataOptions: $scope.reporting.viewDataOption, startDate: $scope.reporting.startDate, endDate: $scope.reporting.endDate, yaxismax: $scope.reporting.yaxismax, input: $scope.reporting.hardware, shiftsEnabled: $scope.reporting.shiftsEnabled, }); $scope.reporting = { reportName: '', machineSelect: '', type: 'column', xaxis: 'Day', viewDataOption: '', startDate: '', endDate: '', yaxismax: false, hardware: '', shiftsEnabled: false }; postCloudReport($scope.applicationKey, GlobalService.getFactoryKey(), GlobalService.ngObjFixHack($scope.cloudSave)); } }; $scope.deleteCloudSave = function(report) { if (report.reportID !== undefined) { angular.forEach($scope.cloudSave, function(value, key) { if (report.reportID === value.reportID) { var index = $scope.cloudSave.indexOf(value); //console.log(index); $scope.cloudSave.splice(index, 1); //console.log(index); postCloudReport($scope.applicationKey, GlobalService.getFactoryKey(), GlobalService.ngObjFixHack($scope.cloudSave)); } }); } else { alert('Load a report first!'); } }; $scope.loadCloudSave = function(cloudReport) { // console.log(cloudReport); $scope.reporting = { reportID: cloudReport.reportID, reportName: cloudReport.reportName, machineSelect: cloudReport.machine, type: cloudReport.graphType, xaxis: cloudReport.xaxis, viewDataOption: cloudReport.viewDataOptions, startDate: cloudReport.startDate, endDate: cloudReport.endDate, yaxismax: cloudReport.yaxismax, hardware: cloudReport.input, shiftsEnabled: cloudReport.shiftsEnabled, }; }; function postCloudReport(appKey, factoryKey, data) { var dataObj = { id: appKey, factory: factoryKey, data: data }; //console.log(JSON.stringify(dataObj)); $.ajax({ url: 'http://54.213.13.56/api/app', type: 'POST', data: dataObj }).done(function(data, statusText, xhr) { console.log(data.message); }).error(function(data, statusText, xhr) { console.log(statusText); }); } $scope.graphType = 'column'; var self = this; $scope.reporting = { machineSelect: '', type: 'column', xaxis: 'Day', //yaxis: 'sum', yaxismax: undefined, startDate: '', endDate: '', dateMonthYear: '', dateDay: '', viewDataOption: 'count', shiftsEnabled: false, }; $scope.$watch("reporting.dateMonthYear", function(newValue, oldValue) { //$scope.machineDates = $scope.exporter.machineSelect.Dates; //console.log(newValue.date); if (newValue !== '') { var tempDateSplit = $scope.reporting.dateMonthYear.date.split(" "); //console.log('Year: ' + tempDateSplit[1]); $scope.splitYear = tempDateSplit[1]; //console.log('Month: ' + tempDateSplit[0]); $scope.splitMonth = tempDateSplit[0]; dateCreated = new Date(tempDateSplit[0] + ' 1, ' + tempDateSplit[1] + ' 00:00:00'); //newEndDate = new Date(newEndDate.getFullYear(), newEndDate.getMonth() + 1, 0); endDaysDate = new Date(dateCreated.getFullYear(), dateCreated.getMonth() + 1, 0); //endDaysDate.setDate(endDaysDate.getDate() + 1); //console.log(endDaysDate.getDate()); for (var i = 1; i <= endDaysDate.getDate(); i++) { $scope.dateDays.push(i); } } }); $scope.options = { axes: { x: { key: 'x', type: 'date', zoomable: true }, y: { type: 'linear', max: $scope.maxyaxis }, y2: { type: 'linear', min: $scope.y2Max //max: $scope.maxyaxis } }, series: [{ y: undefined, color: 'steelblue', type: $scope.graphType, axis: 'y', striped: true, label: toTitleCase($scope.reportLabel + ' of ' + $scope.reporting.viewDataOption), id: "data" }, { y: undefined, //label: "Trendline", color: "#ff7f0e", type: "line", axis: "y", id: "trend", label: 'Average' }, { y: undefined, //label: "Trendline", color: "#006600", type: "line", axis: "y", id: "RegressionLine", label: 'Regression', visible: $scope.showItems, }], lineMode: 'linear', tension: 0.7, tooltip: { mode: 'scrubber', formatter: function(x, y, series) { //series.id['data ']= 'The Data: '; var monthNames = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" ]; if ($scope.reporting.xaxis === 'Month') { return monthNames[x.getMonth()] + ' ' + x.getFullYear() + ' - ' + series.label + ': ' + Math.round(y); } else { return x.toDateString() + ' - ' + series.label + ': ' + Math.round(y); } } }, drawLegend: $scope.showItems, drawDots: true, columnsHGap: 5 }; self.Initialise = function() { $scope.data = {}; $scope.blackout = false; $scope.cloudSave = []; $scope.machineObj = GlobalService.getMachineObj; /* Fix This below to load dates dynamically for each machine when selected */ zeroOut(); //$scope.machineList = $rootScope.machineObj; var trendType = 'trendCount'; var regressionLineType = 'countRegLine'; $scope.y2CountMax = 0; $scope.y2TimerMax = 0; $scope.y2Max = undefined; grabAppData('shift-profile', GlobalService.getFactoryKey()).then(function(data) { angular.forEach(data, function(items, key) { //console.log(items.startTime * 1000); if (isNaN(items.startTime * 1000)) { items.startTime = new Date(items.startTime); items.endTime = new Date(items.endTime); } else { items.startTime = new Date(items.startTime * 1000); items.endTime = new Date(items.endTime * 1000); } }); $scope.shiftsObj = data; //console.log(data.length); //console.trace(cr.setupShiftVars(data.length)); cr.setupShiftVars(data.length); $scope.numberOfShifts = data.length; //cr.setupShiftVars($scope.numberOfShifts); //console.log($scope.shiftsObj); }, function(error) { console.log('Failure...', error); }); grabAppData($scope.applicationKey, GlobalService.getFactoryKey()).then(function(data) { //console.log(data); if (data.id === 'error') { console.log(data); } else { $scope.cloudSave = data; } }, function(error) { console.log('Failure...', error); }); }; $scope.runReportWithSelection = function(item) { if (item !== '' || item !== undefined) { console.log(item); $scope.loadCloudSave(item); //$scope.changedVars(); } }; function getUserInfo(credentials) { var defer = $q.defer(); $http.get('http://54.213.13.56/api/user?username=' + credentials.username + '&password=' + credentials.password). success(function(data, status, headers, config) { defer.resolve(data); }). error(function(data, status, headers, config) { console.log('Error in userLogin: ' + data); }); return defer.promise; } function grabAppData(appKey, factoryKey) { var defer = $q.defer(); $http.get('http://54.213.13.56/api/app/' + appKey + '/' + factoryKey). success(function(data) { //console.log(data); if (appKey === 'shift-profile') { angular.forEach(data, function(items, key) { angular.forEach(items.days, function(daySelected, day) { items.days[day] = daySelected == "true"; }); //console.log(data); angular.forEach(items.machines, function(machineSelected, machine) { items.machines[machine] = machineSelected == "true"; }); }); } defer.resolve(data); }).error(function(data) { console.log('Error in grabAppData: ' + data); }); return defer.promise; } $scope.$watch('factoryKey', function(newValue, oldValue, scope) { $scope.machineObj = GlobalService.getMachineObj; }); $scope.$watchGroup(["reporting.type", "reporting.viewDataOption", "reporting.yaxismax", "reporting.xaxis", "hardwareSelected"], function(newValues, oldValues) { //console.log(newValues[3]); $scope.y2Max = undefined; if ($scope.reporting.viewDataOption === 'count') { //$scope.y2Max = $scope.y2CountMax; $scope.reportLabel = 'Sum'; } else { //$scope.y2Max = $scope.y2TimerMax; $scope.reportLabel = 'Percentage'; } if ($scope.reporting.xaxis === 'Month') { cr.setMonthOrDay('month'); } else { cr.setMonthOrDay('day'); } cr.setCountOrTimer($scope.reporting.viewDataOption); if ($scope.reporting.viewDataOption === 'count') { $scope.maxyaxis = undefined; trendType = 'trendCount'; regressionLineType = 'countRegLine'; } else if ($scope.reporting.viewDataOption === 'timer') { //console.log($scope.reporting.yaxismax); if ($scope.reporting.yaxismax === true) { $scope.maxyaxis = 100; } else { $scope.maxyaxis = undefined; } trendType = 'trendTimer'; regressionLineType = 'timerRegLine'; } $scope.graphType = newValues[0]; $scope.options.axes.y.max = $scope.y2Max; $scope.options.axes.y2.min = $scope.y2Max; if ($scope.hardwareSelected.length === 1 || $scope.hardwareSelected.length === 0) { $scope.options.series[0].y = $scope.reporting.viewDataOption; $scope.options.series[0].type = $scope.graphType; $scope.options.series[0].label = toTitleCase($scope.reportLabel + ' of ' + $scope.reporting.viewDataOption); $scope.options.series[1].y = trendType; $scope.options.series[2].y = regressionLineType; $scope.options.series[2].visible = false; } else { for(i = 0; i < $scope.hardwareSelected.length; i++) { $scope.options.series[i].y = $scope.reporting.viewDataOption; $scope.options.series[i].type = $scope.graphType; $scope.options.series[i].label = toTitleCase($scope.reportLabel + ' of ' + $scope.hardwareSelected[i].input); } } $scope.options.axes.y.max = $scope.maxyaxis; $scope.options.axes.y2.min = $scope.y2Max; $scope.options.tooltip = { mode: 'scrubber', formatter: function(x, y, series) { //series.id['data ']= 'The Data: '; var monthNames = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" ]; if ($scope.reporting.xaxis === 'Month') { return monthNames[x.getMonth()] + ' ' + x.getFullYear() + ' - ' + series.label + ': ' + Math.round(y); } else if ($scope.reporting.xaxis === 'Hourly') { return formatAMPM(x) + ' ' + ' - ' + series.label + ': ' + Math.round(y); } else { return x.toDateString() + ' - ' + series.label + ': ' + Math.round(y); } } }; $scope.options.drawLegend = $scope.showItems; var addItCount = 0; var shiftNumber = 3; if ($scope.reporting.shiftsEnabled === true) { angular.forEach($scope.shiftsObj, function(value, key) { // console.log($scope.options); if (value.machines[$scope.reporting.machineSelect.Address]) { $scope.options.series[shiftNumber].y = 'shift' + addItCount + $scope.reporting.viewDataOption; $scope.options.series[shiftNumber].type = $scope.graphType; $scope.options.series[shiftNumber].label = toTitleCase($scope.reportLabel + ' of ' + value.name); shiftNumber++; addItCount++; } //console.log(); // }); } }); function formatAMPM(date) { var hours = date.getHours(); var minutes = date.getMinutes(); var ampm = hours >= 12 ? 'PM' : 'AM'; hours = hours % 12; hours = hours ? hours : 12; // the hour '0' should be '12' minutes = minutes < 10 ? '0' + minutes : minutes; var strTime = hours + ':' + minutes + ' ' + ampm; return strTime; } function hexColorRandomizer() { var text = ""; var possible = "ABCDEF0123456789"; for (var i = 0; i < 6; i++) text += possible.charAt(Math.floor(Math.random() * possible.length)); return text; } function toTitleCase(str) { return str.replace(/\w\S*/g, function(txt) { return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase(); }); } $scope.$watch("reporting.machineSelect", function(newValue, oldValue) { $scope.machineDates = $scope.reporting.machineSelect.Dates; $scope.machineHardware = $scope.reporting.machineSelect.Hardware; cr.setMachineName($scope.reporting.machineSelect.Name); }); $scope.changedVars = function() { // if ($scope.options.series.length > 3) { // $scope.options.series.splice(3, $scope.options.series.length - 1); // } // $scope.shiftInfo = []; $scope.yaxe = $scope.reporting.yaxis; if ($scope.hardwareSelected.length > 0 && $scope.reporting.xaxis !== '' && $scope.reporting.machineSelect.Dates.length !== 0) { $scope.data = []; $scope.nonZeroData = []; if ($scope.hardwareSelected.length === 1) { cr.setHardware($scope.hardwareSelected[0].input); // $scope.options.series[0].y = $scope.reporting.viewDataOption; // $scope.options.series[0].type = $scope.graphType; // $scope.options.series[0].label = toTitleCase($scope.reportLabel + ' of ' + $scope.reporting.viewDataOption); // $scope.options.series[1].y = trendType; // $scope.options.series[2].y = regressionLineType; // $scope.options.series[2].visible = $scope.showItems; } if ($scope.reporting.xaxis === 'Day' || $scope.reporting.xaxis === 'Month') { startDateSplit = $scope.reporting.startDate.date.split(' '); endDateSplit = $scope.reporting.endDate.date.split(' '); newStartDate = new Date(startDateSplit[0] + ' 1, ' + startDateSplit[1] + ' 00:00:00'); newEndDate = new Date(endDateSplit[0] + ' 1, ' + endDateSplit[1] + ' 00:00:00'); if (newEndDate.getMonth() === new Date().getMonth()) { newEndDate = new Date(); } else { //console.log($scope.reporting.startDate.date); if ($scope.reporting.startDate.date === $scope.reporting.endDate.date && $scope.reporting.xaxis === 'Month') { /*alert("Sorry you can't report on just one month with Month selected for time, " + "I would suggest doing days if you want to complete this action");*/ //console.log('made it here'); newStartDate = new Date(startDateSplit[0] + ' 1, ' + startDateSplit[1] + ' 00:00:00'); newEndDate = new Date(endDateSplit[0] + ' 1, ' + endDateSplit[1] + ' 00:00:00'); //newEndDate = new Date(newEndDate.getFullYear(), newEndDate.getMonth() + 1, 0); } else { newEndDate = new Date(newEndDate.getFullYear(), newEndDate.getMonth() + 1, 0); newEndDate.setDate(newEndDate.getDate() + 1); } } } else { if ($scope.reporting.xaxis === 'LastSeven') { newEndDate = new Date(); newStartDate = new Date( /*newEndDate.getFullYear(), newEndDate.getMonth(), newEndDate.getDate(),0,0,0,0*/ ); newStartDate.setDate(newStartDate.getDate() - 7); } else if ($scope.reporting.xaxis === 'LastWeek') { newEndDate = new Date(); if (newEndDate.getDay() !== 0) { newStartDate = new Date(newEndDate.setDate(newEndDate.getDate() - 7 - newEndDate.getDay())); newEndDate.setDate(newStartDate.getDate() + 7); // console.log(newStartDate); } else { newStartDate = new Date(newEndDate.setDate(newEndDate.getDate() - 7)); newEndDate.setDate(newStartDate.getDate() + 7); } //console.log(new Date(newEndDate)); } else if ($scope.reporting.xaxis === 'LastThirty') { newEndDate = new Date(); newStartDate = new Date(); newStartDate.setDate(newStartDate.getDate() - 30); } else if ($scope.reporting.xaxis === 'LastMonth') { newStartDate = new Date(); newStartDate = new Date(newStartDate.getFullYear(), newStartDate.getMonth() - 1, 1, 0, 0, 0, 0); //console.log(newStartDate); newEndDate = new Date(newStartDate.getFullYear(), newStartDate.getMonth() + 1, 0, 0, 0, 0, 0); //console.log(newEndDate); /*newStartDate = new Date(); newStartDate.setDate(newStartDate.getMonth() - 1);*/ } else if ($scope.reporting.xaxis === 'LastNinty') { newEndDate = new Date(); newStartDate = new Date(); newStartDate.setDate(newStartDate.getDate() - 90); } else if ($scope.reporting.xaxis === 'Hourly') { var tempDateSplit = $scope.reporting.dateMonthYear.date.split(" "); //console.log('Year: ' + tempDateSplit[1]); $scope.splitYear = tempDateSplit[1]; //console.log('Month: ' + tempDateSplit[0]); $scope.splitMonth = tempDateSplit[0]; newStartDate = new Date(tempDateSplit[0] + ' ' + $scope.reporting.dateDay + ', ' + tempDateSplit[1] + ' 00:00:00'); newEndDate = new Date(tempDateSplit[0] + ' ' + $scope.reporting.dateDay + ', ' + tempDateSplit[1] + ' 23:59:59'); //console.log(newStartDate); //console.log(newEndDate); } } if ($scope.reporting.xaxis === 'CustomDateRange') { cr.setStartDate(new Date($scope.reporting.dateRange.startDate).toDateString()); cr.setEndDate(new Date($scope.reporting.dateRange.endDate).toDateString()); } else { cr.setStartDate(newStartDate.toDateString()); cr.setEndDate(newEndDate.toDateString()); } $scope.disableInputs = true; //$scope.test = newStartDate; if ($scope.hardwareSelected.length === 1) { $scope.options.series[2].visible = false; $scope.options.drawLegend = false; } switch ($scope.reporting.xaxis) { case 'Day': $scope.data = []; // $scope.options.series[2].visible = false; // $scope.options.drawLegend = false; $scope.nonZeroData = []; dailyChart(newStartDate, newEndDate); break; case 'Month': $scope.reporting.shiftsEnabled = false; $scope.data = []; // $scope.options.series[2].visible = false; // $scope.options.drawLegend = false; $scope.nonZeroData = []; monthlyChart(newStartDate, newEndDate); break; case 'LastMonth': $scope.data = []; // $scope.options.series[2].visible = false; // $scope.options.drawLegend = false; $scope.nonZeroData = []; dailyChart(newStartDate, newEndDate); break; case 'LastSeven': $scope.data = []; // $scope.options.series[2].visible = false; // $scope.options.drawLegend = false; $scope.nonZeroData = []; dailyChart(newStartDate, newEndDate); break; case 'LastWeek': $scope.data = []; // $scope.options.series[2].visible = false; // $scope.options.drawLegend = false; $scope.nonZeroData = []; dailyChart(newStartDate, newEndDate); break; case 'LastThirty': $scope.data = []; // $scope.options.series[2].visible = false; // $scope.options.drawLegend = false; $scope.nonZeroData = []; dailyChart(newStartDate, newEndDate); break; case 'LastNinty': $scope.data = []; // $scope.options.series[2].visible = false; // $scope.options.drawLegend = false; $scope.nonZeroData = []; dailyChart(newStartDate, newEndDate); break; case 'Hourly': $scope.data = []; // $scope.options.series[2].visible = false; // $scope.options.drawLegend = false; $scope.nonZeroData = []; hourlyChart(newStartDate, newEndDate); break; case 'CustomDateRange': $scope.data = []; $scope.nonZeroData = []; dailyChart(new Date($scope.reporting.dateRange.startDate), new Date($scope.reporting.dateRange.endDate)); break; default: break; } } else { alert('You need to fill in all fields first!'); } }; function hourlyChart(startDate, endDate) { zeroOut(); processObj = 'deepsum-3600'; $scope.dateCount = 0; callHours(startDate, endDate, processObj); //$scope.disableInputs = false; } function callHours(startDate, endDate, processObj) { d = startDate; da = endDate; if ($scope.hardwareSelected.length === 1) { webCall($scope.reporting.machineSelect.SoftwareKey, $scope.reporting.machineSelect.Address, processObj, Math.floor(new Date(d) / 1000), Math.floor(new Date(da) / 1000), $scope.hardwareSelected[0].input).then(function(data) { // console.log(data); dataHourlyAggregator(data, d, da); //$scope.disableInputs = false; $scope.options.series[2].visible = true; $scope.options.drawLegend = true; array_x = []; array_y = []; for (i = 0; i < $scope.data.length; ++i) { array_x.push($scope.data[i].xCountCounter); array_y.push($scope.data[i].count); if ($scope.data[i].count > $scope.y2countmax) { $scope.y2CountMax = $scope.data[i].count; } } var countRegLine = findLineByLeastSquares(array_x, array_y); //findLineByLeastSquaresLog(array_x, array_y); //findLineByLeastSquaresLog(array_x, array_y); cr.setCountSlopeKPI(Math.round($scope.tempSlope * 10) / 10) /* * 100*/ ; //console.log(countRegLine); tmpCount = 0; angular.forEach(countRegLine[1], function(value, key) { if (tmpCount !== countRegLine[1].length) { $scope.data[tmpCount].countRegLine = value; tmpCount++; } }); array_x = []; array_y = []; for (i = 0; i < $scope.data.length; ++i) { array_x.push($scope.data[i].xTimerCounter); array_y.push($scope.data[i].timer); if ($scope.data[i].timer > $scope.y2TimerMax) { $scope.y2TimerMax = $scope.data[i].timer; } } var timerRegLine = findLineByLeastSquares(array_x, array_y); //findLineByLeastSquaresLog(array_x, array_y); //findLineByLeastSquaresLog(array_x, array_y); cr.setTimeSlopeKPI(Math.round($scope.tempSlope * 10) / 10) /* * 100*/ ; //console.log(countRegLine); tmpCount = 0; angular.forEach(timerRegLine[1], function(value, key) { if (tmpCount !== countRegLine[1].length) { $scope.data[tmpCount].timerRegLine = value; tmpCount++; } }); //console.log($scope.data); $scope.disableInputs = false; }, function(error) { console.log('Failure...', error); }); } else { } } function dataHourlyAggregator(data, d, da) { //console.log(d); //console.log(da); var hourCounter = 1; angular.forEach(data.deepsum, function(value, key) { // console.log(value.count); // console.log(d); d.setHours(d.getHours() + 1); // console.log($scope.reporting.machineSelect.PartCount); if ($scope.reporting.machineSelect.PartCount !== undefined && $scope.reporting.machineSelect.PartCount !== '' && value.count !== 0) { value.count = value.count / $scope.reporting.machineSelect.PartCount; } tempTimerData = value.timer / 3600 * 100; //console.log(tempTimerData); // } //tempTimerData !== 0 && if ($scope.reporting.omitZeroes) { if (tempTimerData !== 0 && value.count !== 0) { $scope.isThereData = true; } else { $scope.isThereData = false; } } else { if (tempTimerData !== 0 && value.count !== 0) { $scope.isThereData = true; } } /* else { $scope.isThereData = false; } */ if ($scope.isThereData === true) { $scope.trendTimeData = trendLineCalculator(tempTimerData, $scope.timeCount, $scope.avgTimerData); $scope.trendCountData = trendLineCalculator(value.count, $scope.countCount, $scope.accCountData); $scope.accCountData += value.count; var tempAvgCountData = $scope.accCountData / $scope.countCount; $scope.avgTimerData += tempTimerData; var tempAvgTimeData = ($scope.avgTimerData / $scope.timeCount); cr.increaseAccCountKPI(value.count); cr.increaseAccTimeKPI(Math.round(value.timer / 60 / 60)); cr.setAvgTimeKPI(tempAvgTimeData); cr.setAvgCountKPI(tempAvgCountData); $scope.countCount++; $scope.timeCount++; } $scope.data.push({ x: new Date(d), count: Math.round(value.count * 100) / 100, timer: Math.round(tempTimerData * 100) / 100, trendTimer: Math.round($scope.trendTimeData), trendCount: Math.round($scope.trendCountData), xCountCounter: $scope.countCount - 1, xTimerCounter: $scope.timeCount - 1, shifts: [], }); }); //$scope.disableInputs = false; // console.log($scope.data); } function dailyChart(startDate, endDate) { var daysOfYear = []; zeroOut(); processObj = 'sum'; $scope.dateCount = 0; var neverChangingEnd = endDate; var neverChangingStart = startDate; callDays(startDate, endDate); } function callDays(startDate, endDate) { d = startDate; if (d < endDate) { da = new Date(d); da.setDate(da.getDate() + 1); //processObj = ''; $scope.fullDay = (((24 * 60) * 60) * 1000); $scope.WorkPeriod = ((($scope.reporting.machineSelect.WorkPeriod * 60) * 60) * 1000); if ($scope.hardwareSelected.length === 1) { webCall($scope.reporting.machineSelect.SoftwareKey, $scope.reporting.machineSelect.Address, 'sum', Math.floor(new Date(d) / 1000), Math.floor(new Date(da) / 1000), $scope.hardwareSelected[0].input).then(function(data) { dataAggregator(data, d, da); d.setDate(d.getDate() + 1); //console.log(ncStart + ' : ' + ncEnd); callDays(d, endDate); }, function(error) { console.log('Failure...', error); }); } else { for (i = 0; i < $scope.hardwareSelected.length; i++) { $scope.hardCall += '&index[]=' + $scope.hardwareSelected[i].input; } //console.log($scope.hardCall); webMultiCall($scope.reporting.machineSelect.SoftwareKey, $scope.reporting.machineSelect.Address, 'sum', Math.floor(new Date(d) / 1000), Math.floor(new Date(da) / 1000), $scope.hardCall).then(function(data) { dataAggregator(data, d, da); //console.log(data.length); d.setDate(d.getDate() + 1); $scope.hardCall = ''; //console.log(ncStart + ' : ' + ncEnd); callDays(d, endDate); }, function(error) { console.log('Failure...', error); }); } } else { //console.log($scope.data); //console.log($scope.data); //if ($scope.reporting.yaxis === 'sum') { // create array_x & array_y $scope.options.series[2].visible = false; $scope.options.drawLegend = true; array_x = []; array_y = []; for (i = 0; i < $scope.data.length; ++i) { array_x.push($scope.data[i].xCountCounter); if ($scope.data[i].count !== 0) { $scope.isCountData = true; } array_y.push($scope.data[i].count); if ($scope.data[i].count > $scope.y2countmax) { $scope.y2CountMax = $scope.data[i].count; } } if ($scope.isCountData === true) { var countRegLine = findLineByLeastSquares(array_x, array_y); //findLineByLeastSquaresLog(array_x, array_y); //findLineByLeastSquaresLog(array_x, array_y); cr.setCountSlopeKPI(Math.round($scope.tempSlope * 10) / 10) /* * 100*/ ; } else { var countRegLine = 0; cr.setCountSlopeKPI(0); } //console.log(countRegLine); tmpCount = 0; angular.forEach(countRegLine[1], function(value, key) { if (tmpCount !== countRegLine[1].length) { $scope.data[tmpCount].countRegLine = value; tmpCount++; } }); array_x = []; array_y = []; for (i = 0; i < $scope.data.length; ++i) { array_x.push($scope.data[i].xTimerCounter); // console.log($scope.data[i].timer); if ($scope.data[i].timer !== 0) { $scope.isTimerData = true; } array_y.push($scope.data[i].timer); if ($scope.data[i].timer > $scope.y2TimerMax) { $scope.y2TimerMax = $scope.data[i].timer; } } if ($scope.isTimerData === true) { var timerRegLine = findLineByLeastSquares(array_x, array_y); //findLineByLeastSquaresLog(array_x, array_y); //findLineByLeastSquaresLog(array_x, array_y); cr.setTimeSlopeKPI(Math.round($scope.tempSlope * 10) / 10) /* * 100*/ ; } else { var timerRegLine = 0; cr.setTimeSlopeKPI(0); } //console.log(countRegLine); tmpCount = 0; angular.forEach(timerRegLine[1], function(value, key) { if (tmpCount !== countRegLine[1].length) { $scope.data[tmpCount].timerRegLine = value; tmpCount++; } }); //console.log($scope.data); $scope.disableInputs = false; } } function zeroOutShifts() { $scope.shiftCounter = 1; $scope.shiftNumberCounter = 1; $scope.trendShiftTimeData = 0; $scope.trendShiftCountData = 0; $scope.accumShiftTimerData = 0; $scope.avgShiftTimerData = 0; } var within_std_of = 2; average = function(a) { var r = { mean: 0, variance: 0, deviation: 0 }, t = a.length; for (var m, s = 0, l = t; l--; s += a[l]); for (m = r.mean = s / t, l = t, s = 0; l--; s += Math.pow(a[l] - m, 2)); return r.deviation = Math.sqrt(r.variance = s / t), r; }; withinStd = function(mean, val, stdev) { var low = mean - (stdev * x.deviation); var hi = mean + (stdev * x.deviation); return (val > low) && (val < hi); }; function monthlyChart(startDate, endDate) { //console.log('Monthly was called'); var daysOfYear = []; d = startDate; zeroOut(); processObj = 'sum'; nextMonth(startDate, endDate, processObj); } function nextMonth(startDate, endDate, processObj) { if (d <= endDate) { $scope.WorkPeriod = ((($scope.reporting.machineSelect.WorkPeriod * 60) * 60) * 1000); if (d === endDate) { da = new Date(d); da = new Date(da.getFullYear(), da.getMonth() + 1, 0); //da.setMonth(da.getMonth() + 1); if ($scope.hardwareSelected.length === 1) { webCall($scope.reporting.machineSelect.SoftwareKey, $scope.reporting.machineSelect.Address, processObj, Math.floor(new Date(d) / 1000), Math.floor(new Date(da) / 1000), $scope.hardwareSelected[0].input).then(function(data) { /*console.log(Math.floor(new Date(d) / 1000)); console.log(Math.floor(new Date(da) / 1000));*/ dataAggregator(data, d, da); //d.setMonth(d.getMonth() + 1); //nextMonth(startDate, endDate, processObj); }); } else { } } else { da = new Date(d); da.setMonth(da.getMonth() + 1); webCall($scope.reporting.machineSelect.SoftwareKey, $scope.reporting.machineSelect.Address, processObj, Math.floor(new Date(d) / 1000), Math.floor(new Date(da) / 1000), $scope.reporting.hardware).then(function(data) { /*console.log(Math.floor(new Date(d) / 1000)); console.log(Math.floor(new Date(da) / 1000));*/ dataAggregator(data, d, da); d.setMonth(d.getMonth() + 1); nextMonth(startDate, endDate, processObj); }); } } else { // $rootScope.countSlope = 0; // $rootScope.timeSlope = 0; if ($scope.reporting.xaxis === 'Month') { $scope.options.series[2].visible = false; $scope.options.drawLegend = false; } else { $scope.options.series[2].visible = true; $scope.options.drawLegend = true; } array_x = []; array_y = []; for (i = 0; i < $scope.data.length; ++i) { array_x.push($scope.data[i].xCountCounter); array_y.push($scope.data[i].count); if ($scope.data[i].count > $scope.y2CountMax) { $scope.y2CountMax = $scope.data[i].count; } } var countRegLine = findLineByLeastSquares(array_x, array_y); //findLineByLeastSquaresLog(array_x, array_y); //findLineByLeastSquaresLog(array_x, array_y); cr.setCountSlopeKPI(Math.round($scope.tempSlope * 10) / 10) /* * 100*/ ; //console.log(countRegLine); tmpCount = 0; angular.forEach(countRegLine[1], function(value, key) { if (tmpCount !== countRegLine[1].length) { $scope.data[tmpCount].countRegLine = value; tmpCount++; } }); array_x = []; array_y = []; for (i = 0; i < $scope.data.length; ++i) { array_x.push($scope.data[i].xTimerCounter); array_y.push($scope.data[i].timer); if ($scope.data[i].timer > $scope.y2TimerMax) { $scope.y2TimerMax = $scope.data[i].timer; } } var timerRegLine = findLineByLeastSquares(array_x, array_y); //findLineByLeastSquaresLog(array_x, array_y); //findLineByLeastSquaresLog(array_x, array_y); cr.setTimeSlopeKPI(Math.round($scope.tempSlope * 10) / 10) /* * 100*/ ; //console.log(countRegLine); tmpCount = 0; angular.forEach(timerRegLine[1], function(value, key) { if (tmpCount !== countRegLine[1].length) { $scope.data[tmpCount].timerRegLine = value; tmpCount++; } }); $scope.disableInputs = false; } } function zeroOut() { $scope.shiftNumCounter = 1; $scope.countCount = 1; $scope.timeCount = 1; $scope.shiftCounter = 1; $scope.shiftNumberCounter = 1; $scope.trendTimeData = 0; $scope.trendCountData = 0; cr.resetCustomReportKPIs(); cr.setupShiftVars($scope.numberOfShifts); $scope.avgTimerData = 0; // $rootScope.rootAccTimeData = $scope.accTimeData = 0; $scope.accCountData = 0; // $rootScope.rootAvgTimeData = $scope.avgTimeData = 0; // $rootScope.rootAvgCountData = $scope.avgCountData = 0; $scope.avgTimerData = 0; $scope.isThereData = false; // $rootScope.timeSlope = 0; // $rootScope.countSlope = 0; $scope.shiftCountDataTotal = 0; $scope.shiftTimerDataTotal = 0; $scope.shiftAdditonCounter = 0; $scope.accShiftTimeData = 0; $scope.accShiftCountData = 0; /*$rootScope.machinesName = ''; $rootScope.startingDate = ''; $rootScope.endingDate = '';*/ } function getCloudReportInfo() { var defer = $q.defer(); $http.get('http://54.213.13.56/api/app/' + appKey + '/' + factoryKey). success(function(data) { //console.log(data[data.length].id); defer.resolve(data); }).error(function(data) { console.log('Error in getCloudReportInfo: ' + data); }); return defer.promise; } function webCall(softwareKey, address, processObj, startDate, endDate, hardware) { var defer = $q.defer(); // console.log('http://54.213.13.56/api/' + softwareKey + '/' + address + // '?process[]=' + processObj + '&date[]=' + startDate + '&date[]=' + endDate + '&index=' + // hardware); $http.get('http://54.213.13.56/api/' + softwareKey + '/' + address + '?process[]=' + processObj + '&date[]=' + startDate + '&date[]=' + endDate + '&index=' + hardware). success(function(data) { //console.log('Data: ' + data); defer.resolve(data); }). error(function(data) { alert(data); }); return defer.promise; } function webMultiCall(softwareKey, address, processObj, startDate, endDate, hardware) { var defer = $q.defer(); // console.log('http://54.213.13.56/api/' + softwareKey + '/' + address + // '?process[]=' + processObj + '&date[]=' + startDate + '&date[]=' + endDate + hardware); $http.get('http://54.213.13.56/api/' + softwareKey + '/' + address + '?process[]=' + processObj + '&date[]=' + startDate + '&date[]=' + endDate + hardware). success(function(data) { //console.log('Data: ' + data); defer.resolve(data); }). error(function(data) { alert(data); }); return defer.promise; } function dataAggregator(data, d, da) { //console.log($scope.reporting.machineSelect.PartCount); if ($scope.hardwareSelected.length === 1) { if ($scope.reporting.machineSelect.PartCount !== undefined && $scope.reporting.machineSelect.PartCount !== '' && data.sum.count !== 0) { data.sum.count = data.sum.count / $scope.reporting.machineSelect.PartCount; } if ($scope.reporting.xaxis === 'Month') { tempDate = d; tempDate = new Date(tempDate.getFullYear(), tempDate.getMonth() + 1, 0); tempDate.setDate(tempDate.getDate()); //console.log(tempDate.getDate()); tempTimerData = data.sum.timer / ((tempDate.getDate() * $scope.WorkPeriod) / 1000) * 100; } else if ($scope.WorkPeriod !== undefined) { tempTimerData = data.sum.timer / (($scope.WorkPeriod) / 1000) * 100; /*console.log('Timer: ' + data.sum.timer); console.log('Work Period: ' + $scope.WorkPeriod); console.log('Initial Work Period: ' + $scope.reporting.machineSelect.WorkPeriod); console.log('Calculations: ' + data.sum.timer / (($scope.WorkPeriod) / 1000) * 100);*/ } else { tempTimerData = data.sum.timer / ((da / d) / 1000) * 100; } // console.log(tempTimerData); // console.log(data.sum.count); if ($scope.reporting.omitZeroes === true) { if (tempTimerData !== 0 && data.sum.count !== 0) { $scope.isThereData = true; } else { $scope.isThereData = false; } } else { if (tempTimerData !== 0 && data.sum.count !== 0) { $scope.isThereData = true; } } /* else { $scope.isThereData = false; } */ //var trendCountData = 0; //console.log('Temp Timer data after calc: ' + data.sum.timer); if ($scope.isThereData === true) { // console.log(tempTimerData); // console.log(data.sum.count); $scope.trendTimeData = trendLineCalculator(tempTimerData, $scope.timeCount, $scope.avgTimerData); $scope.trendCountData = trendLineCalculator(data.sum.count, $scope.countCount, $scope.accCountData); $scope.accCountData += data.sum.count; var tempAvgCountData = $scope.accCountData / $scope.countCount; $scope.avgTimerData += tempTimerData; var tempAvgTimeData = ($scope.avgTimerData / $scope.timeCount); cr.increaseAccCountKPI(data.sum.count); cr.increaseAccTimeKPI(Math.round(data.sum.timer / 60 / 60)); cr.setAvgTimeKPI(tempAvgTimeData); cr.setAvgCountKPI(tempAvgCountData); $scope.countCount++; $scope.timeCount++; } $scope.data.push({ x: new Date(d), count: Math.round(data.sum.count * 100) / 100, timer: Math.round(tempTimerData * 100) / 100, trendTimer: Math.round($scope.trendTimeData), trendCount: Math.round($scope.trendCountData), xCountCounter: $scope.countCount - 1, xTimerCounter: $scope.timeCount - 1, shifts: [], }); } else { //console.log(_.size(data)); console.log(data); console.log($scope.hardwareSelected); } } function trendLineCalculator(value, count, accValue) { // console.log('value: ' + value); // console.log('count: ' + count); // console.log('accValue: ' + accValue); average = (accValue + value) / count; //console.log('After Claculations and Such: ' + average); return average; } $scope.changedMachine = function(item) { $scope.machineDates = item.Dates; //console.log(item); }; /** * Write to the Console * @param {string} message */ self.log = function(message) { console.log(message); }; function findLineByLeastSquares(values_x, values_y) { var sum_x = 0; var sum_y = 0; var sum_xy = 0; var sum_xx = 0; var count = 0; /* * We'll use those variables for faster read/write access. */ var x = 0; var y = 0; /*****************************WHAT MARKO ADDED***************************************/ //index of array where y array will progress into a sequence of non-zero elements var index_nonZero; //first if statement checks if first element is zero //if y[0]!=0 then we have nothing to worry about //if y[0] = 0 then we see where the elements begin to be non zero //once we find that spot, we break out of loop and remove beginning elements that are zero. if (values_y[0] === 0) { for (i = 0; i < values_y.length; i++) { if (values_y[i] !== 0) { index_nonZero = i; break; } } } values_y = values_y.splice(index_nonZero, values_y.length); //tempValuesX = values_x.splice(0, index_nonZero); values_x = values_x.splice(index_nonZero, values_x.length); // console.log(values_y); //console.log(values_X); /******************************END OF WHAT MARKO ADDED***************************/ var values_length = values_x.length; if (values_length != values_y.length) { throw new Error('The parameters values_x and values_y need to have same size!'); } /* * Nothing to do. */ if (values_length === 0) { return [ [], [] ]; } // values_y is shorter than x and so it fails trying to do calculations below. Need to // look into for a fix /* * Calculate the sum for each of the parts necessary. */ for (var v = 0; v < values_length; v++) { x = values_x[v]; y = values_y[v]; sum_x += x; if (y !== 0) { sum_y += y; } else { sum_y += 0; } sum_xx += x * x; sum_xy += x * y; count++; } /* * Calculate m and b for the formular: * y = x * m + b */ var m = (count * sum_xy - sum_x * sum_y) / (count * sum_xx - sum_x * sum_x); $scope.tempSlope = m; var b = (sum_y / count) - (m * sum_x) / count; /* * We will make the x and y result line now */ var result_values_x = []; var result_values_y = []; for (i = 0; i < index_nonZero; i++) { result_values_y.push(0); result_values_x.push(0); } for (var v = 0; v < values_length; v++) { x = values_x[v]; y = x * m + b; result_values_x.push(x); result_values_y.push(y); } return [result_values_x, result_values_y]; } $scope.selectedHardware = function() { $scope.hardwareSelected = $filter('filter')($scope.machineHardware, { checked: true }); } $scope.$watch('hardwareSelected', function(newValue, oldValue) { if(_.size(newValue) > 1){ $scope.options.series = []; for(i = 0; i < $scope.hardwareSelected.length; i++) { $scope.options.series.push({ y: 'shift', // - $scope.reporting.viewDataOption, color: '#0000FF', type: $scope.graphType, axis: 'y', striped: true, label: toTitleCase($scope.reportLabel + ' of ' + $scope.hardwareSelected[i].input), //id: value.id }); // $scope.options.series.push({ // y: 'shift', // - $scope.reporting.viewDataOption, // color: '#0000FF', // type: $scope.graphType, // axis: 'y', // striped: true, // label: toTitleCase('Average of ' + $scope.hardwareSelected[i].input), // //id: value.id // }); } } else { $scope.options.series = [{ y: undefined, color: 'steelblue', type: $scope.graphType, axis: 'y', striped: true, label: toTitleCase($scope.reportLabel + ' of ' + $scope.reporting.viewDataOption), id: "data" }, { y: undefined, //label: "Trendline", color: "#ff7f0e", type: "line", axis: "y", id: "trend", label: 'Average' }, { y: undefined, //label: "Trendline", color: "#006600", type: "line", axis: "y", id: "RegressionLine", label: 'Regression', visible: $scope.showItems, }]; } }); // Initialise Directive self.Initialise(); }