budgetteren in monfin

This commit is contained in:
2023-03-24 15:00:04 +01:00
parent d0b8914462
commit 4173dd2dc5
11 changed files with 1647 additions and 432 deletions
+372 -93
View File
@@ -7,30 +7,80 @@ ls.initBestemmingenModel = function(){
this.naam = p.naam;
}
function fAddBasissoort(k){
function fAddBasissoort(j,k, budget, totbudget, bedrag ){
var dit = this;
this.soortID = k.soortID
this.naam = k.naam
this.subsoorten = ko.observableArray([]);
if (k.subsoorten){
$.each(k.subsoorten, function(a,b){
dit.subsoorten.push(new fAddSubsoort(b, k.categorie));
dit.subsoorten.push(new fAddSubsoort(a, b, budget, totbudget, bedrag, k.categorie));
});
}
}
function fAddSubsoort(p,categorie){
var dit = dit;
this.subsoortID = p.subsoortID;
this.naam = p.naam;
function fAddSubsoort(a,b,gebudget, totbudget, totbedrag, categorie){
var dit = this;
var bedrag = 0;
var budget = 0;
var uitgaven = 0;
var budgettot = 0;
var bedragtot = 0;
var centbudget = 0;
var budgettot2 = 0;
var centbudget2 = 0;
this.subsoortID = b.subsoortID;
this.naam = b.naam;
this.categorie = categorie
this.uitgavetypes = ko.observableArray()
var dit = this;
if (p.uitgavetypes){
$.each(p.uitgavetypes, function(i,k){
this.uitgavetypes = ko.observableArray();
this.totaal = ko.observable(0);
this.formtotaal = ko.observable('');
this.procent = ko.observable(0);
this.subbudget = ko.observable(0);
this.subbudgetform = ko.observable('');
this.budgetprocent = ko.observable(0);
this.gebudgetprocent = ko.observable(0);
if (b.uitgavetypes) {
$.each(b.uitgavetypes, function (i, k) {
bedrag = Number(bedrag) + Number(k.bedrag);
budget = Number(budget) + Number(k.budget);
dit.uitgavetypes.push(new fAddUitgavetype(k));
});
dit.totaal(bedrag);
dit.formtotaal(parseFloat(bedrag) === 0 ? '' : parseFloat(bedrag).format(2, 3, '.', ','));
dit.subbudget(budget);
dit.subbudgetform(parseFloat(budget) === 0 ? '' : parseFloat(budget).format(2, 3, '.', ','));
centbudget = dit.subbudgetform();
centbudget = centbudget.replace(/[.| ,]/g, '');
if (totbudget) {
budgettot = totbudget.replace(/[.| ,]/g, '');
var budgetpct = ((Number(centbudget) / Number(budgettot)) * 100).toFixed(1)
budgetpct = budgetpct.replace('.', ',')
dit.budgetprocent(budgettot > 0 ? budgetpct + '%' : '');
}
if (gebudget) {
budgettot2 = gebudget.replace(/[.| ,]/g, '');
var budgetpct2 = ((Number(centbudget) / Number(budgettot2)) * 100).toFixed(1)
budgetpct2 = budgetpct2.replace('.', ',')
dit.gebudgetprocent(budgettot2 > 0 ? budgetpct2 + '%' : '')
}
if(totbedrag) {
bedragtot = totbedrag.replace(/[.| ,]/g, '');
uitgaven = dit.formtotaal();
uitgaven = uitgaven.replace(/[.| ,]/g, '');
uitgaven = ((Number(uitgaven) / Number(bedragtot)) * 100).toFixed(1)
dit.procent(uitgaven > 0 ? uitgaven + '%' : '')
}
}
}
function fAddUitgavetype(k){
@@ -39,6 +89,10 @@ ls.initBestemmingenModel = function(){
this.bedrag = ko.observable(k.bedrag);
this.formatted = ko.observable(parseFloat(k.bedrag).format(2,3,'.',','));
if (parseFloat(k.bedrag) <= 0) this.formatted('');
this.budget = ko.observable(k.budget);
this.budgetFormat = ko.observable(parseFloat(k.budget).format(2,3,'.',','));
if (parseFloat(k.budget) <= 0) this.budgetFormat('');
this.kleur =ko.observable('#000000');
}
@@ -51,9 +105,8 @@ ls.initBestemmingenModel = function(){
kalenderjaren : ko.observableArray([]),
selectedKalenderjaar : ko.observable(),
jaartoewijzing : ko.observable(),
targetjaar : ko.observable(2017), //het jaar waarin met moet werken
targetjaar : ko.observable(2017), //het jaar waarin met moet werken
uitgavetypes : ko.observableArray(),
basissoorten : ko.observableArray(),
extrasoorten : ko.observableArray(),
@@ -64,7 +117,11 @@ ls.initBestemmingenModel = function(){
extrageopend : ko.observable(false),
totaalextra : ko.observable(),
totaalbasis : ko.observable(),
totaalbasis : ko.observable(0),
gebudgetbasis : ko.observable(0),
budgetUnformatted : ko.observable(0),
gebudgetextra : ko. observable(),
initBindings :function(){
var self = ls.BestemmingenModel;
@@ -101,57 +158,271 @@ ls.initBestemmingenModel = function(){
fGetBestemmingen: function(){
var self = ls.BestemmingenModel;
if (!self.selectedKalenderjaar()) return;
self.basissoorten.removeAll();
self.extrasoorten.removeAll();
var sd ={jaarnr:self.selectedKalenderjaar().jaarnr}
$.post("index.php/monfin2/bestemmingen/getBestemmingen", sd, function(data){
if (data.jaartoewijzing){
if (data.jaartoewijzing){
self.jaartoewijzing(data.jaartoewijzing);
}
else {self.jaartoewijzing(false);}
self.jaarclosed(data.jaarclosed);
self.basissoorten.removeAll();
if (data.basisbestemmingen){
$.each(data.basisbestemmingen,function(j,k){
self.basissoorten.push(new fAddBasissoort(k));
});
}
self.extrasoorten.removeAll();
if (data.extrabestemmingen){
$.each(data.extrabestemmingen,function(j,k){
self.extrasoorten.push(new fAddBasissoort(k));
});
}
self.opmerking(data.opmerking);
var budget = 0;
var bedrag = 0;
if (data.basisbestemmingen){
$.each(data.basisbestemmingen, function(i, b){
$.each(b.subsoorten, function(x, s){
$.each(s.uitgavetypes, function(z, t){
budget += Number(t.budget);
bedrag += Number(t.bedrag);
} )
} )
})
budget = self.fSetTotalValue(budget);
self.gebudgetbasis(budget);
bedrag = self.fSetTotalValue(bedrag);
self.totaalbasis(bedrag);
var totbudget = self.jaartoewijzing().basis;
$.each(data.basisbestemmingen,function(j,k){
self.basissoorten.push(new fAddBasissoort(j,k, budget, totbudget, bedrag));
});
}
budget = 0;
bedrag = 0;
totbudget = 0;
if (data.extrabestemmingen){
$.each(data.extrabestemmingen, function(i, b){
$.each(b.subsoorten, function(x, s){
$.each(s.uitgavetypes, function(z, t){
budget += Number(t.budget);
bedrag += Number(t.bedrag);
} )
} )
})
budget = self.fSetTotalValue(budget);
self.gebudgetextra(budget);
bedrag = self.fSetTotalValue(bedrag);
self.totaalextra(bedrag);
totbudget = self.jaartoewijzing().extra;
$.each(data.extrabestemmingen,function(j,k){
self.extrasoorten.push(new fAddBasissoort(j, k, budget, totbudget, bedrag));
});
}
self.opmerking(data.opmerking);
},'json');
},
fSaveBedrag:function(){
fSetTotalValue: function(value){
var self = ls.BestemmingenModel;
var bedrag = value;
bedrag = parseFloat(bedrag).format(2, 3, '.', ',');
return bedrag;
},
fSaveBedrag:function(subsoortid, soort){
var self = ls.BestemmingenModel;
if (self.jaarclosed()) return;
var dit = this;
var dit = this;
var uitgave = 0;
var formuitgave = 0;
var totaaluitgaven = 0;
var totaaluitgavenR = 0;
// if( Number(dit.budget()) <= 0){
// apprise("Vul eerst een budget in.")
// return;
// }
var invoer = dit.formatted();
if ( ! invoer) invoer = '0'
invoer = invoer.split('.').join('');
invoer= invoer.replace(',' , '.');
if (isNaN( parseFloat(invoer) ) ) {
return;
}
else {
invoer=parseFloat(invoer)
}
dit.formatted(parseFloat(invoer).format(2,3,'.',','));
if (invoer <= 0) dit.formatted('');
dit.bedrag(invoer);
$.each(soort === 'BASIS' ? self.basissoorten() : self.extrasoorten(), function(i, b){
$.each(b.subsoorten(), function(x, s){
if (s.uitgavetypes()) {
$.each(s.uitgavetypes(), function (i, k) {
totaaluitgaven = Number(totaaluitgaven) + Number(k.bedrag());
});
if(s.subsoortID === subsoortid) {
$.each(s.uitgavetypes(), function (i, k) {
uitgave = Number(uitgave) + Number(k.bedrag());
});
s.totaal(uitgave);
s.formtotaal(parseFloat(uitgave) === 0 ? '' : parseFloat(uitgave).format(2, 3, '.', ','));
}
}
})
})
totaaluitgaven = totaaluitgaven.format(2, 3, '.', ',');
totaaluitgavenR = totaaluitgaven.replace(/[.| ,]/g, '');
$.each(soort === 'BASIS' ? self.basissoorten() : self.extrasoorten(), function(i, b){
$.each(b.subsoorten(), function(x, s){
if (s.uitgavetypes()) {
let procent = 0;
formuitgave = s.formtotaal();
formuitgave = formuitgave.replace(/[.| ,]/g, '');
if (Number(totaaluitgavenR) > 0) procent = ((Number(formuitgave) / Number(totaaluitgavenR)) * 100).toFixed(1)
else formuitgave = 0;
s.procent(Number(totaaluitgavenR) > 0 && Number(procent) > 0 ? procent + '%' : '')
}
})
})
soort === 'BASIS' ? self.totaalbasis(totaaluitgaven): self.totaalextra(totaaluitgaven) ;
invoer = Math.round(invoer * 100) ;
var sd = {'id': dit.finbestemmingID,
'bedrag' : invoer
}
$.post("index.php/monfin2/bestemmingen/updatebedrag", sd);
},
fSaveBudget:function( subsoortid, soort ){
var self = ls.BestemmingenModel;
if (self.jaarclosed()) return;
var dit = this;
var budgetoud = dit.budget();
var budgetoudForm = dit.budget() > 0 ? parseFloat(budgetoud).format(2, 3, '.', ',') : '';
var subbudget = 0;
var subbudgetoud = 0;
var subbudgetForm = '';
var subbudgetFormoud = '';
var totaalgebudget = 0;
var totaalgebudgetR = 0;
var totaalgebudgetRoud = 0;
var totaalgebudgetpct = '';
var totaalgebudgetpctoud = '';
var subbudgetpct = '';
var subbudgetpctoud = '';
var totaalbudget = (soort === 'BASIS' ? self.jaartoewijzing().basis.replace(/[.| ,]/g, '') : self.jaartoewijzing().extra.replace(/[.| ,]/g, ''));
// update budget en budgetformat
var invoer = dit.budgetFormat();
if ( ! invoer) invoer = '0'
invoer = invoer.split('.').join('');
invoer= invoer.replace(',' , '.');
if (isNaN( parseFloat(invoer) ) ) invoer =0;
else invoer = parseFloat(invoer)
dit.budgetFormat(parseFloat(invoer).format(2, 3, '.', ','));
if (invoer <= 0){
dit.budgetFormat(budgetoudForm);
invoer = 0;
return;
}
dit.budget(invoer);
// update subtotalen
$.each(soort === 'BASIS' ? self.basissoorten(): self.extrasoorten(), function(i, b){
$.each(b.subsoorten(), function(x, s){
if (s.uitgavetypes()) {
if (s.subsoortID === subsoortid) {
subbudgetoud = s.subbudget();
subbudgetFormoud= s.subbudgetform();
subbudgetpctoud = s.budgetprocent();
totaalgebudgetpctoud = s.gebudgetprocent();
$.each(s.uitgavetypes(), function (z, k) {
subbudget = Number(subbudget) + Number(k.budget());
});
s.subbudget(subbudget);
if (parseFloat(subbudget) > 0) {
subbudgetForm = parseFloat(subbudget).format(2, 3, '.', ',');
}
s.subbudgetform(Number(subbudget) > 0 ? subbudgetForm : '');
if (Number(subbudget) > 0) {
subbudget = subbudgetForm.replace(/[.| ,]/g, '');
}
subbudgetpct = (Number(totaalbudget) > 0 ? ((Number(subbudget) / Number(totaalbudget)) * 100).toFixed(1) : 0);
subbudgetpct = subbudgetpct.replace('.', ',');
s.budgetprocent(Number(totaalbudget) > 0 ? subbudgetpct + '%' : '')
}
$.each(s.uitgavetypes(), function (z, k) {
totaalgebudget = Number(totaalgebudget) + Number(k.budget());
});
}
})
})
if (parseFloat(totaalgebudget) > 0) {
totaalgebudgetR = parseFloat(totaalgebudget).format(2, 3, '.', ',');
totaalgebudgetR = totaalgebudgetR.replace(/[.| ,]/g, '');
}
totaalgebudgetpct = (Number(totaalgebudgetR) > 0 ? ((Number(subbudget) / Number(totaalgebudgetR)) * 100).toFixed(1) : 0);
totaalgebudgetpct = totaalgebudgetpct.replace('.', ',');
// update procenten
$.each(soort === 'BASIS' ? self.basissoorten(): self.extrasoorten(), function(i, b){
$.each(b.subsoorten(), function(x, s){
if (s.uitgavetypes()) {
if (s.subsoortID === subsoortid) {
s.gebudgetprocent(totaalgebudgetpct + '%' );
}
}
})
})
if(Number(totaalgebudget) > Number(totaalbudget) ){
dit.budgetFormat(budgetoudForm);
dit.budget(budgetoud);
$.each(soort === 'BASIS' ? self.basissoorten(): self.extrasoorten(), function(i, b){
$.each(b.subsoorten(), function(x, s){
if (s.uitgavetypes()) {
if (s.subsoortID === subsoortid) {
s.subbudget(subbudgetoud);
s.subbudgetform(subbudgetFormoud);
s.budgetprocent(subbudgetpctoud);
s.gebudgetprocent(totaalgebudgetpctoud);
}
}
})
})
//hier alle oude waarden invullen
apprise("Het budget overschrijdt het totaalbudget")
return;
}
else {
soort=== 'BASIS' ? self.gebudgetbasis(totaalgebudget): self.gebudgetextra(totaalbudget);
invoer = Math.round(invoer * 100);
var sd = {
'id' : dit.finbestemmingID,
'budget': invoer,
invoer = dit.formatted();
if (invoer <= '' || ! invoer) invoer = '0'
invoer = invoer.split('.').join('');
invoer= invoer.replace(',' , '.');
if (isNaN( parseFloat(invoer) ) ) {
invoer =0;
}
else {
invoer=parseFloat(invoer)
}
dit.formatted(parseFloat(invoer).format(2,3,'.',','));
if (invoer <= 0) dit.formatted('');
dit.bedrag(invoer);
$.post("index.php/monfin2/bestemmingen/updatebudget", sd);
}
},
invoer = Math.round(invoer * 100) ;
var sd = {id : dit.finbestemmingID,
bedrag : invoer}
$.post("index.php/monfin2/bestemmingen/updatebedrag", sd);
},
fToggle: function(wat){
switch(wat){
@@ -160,6 +431,13 @@ ls.initBestemmingenModel = function(){
};// switch
},
fToelichting: function(){
apprise('<p>In de regel <span style="font-style:italic; ">budget</span> geeft het eerste getal de som van het budget weer als percentage van het toaal gebudgetteerde bedrag.</p>' +
'<p>Het tweede getal is de som ban het budget als percentage van het totaal toegewezen budget.</p>' +
'<p>In de regel <span style="font-style:italic; ">uitgave</span> wordt de som van de uitgave weergegeven als percentage van de totale uitgaven.</p>')
},
fSaveOpmerking: function(){
var self= ls.BestemmingenModel;
if (self.jaarclosed()) return;
@@ -175,51 +453,52 @@ ls.initBestemmingenModel = function(){
}
} ; // definition van model
ls.BestemmingenModel.totaalbasis = ko.computed(function(){
var som =0;
var invoer = 0;
if (this.basissoorten()) {
$.each(this.basissoorten(), function(i,p){
if (p.subsoorten()) {
$.each(p.subsoorten(), function(a,b){
$.each(b.uitgavetypes(), function(o,s){
invoer=String(s.bedrag());
invoer= invoer.replace(',' , '');
if (! isNaN(invoer) ) {
invoer=parseFloat(invoer)
invoer = Math.round(invoer * 100) / 100;
som = som + invoer;
}
}); // each uitgavetypes
}); // each subsoorten
} // if subsoorten
}) // each soorten
} // if basissoorten
return som.format(2,3,'.',',');
},ls.BestemmingenModel);
// ls.BestemmingenModel.totaalbasis = ko.computed(function(){
// var som =0;
// var invoer = 0;
// if (this.basissoorten()) {
// $.each(this.basissoorten(), function(i,p){
// if (p.subsoorten()) {
// $.each(p.subsoorten(), function(a,b){
// $.each(b.uitgavetypes(), function(o,s){
// invoer=String(s.bedrag());
// invoer= invoer.replace(',' , '');
// if (! isNaN(invoer) ) {
// invoer=parseFloat(invoer)
// invoer = Math.round(invoer * 100) / 100;
// som = som + invoer;
// }
// }); // each uitgavetypes
//
// }); // each subsoorten
// } // if subsoorten
// }) // each soorten
// } // if basissoorten
// return som.format(2,3,'.',',');
// },ls.BestemmingenModel);
ls.BestemmingenModel.totaalextra = ko.computed(function(){
var som =0;
var invoer = 0;
if (this.extrasoorten()) {
$.each(this.extrasoorten(), function(i,p){
if (p.subsoorten()) {
$.each(p.subsoorten(), function(a,b){
$.each(b.uitgavetypes(), function(o,s){
invoer=String(s.bedrag());
invoer= invoer.replace(',' , '');
if (! isNaN(invoer) ) {
invoer=parseFloat(invoer)
invoer = Math.round(invoer * 100) / 100;
som = som + invoer;
}
}); // each uitgavetypes
}); // each subsoorten
} // if subsoorten
}) // each soorten
} // if basissoorten
return som.format(2,3,'.',',');
},ls.BestemmingenModel);
// ls.BestemmingenModel.totaalextra = ko.computed(function(){
// var som =0;
// var invoer = 0;
// if (this.extrasoorten()) {
// $.each(this.extrasoorten(), function(i,p){
// if (p.subsoorten()) {
// $.each(p.subsoorten(), function(a,b){
// $.each(b.uitgavetypes(), function(o,s){
// invoer=String(s.bedrag());
// invoer= invoer.replace(',' , '');
// if (! isNaN(invoer) ) {
// invoer=parseFloat(invoer)
// invoer = Math.round(invoer * 100) / 100;
// som = som + invoer;
// }
// }); // each uitgavetypes
// }); // each subsoorten
// } // if subsoorten
// }) // each soorten
// } // if basissoorten
// return som.format(2,3,'.',',');
// },ls.BestemmingenModel);
ls.BestemmingenModel.initBindings();
}; // else
@@ -57,21 +57,22 @@ ls.initMonfinOverzicht2Model = function(){
subTot : ko.observable(),
grandTot : ko.observable(),
//schoolbedragen : ko.observableArray([]),
schooltotaal : ko.observable(''),
kalenderjaren : ko.observableArray(),
selectedKalenderjaar : ko.observable(),
zelfjanee : ko.observable('1'),
schooltotaal : ko.observable(''),
kalenderjaren : ko.observableArray(),
selectedKalenderjaar : ko.observable(),
zelfjanee : ko.observable('1'),
opmerking : ko.observable(),
uitgavetypes : ko.observableArray(),
basis : ko.observableArray(),
extra : ko.observableArray(),
basis : ko.observableArray(),
extra : ko.observableArray(),
sombasisperuitgavetype : ko.observableArray(),
somextraperuitgavetype : ko.observableArray(),
somextraperuitgavetype : ko.observableArray(),
totsomperuitgavetype : ko.observableArray(),
basisgeopend : ko.observable(false),
extrageopend : ko.observable(false),
budgetten : ko.observableArray(),
budgetten : ko.observableArray(),
selectedSubsoort : ko.observable(),
initBindings :function(){
var self = ls.MonfinOverzicht2Model;
@@ -106,6 +107,7 @@ ls.initMonfinOverzicht2Model = function(){
var self = ls.MonfinOverzicht2Model;
if (!self.selectedOrg() || !self.selectedKalenderjaar()) return;
if (self.selectedOrg().soort == 4) { self.zelfjanee('1');};
if (self.zelfjanee()==1 || self.selectedOrg().soort==4){
var sd={orgid : self.selectedOrg().id,
@@ -187,6 +189,31 @@ ls.initMonfinOverzicht2Model = function(){
case "EXTRA" : self.extrageopend(! self.extrageopend()); break;
}
},
fToelichting: function(waarop){
var self = ls.MonfinOverzicht2Model;
var message = '';
switch(waarop){
case 'KOSTEN' : message = 'Uitgaven afgerond op hele euros.';
break;
case 'SOM' : message = 'Totale uitgaven afgerond op hele euros.';
break;
case '%BUDGET' : message = 'Uitgaven als percentage van het totale toegewezen budget.';
break;
case '%UITGAVEN' : message = 'Uitgaven als percentage van de totale uitgaven.';
break;
case 'BUDGET' : message = 'Budget afgerond op hele euros. Klik op i in de regel voor een uitsplitsing van het budget.';
break;
case '%GEBUDGET': message ='Budget als percentage van het totaal gebudgetteerde bedrag.';
break;
case '%BUDGET2' : message='Budget als percentage van het totaal toegewezen budget.';
break;
case 'VERSCHIL' : message = 'Het verschil tussen het toegewezen budget en de uitgaven afgerond op hele euros.';
}
apprise(message);
},
fToggleOrg :function(){
this.geopend(!this.geopend());
},
@@ -195,6 +222,39 @@ ls.initMonfinOverzicht2Model = function(){
self.selectedOrg(this);
self.fGetBedragen()
},
fOpenDetails: function(niveau){
var self = ls.MonfinOverzicht2Model;
self.selectedSubsoort('');
switch(niveau){
case 'BASIS' : self.selectedSubsoort(
{'naam' : 'Basisondersteuning gebudgetteerd',
'uitgavetypes' : self.sombasisperuitgavetype()
});
break;
case 'DETAIL': self.selectedSubsoort(this);
break;
case 'EXTRA': self.selectedSubsoort(
{'naam' : 'Extra ondersteuning gebudgetteerd',
'uitgavetypes' : self.totsomperuitgavetype()
});
break;
case 'TOTAAL': self.selectedSubsoort(
{'naam' : 'Totaal gebudgetteerd',
'uitgavetypes' : self.totsomperuitgavetype()
});
break;
}
$("#modFindetails").modal('show');
},
fShowComment: function(){
var self = ls.MonfinOverzicht2Model;
apprise('Het eerste getal is het percentage van de gebudgetteerde interventie ten opzichte van het totaal gebedugetteerde bedrag. ' +
'Het tweede getal is het percentage van de gebudgetteerde interventie ten opzichte van het toegewezen budget.');
},
} ; // definition van model
ls.MonfinOverzicht2Model.initBindings();
}; // elses