From 50cd8d8f0869d127a75f92c4cb15ca62c596fb4e Mon Sep 17 00:00:00 2001 From: Theo Weijmer Date: Thu, 1 Mar 2018 10:43:58 +0100 Subject: [PATCH] Monthly hours and revenues per employee report --- .../libraries/reports/Recapprojects.php | 33 +++++++++-- application/views/modals/external_modal.php | 2 +- application/views/modals/offer_modal.php | 4 +- .../views/modals/partials/_invoices.php | 52 ++++++++--------- .../views/modals/partials/_projectcosts.php | 4 +- .../views/modals/partials/_projectoffers.php | 4 +- application/views/modals/user_modal.php | 2 +- application/views/pages/externals_view.php | 2 +- .../monthlyemployeehours/hours_view.php | 23 +++++++- public/js/lib/modals/externalModal.js | 6 +- .../js/lib/modules/beheer/externalsModule.js | 16 ++--- public/js/lib/modules/beheer/usersModule.js | 16 ++--- .../reports/monthlyEmployeeHoursModule.js | 58 ++++++++++++------- 13 files changed, 138 insertions(+), 84 deletions(-) diff --git a/application/libraries/reports/Recapprojects.php b/application/libraries/reports/Recapprojects.php index a900940..1fe139c 100644 --- a/application/libraries/reports/Recapprojects.php +++ b/application/libraries/reports/Recapprojects.php @@ -12,8 +12,10 @@ class Recapprojects { private $index; private $project; private $projects; + private $employeeHours; private $invoicedYears = []; private $projectTotals; + private $employeeBudget; private $uniqueEmployee; private $uniqueEmployees; private $projectEmployeeDetail; @@ -95,6 +97,10 @@ class Recapprojects { { $this->setProjectEmployeeDetail(); + $this->setEmployeeBudget(); + + $this->setEmployeeHours(); + $this->setEmployeeDetails(); $this->setProjectTotals(); @@ -111,17 +117,27 @@ class Recapprojects { $this->projectEmployeeDetail = FALSE; } + private function setEmployeeBudget() + { + $this->employeeBudget = + is_null( $this->projectEmployeeDetail['budget'] ) ? 0 : $this->projectEmployeeDetail['budget']; + } + + private function setEmployeeHours() + { + $this->employeeHours = + $this->projectEmployeeDetail ? $this->projectEmployeeDetail->hours : 0; + } + private function setEmployeeDetails() { - $budget = is_null( $this->projectEmployeeDetail['budget'] ) ? 0 : $this->projectEmployeeDetail['budget']; - $hours = $this->projectEmployeeDetail ? $this->projectEmployeeDetail->hours : 0; $this->projects[ $this->index ]['employees'][] = [ 'id' => $this->uniqueEmployee->id, 'fullname' => $this->uniqueEmployee->fullname, - 'hours' => $hours, + 'hours' => $this->employeeHours, 'revenues' => $this->projectEmployeeDetail ? $this->projectEmployeeDetail->revenues : 0, - 'budget' => $budget, - 'availableHours' => $budget - $hours + 'budget' => $this->employeeBudget, + 'availableHours' => $this->employeeBudget - $this->employeeHours ]; } @@ -131,11 +147,15 @@ class Recapprojects { $this->projects[ $this->index ]['projectHours'] = 0; if ( ! isset( $this->projects[ $this->index ]['projectEuros'] ) ) $this->projects[ $this->index ]['projectEuros'] = 0; + if ( ! isset( $this->projects[ $this->index ]['hoursAvailable'] ) ) + $this->projects[ $this->index ]['hoursAvailable'] = 0; $this->projects[ $this->index ]['projectHours'] += $this->projectEmployeeDetail ? $this->projectEmployeeDetail->hours : 0; $this->projects[ $this->index ]['projectEuros'] += $this->projectEmployeeDetail ? $this->projectEmployeeDetail->revenues : 0; + $this->projects[ $this->index ]['hoursAvailable'] += + $this->employeeBudget - $this->employeeHours; } private function setBudget() @@ -198,6 +218,9 @@ class Recapprojects { $this->projects[ $this->index ]['projectEuros'] + $this->projects[ $this->index ]['projectcosts'] - $this->projects[ $this->index ]['totalInvoiced']; + + if( $this->projects[ $this->index ]['workInProgress'] < 0 ) + $this->projects[ $this->index ]['workInProgress'] = 0; } private function setInvoicedYears() diff --git a/application/views/modals/external_modal.php b/application/views/modals/external_modal.php index 2c994a7..303ddd2 100644 --- a/application/views/modals/external_modal.php +++ b/application/views/modals/external_modal.php @@ -2,7 +2,7 @@ diff --git a/application/views/modals/partials/_invoices.php b/application/views/modals/partials/_invoices.php index 3491265..6579876 100644 --- a/application/views/modals/partials/_invoices.php +++ b/application/views/modals/partials/_invoices.php @@ -15,19 +15,13 @@ factuurdatum - bedrag (excl) + bedrag (excl btw) - bedrag (incl) + bedrag (incl btw) - openstaand - - - prognose(excl) - - - prognose datum + openstaand( incl btw) btw tarief @@ -78,26 +72,26 @@ - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + diff --git a/application/views/modals/partials/_projectcosts.php b/application/views/modals/partials/_projectcosts.php index a8f3451..7574eec 100644 --- a/application/views/modals/partials/_projectcosts.php +++ b/application/views/modals/partials/_projectcosts.php @@ -1,14 +1,14 @@

- inkomende facturen + inkomende facturen (bedragen incl btw)

+ + + + + + + + + + + + +
- externe + onderaannemer omschrijving diff --git a/application/views/modals/partials/_projectoffers.php b/application/views/modals/partials/_projectoffers.php index 12130af..f3c148d 100644 --- a/application/views/modals/partials/_projectoffers.php +++ b/application/views/modals/partials/_projectoffers.php @@ -14,10 +14,10 @@ start - eigen omzet + eigen omzet (excl btw) - overig omzet + overig omzet (excl btw)   diff --git a/application/views/modals/user_modal.php b/application/views/modals/user_modal.php index d328f4f..cb8f8ea 100644 --- a/application/views/modals/user_modal.php +++ b/application/views/modals/user_modal.php @@ -2,7 +2,7 @@
diff --git a/application/views/reports/monthlyemployeehours/hours_view.php b/application/views/reports/monthlyemployeehours/hours_view.php index 3c5e3b3..cf1d7ce 100644 --- a/application/views/reports/monthlyemployeehours/hours_view.php +++ b/application/views/reports/monthlyemployeehours/hours_view.php @@ -55,8 +55,29 @@ - +
totaal + + + + + + + +
\ No newline at end of file diff --git a/public/js/lib/modals/externalModal.js b/public/js/lib/modals/externalModal.js index c3bf749..43bdcee 100644 --- a/public/js/lib/modals/externalModal.js +++ b/public/js/lib/modals/externalModal.js @@ -58,8 +58,8 @@ $( function () { dbo.externalDataService.saveExternal( submitDATA, function ( data ) { if ( data.success ) { tellMe( { - title : 'externe aangemaakt', - message : 'externe is succesvol opgeslagen', + title : 'onderaannemer aangemaakt', + message : 'onderaannemer is succesvol opgeslagen', modalClass: 'modal-success' }, function () { vm.hideExternalModal(); @@ -78,7 +78,7 @@ $( function () { } ); errorMessage += ''; tellMe( { - title : 'fout aanmaken externe', + title : 'fout aanmaken onderaannemer', message : errorMessage, modalClass: 'modal-danger' } ); diff --git a/public/js/lib/modules/beheer/externalsModule.js b/public/js/lib/modules/beheer/externalsModule.js index 37e3de0..6c727e7 100644 --- a/public/js/lib/modules/beheer/externalsModule.js +++ b/public/js/lib/modules/beheer/externalsModule.js @@ -62,27 +62,27 @@ dbo.externalsInit = function () { var self = this; tellMe( { - title : 'verwijderen externe', - message : 'weet u zeker dat u de externe wilt verwijderen, dit kan niet ongedaan worden gemaakt', + title : 'verwijderen onderaannemer', + message : 'weet u zeker dat u de onderaannemer wilt verwijderen, dit kan niet ongedaan worden gemaakt', notify : true, - noText : 'nee verwijder de externe niet', - yesText : 'ja verwijder de externe', + noText : 'nee verwijder de onderaannemer niet', + yesText : 'ja verwijder de onderaannemer', modalClass: 'modal-warning' }, function ( response ) { if ( response ) { dbo.externalDataService.removeExternal( self.id, function ( data ) { if ( data.result ) { tellMe( { - title : 'externe verwijderd', - message : 'de externe is succesvol verwijderd', + title : 'onderaannemer verwijderd', + message : 'de onderaannemer is succesvol verwijderd', modalClass: 'modal-success' }, function () { vm.refreshExternals(); } ); } else { tellMe( { - title : 'fout bij verwijderen externe', - message : 'de externe kan niet worden verwijderd', + title : 'fout bij verwijderen onderaannemer', + message : 'de onderaannemer kan niet worden verwijderd', modalClass: 'modal-danger' } ); } diff --git a/public/js/lib/modules/beheer/usersModule.js b/public/js/lib/modules/beheer/usersModule.js index 8373588..255decd 100644 --- a/public/js/lib/modules/beheer/usersModule.js +++ b/public/js/lib/modules/beheer/usersModule.js @@ -69,11 +69,11 @@ dbo.usersInit = function () { var self = this; tellMe( { - title : 'verwijderen gebruiker', - message : 'weet u zeker dat u de gebruiker wilt verwijderen, dit kan niet ongedaan worden gemaakt', + title : 'verwijderen medewerker', + message : 'weet u zeker dat u de medewerker wilt verwijderen, dit kan niet ongedaan worden gemaakt', notify : true, - noText : 'nee verwijder de gebruiker niet', - yesText : 'ja verwijder de gebruiker', + noText : 'nee verwijder de medewerker niet', + yesText : 'ja verwijder de medewerker', modalClass: 'modal-warning' }, function ( response ) { console.log( response ); @@ -81,16 +81,16 @@ dbo.usersInit = function () { dbo.userDataService.removeUser( self.id, function ( data ) { if ( data.result ) { tellMe( { - title : 'gebruiker verwijderd', - message : 'de gebruiker is succesvol verwijderd', + title : 'medewerker verwijderd', + message : 'de medewerker is succesvol verwijderd', modalClass: 'modal-success' }, function () { vm.refreshUsers(); } ); } else { tellMe( { - title : 'fout bij verwijderen gebruiker', - message : 'de gebruiker kan niet worden verwijderd', + title : 'fout bij verwijderen medewerker', + message : 'de medewerker kan niet worden verwijderd', modalClass: 'modal-danger' } ); } diff --git a/public/js/lib/modules/reports/monthlyEmployeeHoursModule.js b/public/js/lib/modules/reports/monthlyEmployeeHoursModule.js index 3a87d12..ae6915d 100644 --- a/public/js/lib/modules/reports/monthlyEmployeeHoursModule.js +++ b/public/js/lib/modules/reports/monthlyEmployeeHoursModule.js @@ -15,21 +15,23 @@ dbo.monthlyemployeehoursInit = function () { dbo.monthlyEmployeeHoursModel = { - uniqueEmployees : ko.observableArray( [] ), - uniqueYears : ko.observableArray( [] ), - sluggy : ko.observable( 'euro' ), - years : ko.observableArray( [] ), - selectedYear : ko.observable(), - currentTab : false, - recap : ko.observableArray( [] ), - totalPerEmployee : ko.observableArray( [] ), - totalEmployeeRevenues: ko.observable(), - totalBudget : ko.observable(), - totalCosts : ko.observable(), - totalAvailableBudget : ko.observable(), - totalSaldo : ko.observable(), - totalWorkInProgress : ko.observable(), - totalInvoicedYear : ko.observableArray( [] ), + uniqueEmployees : ko.observableArray( [] ), + uniqueYears : ko.observableArray( [] ), + sluggy : ko.observable( 'euro' ), + years : ko.observableArray( [] ), + selectedYear : ko.observable(), + currentTab : false, + recap : ko.observableArray( [] ), + totalPerEmployee : ko.observableArray( [] ), + totalEmployeeRevenues : ko.observable(), + totalEmployeeHours : ko.observable(), + totalEmployeeAvailableHours: ko.observable(), + totalBudget : ko.observable(), + totalCosts : ko.observable(), + totalAvailableBudget : ko.observable(), + totalSaldo : ko.observable(), + totalWorkInProgress : ko.observable(), + totalInvoicedYear : ko.observableArray( [] ), init: function () { var vm = dbo.monthlyEmployeeHoursModel; @@ -54,6 +56,8 @@ dbo.monthlyemployeehoursInit = function () { vm.totalSaldo( 0 ); vm.totalWorkInProgress( 0 ); vm.totalEmployeeRevenues( 0 ); + vm.totalEmployeeHours( 0 ); + vm.totalEmployeeAvailableHours( 0 ); vm.totalPerEmployee.removeAll(); vm.totalInvoicedYear.removeAll(); dbo.userDataService.getUniqueProjectEmployees( function ( data ) { @@ -79,6 +83,7 @@ dbo.monthlyemployeehoursInit = function () { vm.totalSaldo( dbo.helpers.thousandSeparator( vm.totalSaldo() ) ); vm.totalWorkInProgress( dbo.helpers.thousandSeparator( vm.totalWorkInProgress() ) ); vm.totalEmployeeRevenues( dbo.helpers.thousandSeparator( vm.totalEmployeeRevenues() ) ); + vm.totalEmployeeHours( dbo.helpers.thousandSeparator( vm.totalEmployeeHours() ) ); _.each( vm.totalPerEmployee(), function ( p ) { p.totalRevenue( dbo.helpers.thousandSeparator( p.totalRevenue() ) ); } ); @@ -112,8 +117,6 @@ dbo.monthlyemployeehoursInit = function () { if ( vm.currentTab == false ) return; - console.log( vm.currentTab ); - dbo.reportsDataService.getEmployeeHours( vm.currentTab.id, vm.selectedYear(), function ( data ) { vm.currentTab.myData( data ); vm.currentTab.totalJanuari( 0 ); @@ -293,12 +296,17 @@ dbo.monthlyemployeehoursInit = function () { $.each( data.employees, function ( i, p ) { self.employees.push( new vm.Employee( p ) ); if ( !self.totalEmployeeRevenues ) self.totalEmployeeRevenues = 0; + if ( !self.totalEmployeeHours ) self.totalEmployeeHours = 0; } ); self.totalEmployeeRevenues = data.projectEuros; - vm.totalEmployeeRevenues( vm.totalEmployeeRevenues() + Number( self.totalEmployeeRevenues ) ); - self.totalEmployeeRevenues = dbo.helpers.thousandSeparator( self.totalEmployeeRevenues ); self.totalEmployeeHours = data.projectHours; + self.hoursAvailable = data.hoursAvailable; + vm.totalEmployeeRevenues( vm.totalEmployeeRevenues() + Number( self.totalEmployeeRevenues ) ); + vm.totalEmployeeHours( vm.totalEmployeeHours() + Number( self.totalEmployeeHours ) ); + vm.totalEmployeeAvailableHours( vm.totalEmployeeAvailableHours() + Number( self.hoursAvailable ) ); + self.totalEmployeeRevenues = dbo.helpers.thousandSeparator( self.totalEmployeeRevenues ); self.workInProgress = dbo.helpers.thousandSeparator( data.workInProgress ); + self.hoursAvailable = data.hoursAvailable; self.invoiced = ko.observableArray( [] ); $.each( data.invoiced, function ( i, p ) { @@ -321,12 +329,20 @@ dbo.monthlyemployeehoursInit = function () { if ( vm.totalPerEmployee().length == 0 ) hasTotalEmployees = false; _.each( data.employees, function ( p ) { if ( !hasTotalEmployees ) { - vm.totalPerEmployee.push( {id: p.id, fullname: p.fullname, totalRevenue: ko.observable( 0 )} ); + vm.totalPerEmployee.push( { + id : p.id, + fullname : p.fullname, + totalRevenue : ko.observable( 0 ), + totalHours : ko.observable( 0 ), + totalAvailableHours: ko.observable( 0 ) + } ); } var a = _.find( vm.totalPerEmployee(), function ( o ) { return o.id == p.id } ); - a.totalRevenue( a.totalRevenue() + p.revenues ); + a.totalRevenue( a.totalRevenue() + Number( p.revenues ) ); + a.totalHours( a.totalHours() + Number( p.hours ) ); + a.totalAvailableHours( a.totalAvailableHours() + Number( p.availableHours ) ); } ); var hasTotalsOwpYear = true;