app.controller('FinanceCtrl', function($scope, $http, $location, $window, $routeParams, Upload) { //set params $scope.invoices = new Array(); $scope.dataGeneral = []; $scope.filterBasedOn = 'signDate'; $scope.showArchivedItems = false; let currentYear = new Date().getFullYear(); let previousYear = currentYear - 1; $scope.filterFromDate = new Date(previousYear + "-09-01"); $scope.filterTillDate = new Date(currentYear + "-08-31"); $scope.selectedFinancialYear = previousYear + ' - ' + currentYear; $scope.period = $scope.filterFromDate.getDate() + '-' + $scope.filterFromDate.toLocaleString('default', { month: 'short' }) + '-' + $scope.filterFromDate.getFullYear() + ' t/m ' + $scope.filterTillDate.getDate() + '-' + $scope.filterTillDate.toLocaleString('default', { month: 'short' }) + '-' + $scope.filterTillDate.getFullYear(); $scope.arrFinancialYears = new Array(); for (let index = (currentYear - 5); index < (currentYear + 2); index++) { $scope.arrFinancialYears.push(index + ' - ' + (parseInt(index) + 1)); } //reset selected scenario if ($routeParams.id === undefined && $scope.selectedScenario !== undefined) { $scope.selectedScenario = null; } //id set + selectedScenario null if ($routeParams.id !== undefined && $scope.selectedScenario === undefined) { //retrieve invoices for this scenario let req = { method: 'GET', url: '/scenario/getForFinanceOverview/' + $routeParams.id, } $http(req).then(function(response) { if(response.status && response.data.status){ $scope.getScenario({}, response.data.data[0]); } }); } $scope.getTotalAmount = function(type, year = false) { let amount = null; if ($scope.scenarioOverview != undefined && $scope.scenarioOverview.statistics != undefined ) { switch (type) { case 'scenario': if ($scope.scenarioOverview.statistics.price_total != undefined) { amount = $scope.scenarioOverview.statistics.price_total; } break; case 'to_invoice': if ($scope.scenarioOverview.statistics.to_invoice_amount != undefined) { amount = $scope.scenarioOverview.statistics.to_invoice_amount; } break; case 'invoiced': if ($scope.scenarioOverview.statistics.invoiced_amount != undefined) { amount = $scope.scenarioOverview.statistics.invoiced_amount; } break; case 'outstanding': if ($scope.scenarioOverview.statistics.outstanding_amount != undefined) { amount = $scope.scenarioOverview.statistics.outstanding_amount; } break; } } return amount; } $scope.getGeneralData = function() { //get formatted dates for backend let fromDate = $scope.filterFromDate.getFullYear() + '-' + ($scope.filterFromDate.getMonth() + 1) + '-' + $scope.filterFromDate.getDate(); let tillDate = $scope.filterTillDate.getFullYear() + '-' + ($scope.filterTillDate.getMonth() + 1) + '-' + $scope.filterTillDate.getDate(); //check for archived if ($scope.showArchivedItems) { $scope.scenarioOverview.function = 'getForFinanceOverview/0/1/' + fromDate + '/' + tillDate + '/' + $scope.filterBasedOn; } else { $scope.scenarioOverview.function = 'getForFinanceOverview/0/0/' + fromDate + '/' + tillDate + '/' + $scope.filterBasedOn; } let req = { method: 'GET', url: '/scenario/getForFinanceOverviewGeneral/0/' + ($scope.showArchivedItems ? '1' : 0) + '/' + fromDate + '/' + tillDate + '/' + $scope.filterBasedOn, } $http(req).then(function(response) { if(response.status && response.data.status){ $scope.dataGeneral = response.data.data; } }); } $scope.setFinancialYear = function() { //split on - let arrYears = $scope.selectedFinancialYear.split(" - "); //check if values are set and change date range if (arrYears[0] !== undefined) { $scope.filterFromDate = new Date(arrYears[0] + "-09-01"); } if (arrYears[1] !== undefined) { $scope.filterTillDate = new Date(arrYears[1] + "-08-31"); } } $scope.filterOverview = function() { //set period $scope.period = $scope.filterFromDate.getDate() + '-' + $scope.filterFromDate.toLocaleString('default', { month: 'short' }) + '-' + $scope.filterFromDate.getFullYear() + ' t/m ' + $scope.filterTillDate.getDate() + '-' + $scope.filterTillDate.toLocaleString('default', { month: 'short' }) + '-' + $scope.filterTillDate.getFullYear(); //get formatted dates for backend let fromDate = $scope.filterFromDate.getFullYear() + '-' + ($scope.filterFromDate.getMonth() + 1) + '-' + $scope.filterFromDate.getDate(); let tillDate = $scope.filterTillDate.getFullYear() + '-' + ($scope.filterTillDate.getMonth() + 1) + '-' + $scope.filterTillDate.getDate(); //check for archived if ($scope.showArchivedItems) { $scope.scenarioOverview.function = 'getForFinanceOverview/0/1/' + fromDate + '/' + tillDate + '/' + $scope.filterBasedOn; } else { $scope.scenarioOverview.function = 'getForFinanceOverview/0/0/' + fromDate + '/' + tillDate + '/' + $scope.filterBasedOn; } $scope.getGeneralData(); $scope.scenarioOverview.call('initiate'); } $scope.showArchived = function() { //get formatted dates for backend let fromDate = $scope.filterFromDate.getFullYear() + '-' + ($scope.filterFromDate.getMonth() + 1) + '-' + $scope.filterFromDate.getDate(); let tillDate = $scope.filterTillDate.getFullYear() + '-' + ($scope.filterTillDate.getMonth() + 1) + '-' + $scope.filterTillDate.getDate(); //check for archived $scope.scenarioOverview.function = 'getForFinanceOverview/0/1/' + fromDate + '/' + tillDate + '/' + $scope.filterBasedOn; $scope.scenarioOverview.buttons['SA']['header'] = false; $scope.scenarioOverview.buttons['HA']['header'] = true; $scope.showArchivedItems = true; $scope.scenarioOverview.call('initiate'); } $scope.hideArchived = function() { //get formatted dates for backend let fromDate = $scope.filterFromDate.getFullYear() + '-' + ($scope.filterFromDate.getMonth() + 1) + '-' + $scope.filterFromDate.getDate(); let tillDate = $scope.filterTillDate.getFullYear() + '-' + ($scope.filterTillDate.getMonth() + 1) + '-' + $scope.filterTillDate.getDate(); //check for archived $scope.scenarioOverview.function = 'getForFinanceOverview/0/0/' + fromDate + '/' + tillDate + '/' + $scope.filterBasedOn; $scope.scenarioOverview.buttons['SA']['header'] = true; $scope.scenarioOverview.buttons['HA']['header'] = false; $scope.showArchivedItems = false; $scope.scenarioOverview.call('initiate'); } $scope.scenarioOverview = { name: 'Draaiboeken', controller: 'scenario', function: 'getForFinanceOverview/0/0/' + previousYear + "-09-01/" + currentYear + "-08-31", // Panel class panelClass: 'panel-trainingskampen', showFilters: true, // pageLimit: 1000, // Do not use page limit for price calculation showStatistics: true, fields: [ 'id', 'customer', 'name', 'destination', 'price_total', 'to_invoice_amount', 'invoiced_amount', 'outstanding_amount', ], fieldDetails: { id: { label: "#", type: "text", }, customer: { label: 'Klant', }, name: { label: 'Draaiboeknaam', }, destination: { label: 'Bestemming', }, price_total: { label: 'Verkoop', currency: '€', type: 'number', }, to_invoice_amount: { label: 'Niet gefactureerd', currency: '€', type: 'number', }, invoiced_amount: { label: 'Gefactureerd', currency: '€', type: 'number', }, outstanding_amount: { label: 'Openstaand', currency: '€', type: 'number', }, }, buttons: { 'C':{ 'id': 'c', 'header': false, 'inline': false, }, 'SA':{ 'id': 'sa', 'name': 'Gearchiveerde draaiboeken weergeven', 'confirmName': 'showArchived', 'confirmClass': 'success', 'icon': 'fa-eye', 'header': true, 'action': 'showArchived', 'parentScope': true, }, 'HA':{ 'id': 'ha', 'name': 'Gearchiveerde draaiboeken verbergen', 'confirmName': 'hideArchived', 'confirmClass': 'success', 'icon': 'fa-eye-slash', 'header': false, 'action': 'hideArchived', 'parentScope': true, }, 'R':{ 'id': 'r', 'name': 'Bekijk', 'label': 'Bekijk', 'inline': true, 'icon': 'fa-arrow-right', 'action': 'goToScenario', 'parentScope': true, }, 'U': { 'id': 'u', 'inline': false, }, 'D':{ 'id': 'd', 'inline': false, }, } } //translate table $scope.tableReady = function (tableName) { if (tableName === 'Draaiboeken') { $scope.scenarioOverview.labels = { 'of': 'van', 'rows': 'rijen', 'lastUpdated': 'Laatste wijziging', 'showNotSelectedRows': 'Toon niet geselecteerde rijen', 'showSelectedRows': 'Toon geselecteerde rijen', 'selectAllRows': 'Selecteer alle rijen', 'deSelectAllRows': 'De-selecteer alle rijen', 'selectFilteredRows': 'Selecteer gefilterde rijen', 'deSelectFilteredRows': 'De-selecteer gefilterde rijen', 'false': 'Mislukt', 'true': 'Gelukt', 'statistics': 'Statistieken', 'deleteAllRowsMessage': 'Let op! Je staat op het punt alle geselecteerde rijen te verwijderen', 'ready' : 'Klaar', 'processSubFields' : 'Verwerk subvelden', 'alreadyLoaded' : 'al ingeladen in data.', 'errorInFetching' : 'Error in ophalen', 'dataAvailable' : 'Data al beschikbaar', 'loading' : 'Laden...', }; $scope.getGeneralData(); } } $scope.toCustomer = function(btn, row, blnSubmit) { $location.url('/page/klant/' + row.id); } $scope.getTotalPercentage = function(type) { let amount = null; let totalAmount = null; if ($scope.scenarioOverview != undefined && $scope.scenarioOverview.statistics != undefined ) { //loop rows $scope.scenarioOverview.data.rows.forEach(scenarioRow => { if ($scope.scenarioOverview.statistics.price_total != undefined) { totalAmount = $scope.scenarioOverview.statistics.price_total.replaceAll('.', ''); totalAmount = parseFloat(totalAmount.replace('€', '')); } switch (type) { case 'scenario': if ($scope.scenarioOverview.statistics.price_total != undefined) { amount = $scope.scenarioOverview.statistics.price_total.replaceAll('.', ''); amount = parseFloat(amount.replace('€', '')); } break; case 'to_invoice': if ($scope.scenarioOverview.statistics.to_invoice_amount != undefined) { amount = $scope.scenarioOverview.statistics.to_invoice_amount.replaceAll('.', ''); amount = parseFloat(amount.replace('€', '')); } break; case 'invoiced': if ($scope.scenarioOverview.statistics.invoiced_amount != undefined) { amount = $scope.scenarioOverview.statistics.invoiced_amount.replaceAll('.', ''); amount = parseFloat(amount.replace('€', '')); } break; case 'outstanding': if ($scope.scenarioOverview.statistics.outstanding_amount != undefined) { amount = $scope.scenarioOverview.statistics.outstanding_amount.replaceAll('.', ''); amount = parseFloat(amount.replace('€', '')); } break; } }); } let percentage = ((amount/totalAmount) * 100); if (isNaN(percentage)) { return ""; } return Math.round(percentage * 100) / 100; } $scope.goToScenario = function(btn, row) { $window.location.href = '/page/financieel/' + row.id; } //open scenario overview $scope.getScenario = function(btn, row) { //set selected scenario $scope.selectedScenario = row; //retrieve invoices for this scenario let req = { method: 'GET', url: '/invoice/getByScenario/' + $scope.selectedScenario.id, } $http(req).then(function(response) { if(response.status && response.data.status){ $scope.invoices = response.data.data; } }); //retrieve activities for this scenario let reqActivities = { method: 'GET', url: '/scenario_activity/getPerScenario/' + $scope.selectedScenario.id, } $http(reqActivities).then(function(response) { if(response.status && response.data.status){ $scope.activities = response.data.data; } }); } //go back to general overview $scope.goBack = function() { $window.location.href = '/page/financieel/'; } $scope.getFormattedNumber = function(number) { return new Intl.NumberFormat('nl-NL', {style: 'currency', currency: 'EUR'}).format(number); } $scope.filterByAmountAndNoPayment = function(activity) { return (activity.price_sales != null && parseFloat(activity.price_sales) != 0); } $scope.getActivityCosts = function(){ let cost = 0; if ($scope.selectedScenario != undefined) { cost = parseFloat($scope.selectedScenario.scenario_price_total); angular.forEach($scope.activities, function(activity){ if(activity.price_sales){ cost += parseFloat(activity.price_sales); } }); } return $scope.getFormattedNumber(cost); } $scope.getInvoiceCosts = function(){ let cost = 0; if ($scope.invoices != undefined) { angular.forEach($scope.invoices, function(invoice){ if(invoice.total_amount){ cost += parseFloat(invoice.total_amount); } }); } return $scope.getFormattedNumber(cost); } $scope.getOutstandingAmount = function(){ let cost = 0; if ($scope.invoices != undefined) { angular.forEach($scope.invoices, function(invoice){ cost += parseFloat(invoice.total_amount - invoice.paid_amount); }); } return $scope.getFormattedNumber(cost); } $scope.openScenario = function(id) { window.location = '/page/draaiboek/' + id; } //download sgrz rapport $scope.downloadSGRZReport = function(btn, row, blnSubmit) { $("#downloadSGRZReportModal").modal('toggle'); } // get the start & end dates of the last quarter of the year $scope.setLastQuarterDate = function() { let startDate = ''; let endDate = ''; switch((new Date()).getMonth() + 1) { case 1: case 2: case 3: startDate = ((new Date()).getFullYear() - 1) + '-10-01'; endDate = ((new Date()).getFullYear() - 1) + '-12-31'; break; case 4: case 5: case 6: startDate = (new Date()).getFullYear() + '-01-01'; endDate = (new Date()).getFullYear() + '-03-31'; break; case 7: case 8: case 9: startDate = (new Date()).getFullYear() + '-04-01'; endDate = (new Date()).getFullYear() + '-06-30'; break; case 10: case 11: case 12: startDate = (new Date()).getFullYear() + '-07-01'; endDate = (new Date()).getFullYear() + '-09-30'; break; } $scope.from_date = new Date(startDate); $scope.till_date = new Date(endDate); } $scope.setLastQuarterDate(); //export sgrz rapport $scope.checkRowsSGRZReport = function(btn, row, blnSubmit) { let dateRange = {'from_date': $scope.from_date, 'till_date': $scope.till_date} if (dateRange.from_date !== null && dateRange.from_date !== undefined && dateRange.till_date !== null && dateRange.till_date !== undefined) { // format to yyyy-mm-dd for backend let fromDateOffset = dateRange.from_date?.getTimezoneOffset() * 60 * 1000; let isoFromDate = (new Date(dateRange.from_date?.getTime() - fromDateOffset)).toISOString().split('T')[0]; let tillDateOffset = dateRange.till_date?.getTimezoneOffset() * 60 * 1000; let isoTillDate = (new Date(dateRange.till_date?.getTime() - tillDateOffset)).toISOString().split('T')[0]; // format to dd-mm-yyyy for swals let fromDate = new Date(dateRange.from_date); fromDate = ('0' + fromDate.getDate()).slice(-2) + '-' + ('0' + (fromDate.getMonth() + 1)).slice(-2) + '-' + fromDate.getFullYear(); let tillDate = new Date(dateRange.till_date); tillDate = ('0' + tillDate.getDate()).slice(-2) + '-' + ('0' + (tillDate.getMonth() + 1)).slice(-2) + '-' + tillDate.getFullYear(); // first request checks if date range has downloadable rows let req = { method: 'POST', url: '/scenario/downloadSGRZ/1', data: dateRange, } $http(req).then(function(response) { if (response.status && response.data.status) { window.open('/scenario/downloadSGRZ/0' + '?from_date=' + isoFromDate + '&till_date=' + isoTillDate, '_blank'); // toggle modal & unset from-/till date $scope.setLastQuarterDate(); $("#downloadSGRZReportModal").modal('toggle'); swal({ title: 'Gelukt!', text: 'Het SGRZ rapport met data vanaf ' + fromDate + ' t/m ' + tillDate + ' is succesvol gedownload.', icon: 'success', }) } else { swal({ title: 'Let op!', text: 'Er is geen data gevonden in de periode vanaf ' + fromDate + ' t/m ' + tillDate + '.', icon: 'error', }) } }).catch(function(error) { swal({ title: 'Let op!', text: 'Er is iets misgegaan, probeer het opnieuw', icon: 'error', }) }) } else { swal({ title: 'Let op!', text: 'Vul een vanaf en tot en met datum in om door te gaan', icon: 'error', }) } } })