2019-06-19 17:38:20 +10:00
|
|
|
/*
|
|
|
|
Society Self-Service
|
2019-06-19 18:26:34 +10:00
|
|
|
Copyright © 2018-2019 Yingtong Li (RunasSudo)
|
2019-06-19 17:38:20 +10:00
|
|
|
|
|
|
|
This program is free software: you can redistribute it and/or modify
|
|
|
|
it under the terms of the GNU Affero General Public License as published by
|
|
|
|
the Free Software Foundation, either version 3 of the License, or
|
|
|
|
(at your option) any later version.
|
|
|
|
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
GNU Affero General Public License for more details.
|
|
|
|
|
|
|
|
You should have received a copy of the GNU Affero General Public License
|
|
|
|
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
|
|
*/
|
|
|
|
|
|
|
|
$('.ui.accordion').accordion();
|
|
|
|
|
|
|
|
function recalcRevTotal(args) {
|
|
|
|
var total = 0;
|
|
|
|
var totalIWT = 0;
|
|
|
|
for (var row of args.grid.data) {
|
|
|
|
total += row['Unit price'] * row['Units'];
|
|
|
|
if (row['Unit price'] > 0 && row['IWT']) {
|
|
|
|
totalIWT += (row['Unit price'] - (row['Unit price'] - 0.8) / 1.019) * row['Units'];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
$(args.grid._body).find('.totalrow').remove();
|
|
|
|
|
|
|
|
if (totalIWT > 0) {
|
|
|
|
var totalrow = $('<tr class="jsgrid-row totalrow" style="font-style: italic;"></tr>');
|
|
|
|
totalrow.append($('<td class="jsgrid-cell">Less IWT fees:</td>').prop('colspan', args.grid.fields.length - (editing ? 2 : 1)));
|
|
|
|
totalrow.append($('<td class="jsgrid-cell jsgrid-align-right"></td>').text('($' + totalIWT.toFixed(2) + ')'));
|
|
|
|
if (editing) {
|
|
|
|
totalrow.append($('<td class="jsgrid-cell"></td>'));
|
|
|
|
}
|
|
|
|
$(args.grid._body).find('tr:last').after(totalrow);
|
|
|
|
}
|
|
|
|
|
|
|
|
var totalrow = $('<tr class="jsgrid-row totalrow" style="font-weight: bold;"></tr>');
|
|
|
|
totalrow.append($('<td class="jsgrid-cell">Total:</td>').prop('colspan', args.grid.fields.length - (editing ? 2 : 1)));
|
|
|
|
totalrow.append($('<td class="jsgrid-cell jsgrid-align-right"></td>').text('$' + (total - totalIWT).toFixed(2)));
|
|
|
|
if (editing) {
|
|
|
|
totalrow.append($('<td class="jsgrid-cell"></td>'));
|
|
|
|
}
|
|
|
|
$(args.grid._body).find('tr:last').after(totalrow);
|
|
|
|
}
|
|
|
|
|
|
|
|
function recalcExpTotal(args) {
|
|
|
|
var total = 0;
|
|
|
|
for (var row of args.grid.data) {
|
|
|
|
total += row['Unit price'] * row['Units'];
|
|
|
|
}
|
|
|
|
|
|
|
|
$(args.grid._body).find('.totalrow').remove();
|
|
|
|
|
|
|
|
var emergency_fund_mult = 0.05;
|
|
|
|
if ($('#expense_no_emergency_fund').length > 0 && $('#expense_no_emergency_fund').prop('checked')) {
|
|
|
|
emergency_fund_mult = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
var totalrow = $('<tr class="jsgrid-row totalrow" style="font-style: italic;"></tr>');
|
|
|
|
totalrow.append($('<td class="jsgrid-cell">Plus emergency fund:</td>').prop('colspan', args.grid.fields.length - (editing ? 2 : 1)));
|
|
|
|
totalrow.append($('<td class="jsgrid-cell jsgrid-align-right"></td>').text('$' + (total * emergency_fund_mult).toFixed(2)));
|
|
|
|
if (editing) {
|
|
|
|
totalrow.append($('<td class="jsgrid-cell"></td>'));
|
|
|
|
}
|
|
|
|
$(args.grid._body).find('tr:last').after(totalrow);
|
|
|
|
|
|
|
|
var totalrow = $('<tr class="jsgrid-row totalrow" style="font-weight: bold;"></tr>');
|
|
|
|
totalrow.append($('<td class="jsgrid-cell">Total:</td>').prop('colspan', args.grid.fields.length - (editing ? 2 : 1)));
|
|
|
|
totalrow.append($('<td class="jsgrid-cell jsgrid-align-right"></td>').text('$' + (total * (1 + emergency_fund_mult)).toFixed(2)));
|
|
|
|
if (editing) {
|
|
|
|
totalrow.append($('<td class="jsgrid-cell"></td>'));
|
|
|
|
}
|
|
|
|
$(args.grid._body).find('tr:last').after(totalrow);
|
|
|
|
}
|
|
|
|
|
|
|
|
// Allow floats
|
|
|
|
function FloatNumberField(config) {
|
|
|
|
jsGrid.NumberField.call(this, config);
|
|
|
|
}
|
|
|
|
FloatNumberField.prototype = new jsGrid.NumberField({
|
|
|
|
filterValue: function() {
|
|
|
|
return parseFloat(this.filterControl.val());
|
|
|
|
},
|
|
|
|
insertValue: function() {
|
|
|
|
return parseFloat(this.insertControl.val());
|
|
|
|
},
|
|
|
|
editValue: function() {
|
|
|
|
return parseFloat(this.editControl.val());
|
|
|
|
}
|
|
|
|
});
|
|
|
|
jsGrid.fields.float = FloatNumberField;
|
|
|
|
|
|
|
|
function makeGrid() {
|
|
|
|
f = [
|
|
|
|
{ name: 'Description', type: 'text', width: '50%', validate: 'required' },
|
|
|
|
{ name: 'Unit price', type: 'float', width: '12.5%', validate: 'required', itemTemplate: function(value, item) { return '$' + value.toFixed(2); } },
|
|
|
|
{ name: 'Units', type: 'float', width: '12.5%', validate: 'required' },
|
|
|
|
{ name: 'IWT', type: 'checkbox', width: '5%', insertTemplate: function() { var result = jsGrid.fields.checkbox.prototype.insertTemplate.call(this); result.prop('checked', true); return result; } },
|
|
|
|
{ name: 'Total', align: 'right', width: '10%', itemTemplate: function(value, item) { return '$' + (item['Unit price'] * item['Units']).toFixed(2); } },
|
|
|
|
];
|
|
|
|
if (editing) {
|
|
|
|
f.push({ type: 'control', width: '10%', modeSwitchButton: false });
|
|
|
|
}
|
|
|
|
|
|
|
|
$('#revenue_grid').jsGrid({
|
|
|
|
width: '100%',
|
|
|
|
height: editing ? '20em' : 'auto',
|
|
|
|
inserting: editing,
|
|
|
|
editing: editing,
|
|
|
|
noDataContent: editing ? 'No entries. Click the green plus icon at the top right to add a new row.' : 'No entries',
|
|
|
|
data: revenue_data,
|
|
|
|
fields: f,
|
|
|
|
onItemUpdated: recalcRevTotal,
|
|
|
|
onRefreshed: recalcRevTotal,
|
|
|
|
});
|
|
|
|
|
|
|
|
f = [
|
|
|
|
{ name: 'Description', type: 'text', width: '50%', validate: 'required' },
|
|
|
|
{ name: 'Unit price', type: 'float', width: '12.5%', validate: 'required', itemTemplate: function(value, item) { return '$' + value.toFixed(2); } },
|
|
|
|
{ name: 'Units', type: 'float', width: '12.5%', validate: 'required' },
|
|
|
|
{ name: 'Total', align: 'right', width: '10%', itemTemplate: function(value, item) { return '$' + (item['Unit price'] * item['Units']).toFixed(2); } },
|
|
|
|
]
|
|
|
|
if (editing) {
|
|
|
|
f.push({ type: 'control', width: '10%', modeSwitchButton: false });
|
|
|
|
}
|
|
|
|
|
|
|
|
$('#expense_grid').jsGrid({
|
|
|
|
width: '100%',
|
|
|
|
height: editing ? '20em' : 'auto',
|
|
|
|
inserting: editing,
|
|
|
|
editing: editing,
|
|
|
|
noDataContent: editing ? 'No entries. Click the green plus icon at the top right to add a new row.' : 'No entries',
|
|
|
|
data: expense_data,
|
|
|
|
fields: f,
|
|
|
|
onItemUpdated: recalcExpTotal,
|
|
|
|
onRefreshed: recalcExpTotal,
|
|
|
|
});
|
|
|
|
}
|