Files
monpas/public/js/monpas/models/monfin2/bestemmingen.js
T
2023-06-26 13:32:47 +02:00

674 lines
22 KiB
JavaScript

$(function(){
ls.initBestemmingenModel = function(){
var timeout;
function fAddKalenderjaar(p){
this.jaarnr = p.jaarnr;
this.naam = p.naam;
}
function fAddBasissoort(j,k, 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(a, b, totbudget, bedrag, k.categorie));
});
}
}
function fAddSubsoort(a,b, totbudget, totbedrag, categorie) {
var dit = this;
this.subsoortID = b.subsoortID;
this.naam = b.naam;
this.categorie = categorie;
this.bedragpct = ko.observable(0);
this.bedragpctFormat = ko.observable('');
this.budgetpct = ko.observable(0);
this.budgetpctFormat = ko.observable('');
this.uitgavetypes = ko.observableArray([]);
var subbudget = 0;
var subbedrag = 0;
if (b.uitgavetypes || b.uitgavetypes()) {
if (b.uitgavetypes) {
subbudget = b.uitgavetypes[0].budget;
subbedrag = b.uitgavetypes[0].bedrag;
$.each(b.uitgavetypes, function (i, k) {
dit.uitgavetypes.push(new fAddUitgavetype(k));
});
}
if ( Number(totbudget) > 0) {
if(Number(subbudget) > 0) subbudget = subbudget.replace(/[.| ,]/g, '');
var budgettot = totbudget.replace(/[.| ,]/g, '');
var budgetpct = Number(subbudget) / Number(budgettot)
budgetpct = budgetpct * 100
budgetpct = budgetpct.toFixed(1);
dit.budgetpct(budgetpct);
var format = budgetpct.replace('.', ',') + '%'
dit.budgetpctFormat(Number(budgetpct) > 0 ? format : '' );
}
if( Number(totbedrag) > 0) {
if(Number(subbedrag) > 0) subbedrag = subbedrag.replace(/[.| ,]/g, '')
var bedragtot = totbedrag.replace(/[.| ,]/g, '');
var bedragpct = Number(subbedrag) / Number(bedragtot);
bedragpct = bedragpct * 100;
bedragpct = bedragpct.toFixed(1);
dit.bedragpct(bedragpct);
var format2 = bedragpct.replace('.', ',') + '%';
dit.bedragpctFormat(Number(bedragpct) > 0 ? format2 : '' );
}
}
}
function fAddUitgavetype(k){
this.finbestemmingID = k.id;
this.code = k.code;
this.bedrag = ko.observable(0);
this.bedragFormat = ko.observable('');
this.budget = ko.observable(0);
this.budgetFormat = ko.observable('');
if(k.bedrag && Number(k.bedrag) !== 0) {
var bedrag = Math.round(k.bedrag.replace(/[.| ,]/g, '') / 100).toFixed(2);
this.bedrag(bedrag);
bedrag = Number(bedrag).format(2,3,'.',',');
this.bedragFormat(bedrag);
}
if(k.budget && Number(k.budget) !== 0) {
var budget = Math.round(k.budget.replace(/[.| ,]/g, '') / 100).toFixed(2);
this.budget(budget);
budget = Number(budget).format(2,3,'.',',');
this.budgetFormat = ko.observable(budget);
}
}
if (ls.BestemmingenModel !== undefined){
ls.BestemmingenModel.initModel();
}
else {
ls.BestemmingenModel = {
writer : ko.observable(false),
kalenderjaren : ko.observableArray([]),
selectedKalenderjaar : ko.observable(),
jaartoewijzing : ko.observable(),
erIsBudget : ko.observable(false),
targetjaar : ko.observable(2017), //het jaar waarin met moet werken
uitgavetypes : ko.observableArray(),
basissoorten : ko.observableArray(),
extrasoorten : ko.observableArray(),
opmerking : ko.observable(''),
jaarclosed : ko.observable(true),
bezig : ko.observable(false),
basisgeopend : ko.observable(false),
extrageopend : ko.observable(false),
totaalextra : ko.observable(),
totaalbasis : ko.observable(0),
gebudgetbasis : ko.observable(0),
gebudgetbasispct : ko.observable(''),
gebudgetextrapct : ko.observable(''),
totbasispct : ko.observable(''),
totextrapct : ko.observable(''),
budgetUnformatted : ko.observable(0),
gebudgetextra : ko. observable(),
initBindings :function(){
var self = ls.BestemmingenModel;
if (!ko.dataFor(document.getElementById('pagmonfinbestemmingen2')) ) {
ko.applyBindings(ls.BestemmingenModel, document.getElementById("pagmonfinbestemmingen2"));
}
$.post("index.php/monfin2/bestemmingen/getconstants", function(result){
self.writer(result.writer);
if (result.kalenderjaren){
$.each(result.kalenderjaren, function(i,p){
self.kalenderjaren.push(new fAddKalenderjaar(p));
}); // each
self.selectedKalenderjaar(self.kalenderjaren()[0]);
self.targetjaar(result.targetjaar);
};
},'json');
$.post("index.php/monfin2/bestemmingen/getUitgavetypes", function(result){
self.uitgavetypes.removeAll();
self.uitgavetypes(result);
self.initModel();
},'json');
},
initModel: function(){
var self = ls.BestemmingenModel;
},
fGetAllBestemmingen: function(){
var self = ls.BestemmingenModel;
if (!self.selectedKalenderjaar()) return;
self.fGetBestemmingen();
},
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) {
self.jaartoewijzing(data.jaartoewijzing);
}
self.jaarclosed(data.jaarclosed);
self.fUpdateSubbedragen(function (){self.fGetUpdatedBestemmingen()}, data);
},'json')
},
fUpdateSubbedragen: function(callback, data) {
var self = ls.BestemmingenModel;
self.bezig(true);
if (data.basisbestemmingen) {
$.each(data.basisbestemmingen, function (i, b) {
$.each(b.subsoorten, function (x, s) {
if (s.uitgavetypes) {
var subtotaal = Number(s.uitgavetypes[1].bedrag) + Number(s.uitgavetypes[2].bedrag) + Number(s.uitgavetypes[3].bedrag);
subtotaal = subtotaal.format(2, 3, '.', ',');
subtotaal = subtotaal.replace(/[.| ,]/g, '')
var id = s.uitgavetypes[0].id;
var sd = {
'id': id,
'bedrag': subtotaal,
}
$.post("index.php/monfin2/bestemmingen/updatebedrag", sd, function(data){
}, 'json');
}
})
if(i=== data.basisbestemmingen.length -1 ) self.bezig(false);
})
}
if (data.extrabestemmingen) {
$.each(data.extrabestemmingen, function (i, b) {
$.each(b.subsoorten, function (x, s) {
if (s.uitgavetypes) {
var subtotaal = Number(s.uitgavetypes[1].bedrag) + Number(s.uitgavetypes[2].bedrag) + Number(s.uitgavetypes[3].bedrag);
subtotaal = subtotaal.format(2, 3, '.', ',');
subtotaal = subtotaal.replace(/[.| ,]/g, '')
var id = s.uitgavetypes[0].id;
var sd = {
'id': id,
'bedrag': subtotaal
}
$.post("index.php/monfin2/bestemmingen/updatebedrag", sd, function(data){
}, 'json');
}
})
})
}
if(! self.bezig()) if (typeof callback == "function") callback()
},
fGetUpdatedBestemmingen(){
var self = ls.BestemmingenModel;
var budget = 0;
var bedrag = 0;
var totbudget = self.jaartoewijzing().basis
totbudget = totbudget.replace(/[.| ,]/g, '');
var totbasispct = '';
var gebudgetbasispct = '';
var sd ={jaarnr:self.selectedKalenderjaar().jaarnr}
$.post("index.php/monfin2/bestemmingen/getBestemmingen ", sd, function(data) {
if (data.basisbestemmingen){
$.each(data.basisbestemmingen, function(i, b){
$.each(b.subsoorten, function(x, s) {
if (s.uitgavetypes) {
$.each(s.uitgavetypes, function (z, t) {
if (t.code == 'TOTAAL') {
budget += Number(t.budget);
bedrag += Number(t.bedrag);
}
})
}
} )
})
if(Number(totbudget) > 0) {
var bedrag2 = bedrag.format(2, 3, '.', ',');
bedrag2 = bedrag2.replace(/[.| ,]/g, '')
var budget2 = budget.format(2, 3, '.', ',');
budget2 = budget2.replace(/[.| ,]/g, '')
totbasispct = ((bedrag2 / totbudget) * 100).toFixed(1);
totbasispct = totbasispct.replace('.', ',');
gebudgetbasispct = ((budget2/totbudget) * 100).toFixed(1);
gebudgetbasispct = gebudgetbasispct.replace('.', ',');
}
self.totbasispct(totbasispct);
self.gebudgetbasispct(gebudgetbasispct )
budget = self.fSetTotalValue(budget);
self.gebudgetbasis(budget);
bedrag = self.fSetTotalValue(bedrag);
self.totaalbasis(bedrag);
bedrag = bedrag.replace(/[.|,]/g, '');
$.each(data.basisbestemmingen,function(j,k){
self.basissoorten.push(new fAddBasissoort(j,k, totbudget, bedrag));
});
}
budget = 0;
bedrag = 0;
totbudget = 0;
var totextrapct = '';
var gebudgetextrapct = '';
if (data.extrabestemmingen){
$.each(data.extrabestemmingen, function(i, b){
$.each(b.subsoorten, function(x, s){
$.each(s.uitgavetypes, function(z, t){
if(t.code == 'TOTAAL') {
budget += Number(t.budget);
bedrag += Number(t.bedrag);
}
} )
} )
})
totbudget = self.jaartoewijzing().extra;
totbudget = totbudget.replace(/[.| ,]/g, '')
if(Number(totbudget > 0)) {
bedrag2 = bedrag.format(2, 3, '.', ',');
bedrag2 = bedrag2.replace(/[.| ,]/g, '')
budget2 = budget.format(2, 3, '.', ',');
budget2 = budget2.replace(/[.| ,]/g, '')
totextrapct = ((bedrag2 / totbudget) * 100).toFixed(1);
totextrapct = totextrapct.replace('.', ',')
gebudgetextrapct = ((budget2/totbudget) * 100).toFixed(1)
gebudgetextrapct = gebudgetextrapct.replace('.',',');
}
self.totextrapct(totextrapct);
self.gebudgetextrapct(gebudgetextrapct)
budget = self.fSetTotalValue(budget);
self.gebudgetextra(budget);
bedrag = self.fSetTotalValue(bedrag);
self.totaalextra(bedrag);
bedrag = bedrag.replace(/[.|,]/g, '');
$.each(data.extrabestemmingen,function(j,k){
self.extrasoorten.push(new fAddBasissoort(j, k, totbudget, bedrag));
});
}
self.opmerking(data.opmerking);
},'json');
},
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 subtotaal = 0;
var subtotaalForm = '';
var totuitgaven = 0;
var totuitgavenForm = 0;
var uitgavenpct = '0,0';
var subtotID = 0;
var totaalbudget = (soort === 'BASIS' ? self.jaartoewijzing().basis.replace(/[.| ,]/g, '') : self.jaartoewijzing().extra.replace(/[.| ,]/g, ''));
// update bedrag en bedragformat
var invoer = dit.bedragFormat();
if ( ! invoer) invoer = '0'
invoer = invoer.split('.').join('');
invoer= invoer.replace(',' , '.');
if (isNaN( parseFloat(invoer) ) ) invoer = 0;
else invoer = parseFloat(invoer)
if(Number(invoer) > 0) dit.bedragFormat(parseFloat(invoer).format(2, 3, '.', ','));
else dit.bedragFormat('');
dit.bedrag(invoer);
var code = dit.code;
// 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) {
subtotID = s.uitgavetypes()[0].finbestemmingID;
switch(code){
case 'PERSONEEL' : s.uitgavetypes()[0].bedrag(invoer+Number(s.uitgavetypes()[2].bedrag()) +Number(s.uitgavetypes()[3].bedrag()));
break;
case 'MATRIEEL': s.uitgavetypes()[0].bedrag(Number(s.uitgavetypes()[1].bedrag()) +invoer +Number(s.uitgavetypes()[3].bedrag()));
break;
case 'SCHOLING':s.uitgavetypes()[0].bedrag(Number(s.uitgavetypes()[1].bedrag()) +Number(s.uitgavetypes()[2].bedrag()) +invoer);
break;
}
//zonder nullen van centen
if (Number(s.uitgavetypes()[0].bedrag()) > 0) {
subtotaalForm = Number(s.uitgavetypes()[0].bedrag()).format(2, 3, '.', ',');
s.uitgavetypes()[0].bedragFormat(subtotaalForm)
}
}
}
totuitgaven = Number(totuitgaven) + Number(s.uitgavetypes()[0].bedrag());
})
})
if (parseFloat(totuitgaven) > 0) {
totuitgavenForm = parseFloat(totuitgaven).format(2, 3, '.', ',');
totuitgaven = totuitgavenForm.replace(/[.| ,]/g, '');
}
// update procenten en reserve totalen van subsoorten
$.each(soort === 'BASIS' ? self.basissoorten(): self.extrasoorten(), function(i, b){
$.each(b.subsoorten(), function(x, s){
subtotaal = Number(s.uitgavetypes()[0].bedrag());
if (parseFloat(subtotaal) > 0) {
subtotaal = parseFloat(subtotaal).format(2, 3, '.', ',');
subtotaal = subtotaal.replace(/[.| ,]/g, '');
if (Number(totuitgaven) > 0) {
uitgavenpct = ((Number(subtotaal) / Number(totuitgaven)) * 100).toFixed(1);
uitgavenpct = uitgavenpct.replace('.', ',');
s.bedragpctFormat(uitgavenpct + '%');
} else {
s.bedragpct(0);
s.bedragpctFormat('')
}
}
})
})
if(Number(totuitgaven) > 0) {
uitgavenpct = ((Number(totuitgaven) / Number(totaalbudget)) * 100).toFixed(1);
uitgavenpct = uitgavenpct.replace('.', ',');
}
soort ==='BASIS' ? self.totbasispct(uitgavenpct): self.totextrapct(uitgavenpct);
soort=== 'BASIS' ? self.totaalbasis(totuitgavenForm): self.totaalextra(totuitgavenForm);
invoer = Math.round(invoer * 100);
var sd = {
'id' : dit.finbestemmingID,
'bedrag': invoer
}
console.log(sd, 'bedrag')
$.post("index.php/monfin2/bestemmingen/updatebedrag", sd);
var sd2 = {
'id' : subtotID,
'bedrag': subtotaal
}
$.post("index.php/monfin2/bestemmingen/updatebedrag", sd2);
console.log(sd, 'regeltotaal')
},
fSaveBudget: function( subsoortid, soort ){
var self = ls.BestemmingenModel;
if (self.jaarclosed()) return;
var dit = this;
var budgetoud = dit.budget();
var code = dit.code;
var budgetoudForm = Number(dit.budget()) > 0 ? parseFloat(budgetoud).format(2, 3, '.', ',') : '';
var subbudget = 0;
var totaalgebudget = 0;
var totaalgebudgetForm = 0;
var totaalgebudgetpct = 0;
var budgetpct = '';
var totaalbudget = (soort === 'BASIS' ? self.jaartoewijzing().basis.replace(/[.| ,]/g, '') : self.jaartoewijzing().extra.replace(/[.| ,]/g, ''));
var stuurMelding = true;
var restantOud = 0;
var restantOudForm = '';
// 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)
// update budget
$.each(soort === 'BASIS' ? self.basissoorten(): self.extrasoorten(), function(i, b){
$.each(b.subsoorten(), function(x, s){
if (s.uitgavetypes()) {
if (s.subsoortID === subsoortid) {
switch(code){
case 'TOTAAL' : subbudget = Number(s.uitgavetypes()[1].budget()) +Number(s.uitgavetypes()[2].budget()) + Number(s.uitgavetypes()[3].budget());
if(Number(invoer) >= Number(subbudget)) {
dit.budget(invoer);
stuurMelding = false;
}
totaalgebudget = Number(totaalgebudget) +Number(invoer);
break;
case 'PERSONEEL': subbudget = Number(invoer) +Number(s.uitgavetypes()[2].budget()) + Number(s.uitgavetypes()[3].budget());
if(Number(s.uitgavetypes()[0].budget()) >= Number(subbudget)) {
dit.budget(invoer);
stuurMelding = false;
totaalgebudget = Number(totaalgebudget) + Number(s.uitgavetypes()[0].budget())
}
break;
case 'MATERIEEL': subbudget = Number(s.uitgavetypes()[1].budget()) + Number(invoer)+ Number(s.uitgavetypes()[3].budget());
if(Number(s.uitgavetypes()[0].budget()) >= subbudget) {
dit.budget(invoer);
stuurMelding = false;
totaalgebudget = Number(totaalgebudget) + Number(s.uitgavetypes()[0].budget());
}
break;
case 'SCHOLING': subbudget = Number(s.uitgavetypes()[1].budget()) + Number(s.uitgavetypes()[2].budget())+ Number(invoer) ;
if(Number(s.uitgavetypes()[0].budget() >= subbudget)) {
dit.budget(invoer);
stuurMelding = false;
totaalgebudget = Number(totaalgebudget) + Number(s.uitgavetypes()[0].budget())
console.log(subbudget , 'subbudget bij wijzigen scholing')
}
break;
}
restantOud = s.uitgavetypes()[4].budget();
restantOudForm = parseFloat(restantOud).format(2, 3, '.', ',');
if(stuurMelding) {
apprise('Het totaalbudget is kleiner dan de deelbudgetten.');
dit.budgetFormat('');
}
else{
if(Number(invoer) > 0) dit.budgetFormat(parseFloat(invoer).format(2, 3, '.', ','));
else dit.budgetFormat('');
var restant = Number(s.uitgavetypes()[0].budget()) - subbudget;
s.uitgavetypes()[4].budget(restant);
Number(restant) === 0 ? s.uitgavetypes()[4].budgetFormat(''): s.uitgavetypes()[4].budgetFormat(parseFloat(restant).format(2, 3, '.', ','));
}
}
else{
totaalgebudget = Number(totaalgebudget) + Number(s.uitgavetypes()[0].budget());
}
}
})
})
if(stuurMelding) return;
if (parseFloat(totaalgebudget) > 0) {
totaalgebudgetForm = parseFloat(totaalgebudget).format(2, 3, '.', ',');
totaalgebudgetForm = parseFloat(totaalgebudget).format(2, 3, '.', ',');
totaalgebudget = totaalgebudgetForm.replace(/[.| ,]/g, '');
}
//waarden terugzetten als totaal budget wordt overschreden
if(Number(totaalgebudget) > Number(totaalbudget)){
dit.budget(budgetoud);
dit.budgetFormat(budgetoudForm);
//terugzetten restanten
$.each(soort === 'BASIS' ? self.basissoorten(): self.extrasoorten(), function(i, b) {
$.each(b.subsoorten(), function (x, s) {
if (s.uitgavetypes()) {
if (s.subsoortID === subsoortid) {
s.uitgavetypes()[4].budget(restantOud);
s.uitgavetypes()[4].budgetFormat(Number(restantOud) > 0 ? restantOudForm: '');
}
}
})
})
var string = "Het budget overschrijdt het totaalbudget."
if(Number(totaalbudget) ===0) string = 'Er is nog geen budget.'
apprise(string);
return;
}
// update procenten
$.each(soort === 'BASIS' ? self.basissoorten(): self.extrasoorten(), function(i, b){
$.each(b.subsoorten(), function(x, s) {
if (s.uitgavetypes()) {
if (Number(totaalgebudget) > 0) {
var subtotaal = s.uitgavetypes()[0].budget();
subtotaal = parseFloat(subtotaal).format(2, 3, '.', ',')
subtotaal = subtotaal.replace(/[.| ,]/g, '')
budgetpct = subtotaal / totaalbudget;
budgetpct = budgetpct * 100;
budgetpct = budgetpct.toFixed(1)
budgetpct = budgetpct.replace('.', ',')
s.budgetpctFormat(budgetpct + '%');
}
else {
s.budgetpctFormat('');
}
}
})
})
//update totalen
if(Number(totaalgebudget) > 0) {
totaalgebudgetpct = ((Number(totaalgebudget) / Number(totaalbudget)) * 100).toFixed(1);
totaalgebudgetpct = totaalgebudgetpct.replace('.', ',');
totaalgebudgetpct = ' (' + totaalgebudgetpct + '%)'
}
else totaalgebudgetpct = '';
soort=== 'BASIS' ? self.gebudgetbasis(totaalgebudgetForm): self.gebudgetextra(totaalgebudgetForm);
soort ==='BASIS' ? self.gebudgetbasispct(totaalgebudgetpct): self.gebudgetextrapct(totaalgebudgetpct);
invoer = Math.round(invoer * 100);
var sd = {
'id' : dit.finbestemmingID,
'budget': invoer
}
$.post("index.php/monfin2/bestemmingen/updatebudget", sd);
},
fToggle: function(wat){
switch(wat){
case 1:this.basisgeopend(!this.basisgeopend()); break;
case 2:this.extrageopend(!this.extrageopend()); break;
};// switch
},
fToelichting: function(){
apprise(
'<p><span>In de rijen </span><span style="font-style: italic">budget </span><span>geeft het</span> <span style="font-weight: bold">percentage </span><span>het gebugeteerde bedrag uit de kolom TOTAAL weer in verhouding tot het totaalbudget.</span></p>'+
' <p><span>In de rijen </span><span style="font-style: italic">uitgaven </span><span>geeft het</span> <span style="font-weight: bold">percentage </span><span>de uitgaven weer in de kolom TOTAAL in verhouding tot de totale uitgaven.</span></p>'
)
},
fSaveOpmerking: function(){
var self= ls.BestemmingenModel;
if (self.jaarclosed()) return;
if (timeout){
clearTimeout(timeout);
timeout = null;
}
timeout = setTimeout(function(){
var sd = {jaarnr: self.selectedKalenderjaar().jaarnr ,
opmerking: self.opmerking()}
$.post("index.php/monfin2/bestemmingen/saveopmerking", sd);
},500);
}
} ; // definition van model
ls.BestemmingenModel.initBindings();
}; // else
} // function initBestemmingenModel
});