/* Society Self-Service Copyright © 2018 Yingtong Li (RunasSudo) 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 . */ $('.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 = $(''); totalrow.append($('Less IWT fees:').prop('colspan', args.grid.fields.length - (editing ? 2 : 1))); totalrow.append($('').text('($' + totalIWT.toFixed(2) + ')')); if (editing) { totalrow.append($('')); } $(args.grid._body).find('tr:last').after(totalrow); } var totalrow = $(''); totalrow.append($('Total:').prop('colspan', args.grid.fields.length - (editing ? 2 : 1))); totalrow.append($('').text('$' + (total - totalIWT).toFixed(2))); if (editing) { totalrow.append($('')); } $(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 = $(''); totalrow.append($('Plus emergency fund:').prop('colspan', args.grid.fields.length - (editing ? 2 : 1))); totalrow.append($('').text('$' + (total * emergency_fund_mult).toFixed(2))); if (editing) { totalrow.append($('')); } $(args.grid._body).find('tr:last').after(totalrow); var totalrow = $(''); totalrow.append($('Total:').prop('colspan', args.grid.fields.length - (editing ? 2 : 1))); totalrow.append($('').text('$' + (total * (1 + emergency_fund_mult)).toFixed(2))); if (editing) { totalrow.append($('')); } $(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, }); }