diff --git a/application/controllers/projects/EmployeeHoursController.php b/application/controllers/projects/EmployeeHoursController.php index 6551da6..52df6d8 100644 --- a/application/controllers/projects/EmployeeHoursController.php +++ b/application/controllers/projects/EmployeeHoursController.php @@ -56,13 +56,15 @@ class EmployeeHoursController extends MY_Controller { if ( $hourType == 'PROJECTS' ) { - $projectemployeeID = Projectemployee::select( 'id' ) + $projectemployee = Projectemployee::select( 'id' ) ->whereUserId( $data['employee_id'] ) ->whereprojectId( $projectID ) ->first(); - $data['projectemployee_id'] = $projectemployeeID; + $data['projectemployee_id'] = $projectemployee->id; unset( $data['employee_id'] ); + $data['hourtype_id'] = $data['hourtype_id'] - 8; + $employeehourID = Projecthour::saveProjecthour( $employeehourID, $data ); } else diff --git a/application/controllers/projects/ProjectsController.php b/application/controllers/projects/ProjectsController.php index 0c90994..c553f25 100644 --- a/application/controllers/projects/ProjectsController.php +++ b/application/controllers/projects/ProjectsController.php @@ -15,7 +15,7 @@ class ProjectsController extends MY_Controller { if ( AUTHENTICATED == FALSE ) die( 'NO ACCESS' ); - $models = []; + $models = ['projects/Invoices_model']; $libraries = []; $this->load->model( $models ); @@ -38,6 +38,9 @@ class ProjectsController extends MY_Controller { { $project = Project::getProject( $projectID ); + $project->outstanding = + $this->Invoices_model->getOutstandingPerProject( $project->id ); + $this->json( $project ); } diff --git a/application/models/projects/Invoices_model.php b/application/models/projects/Invoices_model.php index 6541b53..7c3447a 100644 --- a/application/models/projects/Invoices_model.php +++ b/application/models/projects/Invoices_model.php @@ -23,4 +23,20 @@ class Invoices_model extends MY_Model { return $invoiced; } + + public function getOutstandingPerProject( $projectID ) + { + $this->sql = " + SELECT (own_revenue + other_revenue) - SUM(INV.invoiceamount) AS outstanding + FROM invoices INV + JOIN projects PRJ + ON PRJ.id = INV.project_id + JOIN offers OFF + ON PRJ.id = OFF.project_id + WHERE PRJ.id = {$projectID} "; + + $invoiced = $this->get_query_row( 'outstanding' ); + + return $invoiced; + } } \ No newline at end of file diff --git a/application/views/modals/offer_modal.php b/application/views/modals/offer_modal.php index e752858..6dea40c 100644 --- a/application/views/modals/offer_modal.php +++ b/application/views/modals/offer_modal.php @@ -168,6 +168,26 @@ +
+ +
+
+ + + + +
+ + kosten derden (incl btw) + +
+
diff --git a/application/views/modals/partials/_projectdashboard.php b/application/views/modals/partials/_projectdashboard.php index b83a9fd..6fc8f27 100644 --- a/application/views/modals/partials/_projectdashboard.php +++ b/application/views/modals/partials/_projectdashboard.php @@ -86,7 +86,7 @@
-

eigenomzet: +

eigen omzet:

diff --git a/application/views/modals/project_modal.php b/application/views/modals/project_modal.php index 24155a5..d978197 100644 --- a/application/views/modals/project_modal.php +++ b/application/views/modals/project_modal.php @@ -55,19 +55,19 @@ load->view( 'modals/partials/_projectoffers' ); ?> -
+
load->view( 'modals/partials/_projectcosts' ); ?>
-
- load->view('modals/partials/_forecasts'); ?> +
+ load->view( 'modals/partials/_reservations' ); ?>
-
+
load->view( 'modals/partials/_invoices' ); ?>
-
- load->view( 'modals/partials/_reservations' ); ?> +
+ load->view('modals/partials/_forecasts'); ?>
diff --git a/application/views/pages/employeehours_view.php b/application/views/pages/employeehours_view.php index 234995b..756f85c 100644 --- a/application/views/pages/employeehours_view.php +++ b/application/views/pages/employeehours_view.php @@ -22,7 +22,6 @@ optionsText:'fullname', optionsValue:'id', value:$root.selectedEmployeeID, - optionsCaption:'alle...', event:{change:refreshEmployeehours}">
@@ -42,7 +41,7 @@ - + - + - + - + @@ -83,10 +83,11 @@ optionsValue:'projectID', value:projectID, optionsCaption:'selecteer...', - visible:inEdit()"> + visible:inEdit(), + event:{change:$root.saveEmployeehours}"> - + uur @@ -97,7 +98,7 @@ data-bind="textInput:hours, visible:inEdit, event:{change:$root.saveEmployeehours,keyup:$root.validateNumber.bind($data, 'hours')}"/> - + diff --git a/application/views/pages/monthlyemployeehours_view.php b/application/views/pages/monthlyemployeehours_view.php index b82f387..5a96f43 100644 --- a/application/views/pages/monthlyemployeehours_view.php +++ b/application/views/pages/monthlyemployeehours_view.php @@ -7,7 +7,7 @@
diff --git a/application/views/reports/monthlyemployeehours/euro_view.php b/application/views/reports/monthlyemployeehours/euro_view.php index 6837639..a586e04 100644 --- a/application/views/reports/monthlyemployeehours/euro_view.php +++ b/application/views/reports/monthlyemployeehours/euro_view.php @@ -22,17 +22,17 @@ -
totaal
+
eigen budget beschikbaar (ex btw)
-
budget (ex btw)
- - -
derden (ex btw)
- - -
beschikbaar
+
totaal geschreven omzet
+ + + + + +
saldo
@@ -58,21 +58,21 @@ - + + + + - - - - - - - - - - + + + + + + + @@ -91,21 +91,21 @@ + + + - - - - - - - - - - + + + + + + + diff --git a/public/js/lib/modals/offerModal.js b/public/js/lib/modals/offerModal.js index 46d6a3d..96a7714 100644 --- a/public/js/lib/modals/offerModal.js +++ b/public/js/lib/modals/offerModal.js @@ -21,6 +21,7 @@ $( function () { offerleader_id : ko.observable(), own_revenue : ko.observable(), other_revenue : ko.observable(), + costs : ko.observable(), hasProject : ko.observable(), init: function ( callback = false ) { @@ -58,6 +59,7 @@ $( function () { offernumber : vm.offernumber(), own_revenue : vm.own_revenue(), other_revenue : vm.other_revenue(), + costs : vm.costs(), startdate : vm.startdate(), acceptance_chance: vm.acceptance_chance(), accepteddate : vm.accepteddate(), @@ -68,7 +70,7 @@ $( function () { if ( data.createProject ) { tellMe( { title : 'project aanmaken', - message : 'De offerte is goedgekeurt maar nog niet gekoppeld aan een project, wilt u een project aanmaken?', + message : 'De offerte is goedgekeurd maar nog niet gekoppeld aan een project, wilt u een project aanmaken?', notify : true, noText : 'Nee, maak geen project aan', yesText : 'Ja, maak een project aan', @@ -136,7 +138,8 @@ $( function () { vm.accepteddate( offer.accepteddate || null ); vm.rejectdate( offer.rejectdate || null ); vm.own_revenue( offer.own_revenue || 0 ); - vm.other_revenue( offer.other_revenue || 0 ) + vm.other_revenue( offer.other_revenue || 0 ); + vm.costs( offer.costs || 0 ); }, showOfferModal: function () { diff --git a/public/js/lib/modals/projectModal.js b/public/js/lib/modals/projectModal.js index 5c7b786..c006d4b 100644 --- a/public/js/lib/modals/projectModal.js +++ b/public/js/lib/modals/projectModal.js @@ -41,6 +41,9 @@ $( function () { projectname : ko.observable(), years : ko.observableArray( dbo.years ), months : ko.observableArray( dbo.monthArray ), + outstanding : ko.observable(), + toForecast : ko.observable(), + totalForecast : ko.observable(), init: function () { var vm = dbo.editProjectModal; @@ -700,14 +703,15 @@ $( function () { vm.enddate( dbo.helpers.mysql2date( data.enddate ) ); vm.projectnumber( data.projectnumber ); vm.projectname( data.projectname ); + vm.outstanding( data.outstanding ); vm.projectEmployees.removeAll(); vm.projecthours.removeAll(); - $.each( data.projectemployees, function ( i, p ) { + _.each( data.projectemployees, function ( p ) { vm.projectEmployees.push( new vm.Projectemployee( p ) ); } ); - $.each( data.projectemployees, function ( i, p ) { + _.each( data.projectemployees, function ( p ) { var fullname = p.user ? p.user.fullname : '#NB'; $.each( p.projecthours, function ( b, q ) { vm.projecthours.push( new vm.Projecthour( q, fullname ) ); @@ -715,12 +719,12 @@ $( function () { } ); vm.projectcosts.removeAll(); - $.each( data.projectcosts, function ( i, p ) { + _.each( data.projectcosts, function ( p ) { vm.projectcosts.push( new vm.Projectcost( p ) ); } ); vm.offers.removeAll(); - $.each( data.offers, function ( i, p ) { + _.each( data.offers, function ( p, i ) { if ( i == 0 ) { vm.ownRevenue( p.own_revenue ); vm.otherRevenue( p.other_revenue ); @@ -729,17 +733,17 @@ $( function () { } ); vm.invoices.removeAll(); - $.each( data.invoices, function ( i, p ) { + _.each( data.invoices, function ( p ) { vm.invoices.push( new vm.Invoice( p ) ); } ); vm.forecasts.removeAll(); - $.each( data.forecasts, function ( i, p ) { + _.each( data.forecasts, function ( p ) { vm.forecasts.push( new vm.Forecast( p ) ); } ); vm.reservations.removeAll(); - $.each( data.reservations, function ( i, p ) { + _.each( data.reservations, function ( p ) { vm.reservations.push( new vm.Reservation( p ) ); } ); diff --git a/public/js/lib/modules/projects/employeehoursModule.js b/public/js/lib/modules/projects/employeehoursModule.js index 112a935..0228524 100644 --- a/public/js/lib/modules/projects/employeehoursModule.js +++ b/public/js/lib/modules/projects/employeehoursModule.js @@ -27,6 +27,8 @@ dbo.employeehoursInit = function () { init: function () { var vm = dbo.employeehoursModel; + vm.busy = true; + vm.months( dbo.monthArray ); vm.years( dbo.years ); @@ -42,6 +44,7 @@ dbo.employeehoursInit = function () { } ); vm.selectedEmployeeID( dbo.currentUser.id ) + vm.busy = false; vm.refreshEmployeehours(); } ); } ); @@ -89,7 +92,7 @@ dbo.employeehoursInit = function () { if ( self.hourType() == 'PROJECTS' && !self.projectID() ) return; var submitDATA = { - id : self.id, + id : self.id(), employee_id: self.employee_id(), hourdate : self.hourdate(), hourtype_id: self.hourtype_id(), @@ -99,11 +102,12 @@ dbo.employeehoursInit = function () { }; dbo.employeehoursDataService.saveEmployeehour( submitDATA, function ( data ) { - self.id = data.employeehourID; + self.id( data.employeehourID ); } ); }, editEmployeehour: function () { + dbo.employeehoursModel.saveEmployeehours( this ); this.inEdit( !this.inEdit() ); }, @@ -129,7 +133,7 @@ dbo.employeehoursInit = function () { modalClass: 'modal-warning' }, function ( response ) { if ( response ) { - dbo.employeehoursDataService.removeEmployeehour( self.id, function ( data ) { + dbo.employeehoursDataService.removeEmployeehour( self.id(), function ( data ) { if ( data.result ) { vm.refreshEmployeehours(); } else { @@ -147,6 +151,8 @@ dbo.employeehoursInit = function () { refreshEmployeehours: function () { var vm = dbo.employeehoursModel; + if( vm.busy == true ) return; + var employeeID = vm.selectedEmployeeID() || 0; vm.employeehours.removeAll(); @@ -185,7 +191,7 @@ dbo.employeehoursInit = function () { var vm = dbo.employeehoursModel; var self = this; - self.id = data.id; + self.id = ko.observable( data.id ); self.employee_id = ko.observable( data.employee_id ); self.hourtype_id = ko.observable( data.hourtype_id ); self.hourdate = ko.observable( data.hourdate ); @@ -218,4 +224,4 @@ dbo.employeehoursInit = function () { ko.applyBindings( dbo.employeehoursModel, document.getElementById( 'EMPLOYEEHOURS' ) ); } -} \ No newline at end of file +} diff --git a/public/js/lib/modules/reports/monthlyEmployeeHoursModule.js b/public/js/lib/modules/reports/monthlyEmployeeHoursModule.js index 832d32f..6445adc 100644 --- a/public/js/lib/modules/reports/monthlyEmployeeHoursModule.js +++ b/public/js/lib/modules/reports/monthlyEmployeeHoursModule.js @@ -24,9 +24,11 @@ dbo.monthlyemployeehoursInit = function () { recap : ko.observableArray( [] ), totalPerEmployee : ko.observableArray( [] ), totalEmployeeRevenues : ko.observable(), + totalAvailableRevenues : ko.observable(), totalEmployeeHours : ko.observable(), totalEmployeeAvailableHours: ko.observable(), totalBudget : ko.observable(), + totalOwnRevenue : ko.observable(), totalCosts : ko.observable(), totalAvailableBudget : ko.observable(), totalSaldo : ko.observable(), @@ -37,12 +39,8 @@ dbo.monthlyemployeehoursInit = function () { var vm = dbo.monthlyEmployeeHoursModel; dbo.reportsDataService.getUsedYears( function ( data ) { - vm.years.removeAll(); - $.each( data, function ( i, p ) { - vm.years.push( {id: p.year, year: p.year} ); - } ); - - vm.selectedYear( (new Date()).getFullYear() ); + vm.years( dbo.years ) + vm.selectedYear( dbo.currentYear ); } ); vm.initModule(); @@ -51,11 +49,13 @@ dbo.monthlyemployeehoursInit = function () { initModule: function () { var vm = dbo.monthlyEmployeeHoursModel; vm.totalBudget( 0 ); + vm.totalOwnRevenue( 0 ); vm.totalCosts( 0 ); vm.totalAvailableBudget( 0 ); vm.totalSaldo( 0 ); vm.totalWorkInProgress( 0 ); vm.totalEmployeeRevenues( 0 ); + vm.totalAvailableRevenues(0) vm.totalEmployeeHours( 0 ); vm.totalEmployeeAvailableHours( 0 ); vm.totalPerEmployee.removeAll(); @@ -78,11 +78,13 @@ dbo.monthlyemployeehoursInit = function () { vm.recap.push( new vm.Project( p ) ) } ); vm.totalBudget( dbo.helpers.thousandSeparator( vm.totalBudget() ) ); + vm.totalOwnRevenue( dbo.helpers.thousandSeparator( vm.totalOwnRevenue() ) ); vm.totalCosts( dbo.helpers.thousandSeparator( vm.totalCosts() ) ); vm.totalAvailableBudget( dbo.helpers.thousandSeparator( vm.totalAvailableBudget() ) ); vm.totalSaldo( dbo.helpers.thousandSeparator( vm.totalSaldo() ) ); vm.totalWorkInProgress( dbo.helpers.thousandSeparator( vm.totalWorkInProgress() ) ); vm.totalEmployeeRevenues( dbo.helpers.thousandSeparator( vm.totalEmployeeRevenues() ) ); + vm.totalAvailableRevenues( dbo.helpers.thousandSeparator( vm.totalAvailableRevenues() ) ); vm.totalEmployeeHours( dbo.helpers.thousandSeparator( vm.totalEmployeeHours() ) ); _.each( vm.totalPerEmployee(), function ( p ) { p.totalRevenue( dbo.helpers.thousandSeparator( p.totalRevenue() ) ); @@ -286,8 +288,10 @@ dbo.monthlyemployeehoursInit = function () { self.revenues = dbo.helpers.thousandSeparator( data.budget ); self.hours = data.hours; self.totalEmpoloyeeRevenues = 0; + self.availableRevenue = data.own_revenue - data.projectEuros; self.externCosts = dbo.helpers.thousandSeparator( data.projectcosts ); self.budget = dbo.helpers.thousandSeparator( data.budget ); + self.ownRevenue = dbo.helpers.thousandSeparator( data.own_revenue ); self.budgetAvailable = dbo.helpers.thousandSeparator( data.budgetAvailable ); self.saldo = dbo.helpers.thousandSeparator( data.saldo ); @@ -300,10 +304,12 @@ dbo.monthlyemployeehoursInit = function () { self.totalEmployeeRevenues = data.projectEuros; self.totalEmployeeHours = data.projectHours; self.hoursAvailable = data.hoursAvailable; + vm.totalAvailableRevenues( vm.totalAvailableRevenues() + self.availableRevenue ); 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.availableRevenue = dbo.helpers.thousandSeparator( self.availableRevenue ); self.workInProgress = dbo.helpers.thousandSeparator( data.workInProgress ); self.hoursAvailable = data.hoursAvailable; @@ -319,8 +325,9 @@ dbo.monthlyemployeehoursInit = function () { var vm = dbo.monthlyEmployeeHoursModel; vm.totalBudget( vm.totalBudget() + Number( data.budget ) ); + vm.totalOwnRevenue( vm.totalOwnRevenue() + Number( data.own_revenue ) ); vm.totalCosts( vm.totalCosts() + Number( data.projectcosts ) ); - vm.totalAvailableBudget( vm.totalAvailableBudget() + Number( data.budgetAvailable ) ); + vm.totalAvailableBudget( vm.totalAvailableBudget() + Number( data.ownRevenueAvailable ) ); vm.totalSaldo( vm.totalSaldo() + Number( data.saldo ) ); vm.totalWorkInProgress( vm.totalWorkInProgress() + Number( data.workInProgress ) ); diff --git a/public/js/lib/services/offersService.js b/public/js/lib/services/offersService.js index 87ab39b..2b97622 100644 --- a/public/js/lib/services/offersService.js +++ b/public/js/lib/services/offersService.js @@ -105,6 +105,7 @@ dbo.offersService = { this.acceptance_chance = data.acceptance_chance ? data.acceptance_chance : 0; this.own_revenue = data.own_revenue; this.other_revenue = data.other_revenue; + this.costs = data.costs; this.archive = data.archive; } }; \ No newline at end of file