// Invoice generator
// Animation scripts
// elements
// function get_elements() {
// buttons
var btn_defaults_inv = document.getElementById("btn_defaults_inv");
var btn_defaults_est = document.getElementById("btn_defaults_est");
var btn_defaults_pay = document.getElementById("btn_defaults_pay");
// form type, type divs
var mycurrency = '';
var currency = document.getElementById("mycurrency");
var div_currency = document.getElementById('div_currency_else');
var currency_else = document.getElementById("currency_else");
var my_type_1 = document.getElementById("my_form_type_1");
var my_type_2 = document.getElementById("my_form_type_2");
var div_inv = document.getElementById("div_INVOICE");
var div_est = document.getElementById("div_ESTIMATE");
var div_pay = document.getElementById("div_PAYMENT-PLAN");
// my business
var my_b_name = document.getElementById('my_b_name');
var my_b_address1 = document.getElementById('my_b_address1');
var my_b_address2 = document.getElementById('my_b_address2');
var my_b_address3 = document.getElementById('my_b_address3');
var my_b_address4 = document.getElementById('my_b_address4');
var my_b_address5 = document.getElementById('my_b_address5');
var my_b_email = document.getElementById('my_b_email');
var my_b_number = document.getElementById('my_b_number');
// my business bank account
var bank_name = document.getElementById('bank_name');
var bank_AC_name = document.getElementById('bank_AC_name');
var bank_AC_no = document.getElementById('bank_AC_no');
var bank_SC = document.getElementById('bank_SC');
// contracted business
var to_b_name = document.getElementById('to_b_name');
var to_b_code = document.getElementById('to_b_code');
var to_b_address1 = document.getElementById('to_b_address1');
var to_b_address2 = document.getElementById('to_b_address2');
var to_b_address3 = document.getElementById('to_b_address3');
var to_b_address4 = document.getElementById('to_b_address4');
var to_b_address5 = document.getElementById('to_b_address5');
var to_b_email = document.getElementById('to_b_email');
var to_b_phone = document.getElementById('to_b_phone');
// client receiving services
var client_name = document.getElementById('client_name');
var client_contact = document.getElementById('client_contact');
var client_address1 = document.getElementById('client_address1');
var client_address2 = document.getElementById('client_address2');
var client_address3 = document.getElementById('client_address3');
var client_address4 = document.getElementById('client_address4');
// invoice
// billable rate and durations
var inv_date = document.getElementById('inv_date');
// var div_inv_goods = document.getElementById('div_inv_goods');
var div_inv_goods = document.getElementById('tbl_inv_goods');
var inv_type_goods = document.getElementById('inv_type_goods');
var inv_goods_n = document.getElementById('inv_goods_n');
var inv_goods_max = 1;
var div_inv_services = document.getElementById('div_inv_services');
// var div_inv_services = document.getElementById('tbl_inv_services');
var inv_type_services = document.getElementById('inv_type_services');
var inv_services_n = document.getElementById('inv_services_n');
var inv_services_max = 1;
var inv_services_children = [1];
var inv_type_both = document.getElementById('inv_type_both');
// estimate
// billable rate and durations
var est_date = document.getElementById('est_date');
// var div_est_goods = document.getElementById('div_est_goods');
var div_est_goods = document.getElementById('tbl_est_goods');
var est_type_goods = document.getElementById('est_type_goods');
var est_goods_n = document.getElementById('est_goods_n');
var est_goods_max = 1;
var div_est_services = document.getElementById('div_est_services');
// var div_est_services = document.getElementById('tbl_est_services');
var est_type_services = document.getElementById('est_type_services');
var est_services_n = document.getElementById('est_services_n');
var est_services_max = 1;
var est_services_children = [1];
var est_type_both = document.getElementById('est_type_both');
// payment plan
var pay_n = document.getElementById('pay_n');
var pay_discretisation = document.getElementById('pay_discretisation');
var div_pay_type = document.getElementById('div_pay_type');
var paytype_linear = document.getElementById('paytype_linear');
var paytype_multiplier = document.getElementById('paytype_multiplier');
var paytype_mult_max = 1
var paytype_random = document.getElementById('paytype_random');
var paytype_random_max = 1
var div_paytype_linear = document.getElementById('div_paytype_linear');
var div_paytype_multiplier = document.getElementById('div_paytype_multiplier');
var div_paytype_random = document.getElementById('div_paytype_random');
var div_payscheme = document.getElementById('div_payscheme');
var div_payscheme_linear = document.getElementById('div_payscheme_linear');
var div_payscheme_multiplier = document.getElementById('div_payscheme_multiplier');
var payscheme_linear = document.getElementById('payscheme_linear');
var payscheme_multiplier = document.getElementById('payscheme_multiplier');
var payscheme_mult_max = 1;
var pay_disc_type_absolute = document.getElementById('pay_disc_type_absolute');
var pay_disc_type_relative = document.getElementById('pay_disc_type_relative');
// }
// get_elements();
//document.onload = function() {
function reload_page() {
// let my_types = ['inv', 'est'];
for (let i = 1; i <= max(inv_services_max, est_services_max); i++) {
change_incremental_phrase('inv', i);
change_incremental_phrase('est', i);
change_rate_discretisation('inv', i);
change_rate_discretisation('est', i);
}
update_pay_durndisc();
show_services('inv');
show_services('est');
show_goods_services('inv');
show_goods_services('est');
show_paytypes();
show_schemes();
update_currency();
change_form_type(1);
}
reload_page();
// toggle_incremental_weeks('inv', 'Yes', 1);
// toggle_incremental_weeks('est', 'Yes', 1);
// element methods
btn_defaults_inv.addEventListener("click", function () {
fill_default();
});
btn_defaults_est.addEventListener("click", function () {
fill_default("ESTIMATE");
});
btn_defaults_pay.addEventListener("click", function () {
fill_default("PAYMENT-PLAN");
});
function change_form_type(input_id) {
let mytype = document.getElementById("my_form_type_" + input_id);
console.log('mytype = ');
console.log(mytype);
set_select(document.getElementById("my_form_type_" + (input_id == 1 ? 2 : 1)), get_select_text(mytype));
let my_options = mytype.getElementsByTagName('option');
if (mytype.value == '0' || mytype.value == '') {
for (let i = 1; i < my_options.length; i++) {
let temp_div = document.getElementById("div_" + my_options[i].innerText);
temp_div.style.display = 'inline-block';
}
} else {
for (let i = 1; i < my_options.length; i++) {
if (mytype.value == i.toString()) {
let temp_div = document.getElementById("div_" + my_options[i].innerText);
temp_div.style.display = 'inline-block';
} else {
let temp_div = document.getElementById("div_" + my_options[i].innerText);
temp_div.style.display = 'none';
}
}
}
}
function store() {
let formtype = get_select_text(my_type_1);
localStorage.setItem('form_type', formtype);
localStorage.setItem('currency', mycurrency);
// Your business
localStorage.setItem('my_b_name', my_b_name.value);
localStorage.setItem('my_b_address1', my_b_address1.value);
localStorage.setItem('my_b_address2', my_b_address2.value);
localStorage.setItem('my_b_address3', my_b_address3.value);
localStorage.setItem('my_b_address4', my_b_address4.value);
localStorage.setItem('my_b_address5', my_b_address5.value);
localStorage.setItem('my_b_email', my_b_email.value);
localStorage.setItem('my_b_number', my_b_number.value);
// Your business' bank
localStorage.setItem('bank_name', bank_name.value);
localStorage.setItem('bank_AC_name', bank_AC_name.value);
localStorage.setItem('bank_AC_no', bank_AC_no.value);
localStorage.setItem('bank_SC', bank_SC.value);
// Recipient business
localStorage.setItem('to_b_name', to_b_name.value);
localStorage.setItem('to_b_code', to_b_code.value);
localStorage.setItem('to_b_address1', to_b_address1.value);
localStorage.setItem('to_b_address2', to_b_address2.value);
localStorage.setItem('to_b_address3', to_b_address3.value);
localStorage.setItem('to_b_address4', to_b_address4.value);
localStorage.setItem('to_b_address5', to_b_address5.value);
localStorage.setItem('to_b_email', to_b_email.value);
localStorage.setItem('to_b_phone', to_b_phone.value);
// Recipient client
localStorage.setItem('client_name', client_name.value);
localStorage.setItem('client_contact', client_contact.value);
localStorage.setItem('client_address1', client_address1.value);
localStorage.setItem('client_address2', client_address2.value);
localStorage.setItem('client_address3', client_address3.value);
localStorage.setItem('client_address4', client_address4.value);
let dogoods, doservices;
switch (formtype) {
case 'INVOICE':
localStorage.setItem('date', inv_date.value);
dogoods = inv_type_goods.checked;
localStorage.setItem('bool_goods', dogoods);
if (dogoods) {
let mygoods_n = [];
let mygoods_q = [];
let mygoods_v = [];
let ngoods = Number(inv_goods_n.value);
localStorage.setItem('goods_n', ngoods.toString())
for (let i = 1; i <= ngoods; i++) {
let si = i.toString();
mygoods_n.push(document.getElementById('inv_name_g' + si).value);
mygoods_q.push(document.getElementById('inv_quantity_g' + si).value);
mygoods_v.push(document.getElementById('inv_value_g' + si).value);
}
localStorage.setObj('mygoods_n', mygoods_n);
localStorage.setObj('mygoods_q', mygoods_q);
localStorage.setObj('mygoods_v', mygoods_v);
}
doservices = inv_type_services.checked;
localStorage.setItem('bool_services', doservices);
if (doservices) {
let nservices = Number(inv_services_n.value);
localStorage.setItem('services_n', nservices.toString());
let rate_disc = [];
// let durn_disc = [];
let rate = [];
let sub_quantity = [];
let description = [];
let quantity = [];
localStorage.setItem('week1', document.getElementById('inv_week1_s1').value);
for (let i = 1; i <= nservices; i++) {
let si = i.toString();
let rate_disc_quantity = document.getElementById('inv_ratedisc_quantity_s' + si).value;
let temp_discrate = get_select_text(document.getElementById('inv_disc_rate_s' + si)).toUpperCase();
if (rate_disc_quantity == "1") {
rate_disc.push([temp_discrate, temp_discrate + 'S']); // + 's'
} else {
let temp = 'x' + rate_disc_quantity + ' ' + temp_discrate + 'S';
rate_disc.push([temp, temp]);
}
rate.push(document.getElementById('inv_rate_s' + si).value);
sub_quantity.push(document.getElementById('inv_sub_quantity_s' + si).value);
description.push([]);
quantity.push([]);
for (let j = 1; j <= Number(sub_quantity[i - 1]); j++) {
let sj = j.toString();
description[i - 1].push(document.getElementById('inv_description_s' + si + '_' + sj).value);
quantity[i - 1].push(document.getElementById('inv_quantity_s' + si + '_' + sj).value);
}
}
localStorage.setObj('ratediscs', rate_disc);
// localStorage.setObj('durndiscs', durn_disc);
localStorage.setObj('rates', rate);
// localStorage.setObj('durn_disc_qs', durn_disc_quantity);
localStorage.setObj('descriptions', description);
localStorage.setObj('quantities', quantity);
localStorage.setObj('subservice_quantities', sub_quantity);
} else {
let temp = document.getElementById('inv_name_g1').value;
localStorage.setItem('week1', temp.substring(0, min(8, temp.length)).toUpperCase());
}
break;
case 'ESTIMATE':
localStorage.setItem('date', est_date.value);
dogoods = est_type_goods.checked;
localStorage.setItem('bool_goods', dogoods);
if (dogoods) {
let mygoods_n = [];
let mygoods_q = [];
let mygoods_v = [];
let ngoods = Number(est_goods_n.value);
localStorage.setItem('goods_n', ngoods.toString())
for (let i = 1; i <= ngoods; i++) {
let si = i.toString();
mygoods_n.push(document.getElementById('est_name_g' + si).value);
mygoods_q.push(document.getElementById('est_quantity_g' + si).value);
mygoods_v.push(document.getElementById('est_value_g' + si).value);
}
localStorage.setObj('mygoods_n', mygoods_n);
localStorage.setObj('mygoods_q', mygoods_q);
localStorage.setObj('mygoods_v', mygoods_v);
}
doservices = est_type_services.checked;
localStorage.setItem('bool_services', doservices);
if (doservices) {
let nservices = Number(est_services_n.value);
localStorage.setItem('services_n', nservices.toString());
let rate_disc = [];
// let durn_disc = [];
let rate = [];
let sub_quantity = [];
let description = [];
let quantity = [];
localStorage.setItem('week1', document.getElementById('est_week1_s1').value);
for (let i = 1; i <= nservices; i++) {
let si = i.toString();
let rate_disc_quantity = document.getElementById('est_ratedisc_quantity_s' + si).value;
let temp_discrate = get_select_text(document.getElementById('est_disc_rate_s' + si)).toUpperCase();
if (rate_disc_quantity == "1") {
rate_disc.push([temp_discrate, temp_discrate + 'S']); // + 's'
} else {
let temp = 'x' + rate_disc_quantity + ' ' + temp_discrate + 'S';
rate_disc.push([temp, temp]);
}
// durn_disc.push(get_select_text(document.getElementById('est_disc_durn_s' + si)));
rate.push(document.getElementById('est_rate_s' + si).value);
sub_quantity.push(document.getElementById('est_sub_quantity_s' + si).value);
description.push([]);
quantity.push([]);
for (let j = 1; j <= Number(sub_quantity[i - 1]); j++) {
let sj = j.toString();
description[i - 1].push(document.getElementById('est_description_s' + si + '_' + sj).value);
quantity[i - 1].push(document.getElementById('est_quantity_s' + si + '_' + sj).value);
}
}
localStorage.setObj('ratediscs', rate_disc);
// localStorage.setObj('durndiscs', durn_disc);
localStorage.setObj('rates', rate);
// localStorage.setObj('durn_disc_qs', durn_disc_quantity);
localStorage.setObj('descriptions', description);
localStorage.setObj('quantities', quantity);
localStorage.setObj('subservice_quantities', sub_quantity);
} else {
let temp = document.getElementById('est_name_g1').value;
localStorage.setItem('week1', temp.substring(0, min(8, temp.length)).toUpperCase());
}
break;
case 'PAYMENT-PLAN':
let npayments = Number(pay_n.value);
localStorage.setItem('payments_n', npayments.toString());
localStorage.setItem('description', document.getElementById('pay_description').value);
localStorage.setItem('week1', localStorage.description.substring(0, min(12, localStorage.description.length)).toUpperCase());
if (paytype_linear.checked) {
localStorage.setItem('paytype', 'linear');
localStorage.setItem('pay_value_unit', document.getElementById('pay_linear_unit').value);
} else if (paytype_multiplier.checked) {
localStorage.setItem('paytype', 'multiplier');
localStorage.setItem('pay_value_unit', document.getElementById('pay_mult_unit').value);
let pay_multiplier = [];
for (let i = 1; i <= npayments; i++) {
let si = i.toString();
pay_multiplier.push(document.getElementById('paytype_mult_' + si).value);
}
localStorage.setObj('multiplier', pay_multiplier);
} else {
localStorage.setItem('paytype', 'random');
let pay_value = [];
for (let i = 1; i <= npayments; i++) {
let si = i.toString();
pay_value.push(document.getElementById('paytype_value_' + si).value);
}
localStorage.setObj('value', pay_value);
}
let date = [date2str(new Date(document.getElementById('pay_date').value))];
let discretisation = get_select_text(pay_discretisation);
let disc_quantity = Number(document.getElementById('pay_disc_quantity').value);
if (payscheme_linear.checked) {
localStorage.setItem('payscheme', 'linear');
if (npayments > 1) {
for (let i = 2; i <= npayments; i++) {
date.push(date2str(increment_date(new Date(date[i - 2]), discretisation, disc_quantity)));
}
}
// payscheme = 'linear';
} else { // if payscheme_multiple.checked
localStorage.setItem('payscheme', 'multiple');
// payscheme = 'multiple';
if (pay_disc_type_absolute.checked) {
for (let i = 1; i <= npayments; i++) {
date.push(date2str(increment_date(new Date(date[0]), discretisation, disc_quantity * document.getElementById('payscheme_mult_' + i.toString()).value)));
}
} else { // relative
for (let i = 1; i <= npayments; i++) {
date.push(date2str(increment_date(new Date(date[i - 1]), discretisation, disc_quantity * document.getElementById('payscheme_mult_' + i.toString()).value)));
}
}
}
localStorage.setItem('disc_quantity', disc_quantity.toString());
localStorage.setItem('discretisation', discretisation);
localStorage.setObj('dates', date);
break;
default:
// error - please select form type
break;
}
// store_btec_invoice(); // used to work for JLR in emergency - test?
}
function increment_date(date0, discretisation, quantity) {
// let y0 = Number(date0.substring(0, 4));
// let m0 = Number(date0.substring(5, 2));
// let d0 = Number(date0.substring(8, 2));
let y0 = date0.getFullYear();
let m0 = date0.getMonth();
let d0 = date0.getDate();
// let new_date = '';
switch (discretisation) {
case 'Year':
return new Date(y0 + quantity, m0, d0);
case 'Month':
return new Date(y0, m0 + quantity, d0);
case 'Week':
return new Date(y0, m0, d0 + quantity * 7);
default: // case 'Day':
return new Date(y0, m0, d0 + quantity);
}
}
function date2str(date_in) {
return date_in.getFullYear().toString() + '-' + (date_in.getMonth() + 1).toString().padStart(2, '0') + '-' + date_in.getDate().toString().padStart(2, '0');
}
Storage.prototype.setObj = function(key, obj) {
return this.setItem(key, JSON.stringify(obj))
}
Storage.prototype.getObj = function(key) {
return JSON.parse(this.getItem(key))
}
function store_btec_invoice() {
localStorage.setItem('rate', document.getElementById('inv_rate_s1').value);
localStorage.setItem('date', inv_date.value);
let nweeks = document.getElementById('inv_durndisc_quantity_s1').value;
localStorage.setItem('nweeks', nweeks);
localStorage.setItem('week1', document.getElementById('inv_ratedisc_quantity_s1').value);
localStorage.setItem('hours1', document.getElementById('inv_quantity_s1_1').value);
if (nweeks > 1) {
localStorage.setItem('hours2', document.getElementById('inv_quantity_s1_2').value);
}
if (nweeks > 2) {
localStorage.setItem('hours3', document.getElementById('inv_quantity_s1_3').value);
}
if (nweeks > 3) {
localStorage.setItem('hours4', document.getElementById('inv_quantity_s1_4').value);
}
if (nweeks == 5) {
localStorage.setItem('hours5', document.getElementById('inv_quantity_s1_5').value);
}
}
function fill_default(mytype = "INVOICE") {
// set_form_type(mytype);
set_select(my_type_1, mytype);
// set_select(my_type_2, mytype); // redundant?
change_form_type(1);
fill_defaults_me();
fill_defaults_JLR();
// fill_defaults_demo();
currency.value = '£';
switch (mytype) {
case "INVOICE":
fill_defaults_inv();
break;
case "ESTIMATE":
fill_defaults_est();
break;
case "PAYMENT-PLAN":
fill_defaults_pay();
break;
}
}
function fill_defaults_me() {
my_b_name.value = "Precision And Research Technology Systems Limited";
my_b_address1.value = "Unit 12a";
my_b_address2.value = 'Somers Road';
my_b_address3.value = 'Rugby';
my_b_address4.value = 'Warwickshire';
my_b_address5.value = 'CV22 7DH';
my_b_email.value = 'edward.middletonsmith@gmail.com';
my_b_number.value = 13587499;
bank_name.value = 'Starling';
bank_AC_name.value = "Precision And Research Technology Systems Limited";
bank_AC_no.value = 40168366;
bank_SC.value = '60-83-71';
}
function fill_defaults_JLR() {
to_b_name.value = 'Contechs Technical Resourcing Limited';
to_b_code.value = 'Contechs';
to_b_address1.value = '2 Sable Court';
to_b_address2.value = 'Southfields Business Park';
to_b_address3.value = 'Basildon';
to_b_address4.value = 'Essex';
to_b_address5.value = "SS15 6SR";
to_b_email.value = 'account@contechs.co.uk';
to_b_phone.value = "01268 582900";
client_name.value = "Jaguar Land Rover";
// Chassis Business Process Analyst
// client_contact.value = "Andrew Coldwell";
// client_contact.value = "Pamela Spencer";
// Component And Systems Software Engineer
client_contact.value = "Simon Bant";
client_address1.value = "Banbury Road";
client_address2.value = "Gaydon";
client_address3.value = "Warwickshire";
client_address4.value = "CV35 0RR";
}
function fill_defaults_demo() {
bank_AC_no.value = 12345678;
bank_SC.value = '01-23-45';
to_b_name.value = 'Company Limited';
to_b_code.value = 'Company';
to_b_address1.value = '123 Road Drive';
to_b_address2.value = 'Company Business Park';
to_b_address3.value = 'Central Region';
to_b_address4.value = 'Greater London';
to_b_address5.value = 'W1 9AA';
to_b_email.value = 'account@company.co.uk';
to_b_phone.value = "01234 567890";
client_name.value = "Company Limited";
client_contact.value = "Mrs. Employer";
client_address1.value = '123 Road Drive';
client_address2.value = 'Company Business Park';
client_address3.value = 'Greater London';
client_address4.value = 'W1 9AA';
}
function clear_me() {
my_b_name.value = "";
my_b_address1.value = "";
my_b_address2.value = '';
my_b_address3.value = '';
my_b_address4.value = '';
my_b_address5.value = '';
my_b_email.value = '';
my_b_number.value = '';
bank_name.value = '';
bank_AC_name.value = "";
bank_AC_no.value = '';
bank_SC.value = '';
}
function clear_recipient() {
to_b_name.value = '';
to_b_code.value = '';
to_b_address1.value = '';
to_b_address2.value = '';
to_b_address3.value = '';
to_b_address4.value = '';
to_b_address5.value = "";
to_b_email.value = '';
to_b_phone.value = "";
client_name.value = "";
client_contact.value = "";
client_address1.value = "";
client_address2.value = "";
client_address3.value = "";
client_address4.value = "";
}
function clear_invest(this_form_type) {
let tft = this_form_type;
document.getElementById(tft + '_date').value = '';
document.getElementById(tft + '_type_goods').checked = false;
document.getElementById(tft + '_type_services').checked = false;
document.getElementById(tft + '_goods_n').value = '1';
document.getElementById(tft + '_name_g1').value = '';
document.getElementById(tft + '_value_g1').value = '';
document.getElementById(tft + '_quantity_g1').value = '';
let goods_max = 0;
switch (tft) {
case 'inv':
goods_max = inv_goods_max;
inv_goods_max = 1;
break;
case 'est':
goods_max = est_goods_max;
est_goods_max = 1;
break;
}
if (goods_max > 1) {
for (let i = 2; i <= goods_max; i++) {
document.getElementById('div_' + tft + '_good_' + i.toString()).remove();
}
}
document.getElementById(tft + '_services_n').value = '1';
set_select(document.getElementById(tft + '_disc_rate_s1'), 'Hour');
document.getElementById(tft + '_ratedisc_quantity_s1').value = '';
document.getElementById(tft + '_rate_s1').value = '0';
set_select(document.getElementById(tft + '_disc_durn_s1'), 'Week');
document.getElementById(tft + '_durndisc_quantity_s1').value = '1';
document.getElementById(tft + '_sub_quantity_s1').value = '1';
document.getElementById(tft + '_increment_yes_s1').checked = true;
document.getElementById(tft + '_increment_no_s1').checked = false;
document.getElementById(tft + '_baseID_s1').value = '';
document.getElementById(tft + '_week1_s1').value = '';
document.getElementById(tft + '_description_s1_1').value = '';
document.getElementById(tft + '_quantity_s1_1').value = '';
let services_max = 0;
let services_children = [];
switch (tft) {
case 'inv':
services_max = inv_services_max;
services_children = inv_services_children;
inv_services_max = 1;
inv_services_children = [1];
break;
case 'est':
services_max = est_services_max;
services_children = est_services_children;
est_services_max = 1;
est_services_children = [1];
break;
}
if (services_max > 1) {
for (let i = 2; i <= services_max; i++) {
document.getElementById('div_' + tft + '_service_' + i.toString()).remove();
}
}
if (services_children[0] > 1) {
for (let i = 2; i <= services_children[0]; i++) {
document.getElementById('div_' + tft + '_service_1_' + i.toString()).remove();
}
}
}
function clear_pay() {
pay_n.value = '';
document.getElementById('pay_description').value = '';
paytype_linear.checked = true;
paytype_multiplier.checked = false;
paytype_random.checked = false;
document.getElementById('pay_linear_unit').value = '';
document.getElementById('pay_date').value = '';
payscheme_linear.checked = true;
payscheme_multiplier.checked = false;
if (paytype_mult_max > 1) {
for (let i = 2; i <= paytype_mult_max; i++) {
document.getElementById('div_payscheme_mult_' + i.toString()).remove();
}
}
set_select(pay_discretisation, 'Month');
document.getElementById('pay_disc_quantity').value = '';
pay_disc_type_absolute.checked = false;
pay_disc_type_relative.checked = false;
document.getElementById('payscheme_mult_1').value = '';
if (payscheme_mult_max > 1) {
for (let i = 2; i <= payscheme_mult_max; i++) {
document.getElementById('div_payscheme_mult_' + i.toString()).remove();
}
}
}
function clear_form() {
clear_me();
clear_recipient();
clear_invest('inv');
clear_invest('est');
clear_pay();
set_select(my_type_1, '-');
// set_select(my_type_2, '-'); // redundant?
reload_page();
}
function fill_defaults_inv() {
// .dispatchEvent(new Event('change'));
let nowtime = new Date(Date.now());
inv_date.value = date2str(new Date(nowtime.getFullYear(), nowtime.getMonth(), -1));
inv_type_goods.checked = false;
inv_type_services.checked = true;
// inv_type_services.dispatchEvent(new Event('change'));
show_goods_services('inv');
// inv_services_max = 1;
// inv_services_children = [1];
inv_services_n.value = "1";
show_services('inv');
document.getElementById('inv_ratedisc_quantity_s1').value = "1";
set_select(document.getElementById('inv_disc_rate_s1'), "Hour");
change_rate_discretisation('inv', 1);
// Chassis Business Process Analyst
// document.getElementById('inv_rate_s1').value = "20.33";
// RADs Software Engineer
document.getElementById('inv_rate_s1').value = "23.94";
document.getElementById('inv_durndisc_quantity_s1').value = "1";
set_select(document.getElementById('inv_disc_durn_s1'), 'Week');
change_rate_discretisation('inv', 1);
document.getElementById('inv_sub_quantity_s1').value = "4";
show_discs('inv', "s", 1, 4);
document.getElementById('inv_increment_yes_s1').checked = true;
toggle_incremental_weeks('inv', 'Yes', 1);
document.getElementById('inv_baseID_s1').value = "Contractor services - week ";
change_incremental_phrase('inv', 1);
document.getElementById('inv_week1_s1').value = "1";
change_incremental_phrase('inv', 1);
for (let i = 1; i <= 4; i++) {
let si = i.toString();
document.getElementById('inv_quantity_s1_' + si).value = "40";
}
update_currency();
}
// function fill_defaults_inv() {
// // .dispatchEvent(new Event('change'));
// let nowtime = new Date(Date.now());
// inv_date.value = date2str(new Date(nowtime.getFullYear(), nowtime.getMonth(), -1));
// inv_type_goods.checked = true;
// show_goods_services('inv');
// // inv_goods_max = 1;
// inv_goods_n.value = "4";
// // inv_goods_n.dispatchEvent(new Event('change'));
// show_goods('inv');
// let names = ['chicken', 'pies', '3d printers', "Tierney's used panties"];
// for (let i = 1; i <= 4; i++) {
// let si = i.toString();
// console.log('si = ' + si);
// document.getElementById('inv_name_g' + si).value = names[i - 1];
// document.getElementById('inv_value_g' + si).value = (5 * i).toString();
// document.getElementById('inv_quantity_g' + si).value = (60 / i).toString();
// }
// inv_type_services.checked = true;
// // inv_type_services.dispatchEvent(new Event('change'));
// show_goods_services('inv');
// // inv_services_max = 1;
// // inv_services_children = [1];
// inv_services_n.value = "2";
// show_services('inv');
// document.getElementById('inv_ratedisc_quantity_s1').value = "1";
// set_select(document.getElementById('inv_disc_rate_s1'), "Day");
// change_rate_discretisation('inv', 1);
// document.getElementById('inv_rate_s1').value = "20.33";
// document.getElementById('inv_durndisc_quantity_s1').value = "6";
// set_select(document.getElementById('inv_disc_durn_s1'), 'Year');
// change_rate_discretisation('inv', 1);
// document.getElementById('inv_sub_quantity_s1').value = "4";
// show_discs('inv', "s", 1, 4);
// document.getElementById('inv_increment_yes_s1').checked = true;
// toggle_incremental_weeks('inv', 'Yes', 1);
// document.getElementById('inv_baseID_s1').value = "Contractor services - year ";
// change_incremental_phrase('inv', 1);
// document.getElementById('inv_week1_s1').value = "1";
// change_incremental_phrase('inv', 1);
// for (let i = 1; i <= 4; i++) {
// let si = i.toString();
// document.getElementById('inv_quantity_s1_' + si).value = "40";
// }
// set_select(document.getElementById('inv_disc_rate_s2'), "Minute");
// change_rate_discretisation('inv', 2);
// document.getElementById('inv_rate_s2').value = "30";
// document.getElementById('inv_durndisc_quantity_s2').value = "3";
// set_select(document.getElementById('inv_disc_durn_s2'), 'Month');
// change_rate_discretisation('inv', 2);
// document.getElementById('inv_sub_quantity_s2').value = "5";
// show_discs('inv', "s", 2, 5);
// document.getElementById('inv_increment_yes_s2').checked = true;
// toggle_incremental_weeks('inv', 'Yes', 2);
// document.getElementById('inv_baseID_s2').value = "Contractor services - month ";
// change_incremental_phrase('inv', 2);
// document.getElementById('inv_week1_s2').value = "9";
// change_incremental_phrase('inv', 2);
// for (let i = 1; i <= 5; i++) {
// let si = i.toString();
// document.getElementById('inv_quantity_s2_' + si).value = "50";
// }
// update_currency();
// }
function fill_defaults_est() {
let nowtime = new Date(Date.now());
est_date.value = date2str(new Date(nowtime.getFullYear(), nowtime.getMonth(), -1));
est_type_goods.checked = true;
show_goods_services('est');
est_goods_n.value = "4";
show_goods('est');
let names = ['Airplanes', 'Seats', 'Turbines', 'Safety manuals']; // ['pork chops', 'juice', 'European children', 'DMT'];
for (let i = 1; i <= 4; i++) {
let si = i.toString();
console.log('si = ' + si);
document.getElementById('est_name_g' + si).value = names[i - 1];
document.getElementById('est_value_g' + si).value = (7 * i).toString();
document.getElementById('est_quantity_g' + si).value = (1200 / i).toString();
}
est_type_services.checked = true;
show_goods_services('est');
est_services_n.value = "2";
show_services('est');
document.getElementById('est_ratedisc_quantity_s1').value = "1";
set_select(document.getElementById('est_disc_rate_s1'), "Minute");
change_rate_discretisation('est', 1);
document.getElementById('est_rate_s1').value = "200";
document.getElementById('est_durndisc_quantity_s1').value = "6";
set_select(document.getElementById('est_disc_durn_s1'), 'Week');
change_rate_discretisation('est', 1);
document.getElementById('est_sub_quantity_s1').value = "3";
show_discs('est', "s", 1, 3);
document.getElementById('est_increment_yes_s1').checked = true;
toggle_incremental_weeks('est', 'Yes', 1);
document.getElementById('est_baseID_s1').value = "Contractor services - week ";
change_incremental_phrase('est', 1);
document.getElementById('est_week1_s1').value = "1";
change_incremental_phrase('est', 1);
for (let i = 1; i <= 3; i++) {
let si = i.toString();
document.getElementById('est_quantity_s1_' + si).value = "19.50";
}
set_select(document.getElementById('est_disc_rate_s2'), "Week");
change_rate_discretisation('est', 2);
document.getElementById('est_rate_s2').value = "35";
document.getElementById('est_durndisc_quantity_s2').value = "3";
set_select(document.getElementById('est_disc_durn_s2'), 'Week');
change_rate_discretisation('est', 2);
document.getElementById('est_sub_quantity_s2').value = "2";
show_discs('est', "s", 2, 2);
document.getElementById('est_increment_yes_s2').checked = true;
toggle_incremental_weeks('est', 'Yes', 2);
document.getElementById('est_baseID_s2').value = "Contractor services - week ";
change_incremental_phrase('est', 2);
document.getElementById('est_week1_s2').value = "15";
change_incremental_phrase('est', 2);
for (let i = 1; i <= 2; i++) {
let si = i.toString();
document.getElementById('est_quantity_s2_' + si).value = "25";
}
update_currency();
}
function fill_defaults_pay() {
// .dispatchEvent(new Event('change'));
pay_n.value = '24'; // redundant
show_payschemes();
document.getElementById('pay_description').value = 'Blackmail Repayments';
paytype_linear.checked = true;
paytype_multiplier.checked = false;
paytype_random.checked = false;
change_paytype('linear');
document.getElementById('pay_linear_unit').value = '200';
let nowtime = new Date(Date.now());
pay_date.value = date2str(new Date(nowtime.getFullYear(), nowtime.getMonth(), -1));
payscheme_linear.checked = false;
payscheme_multiplier.checked = true;
change_payscheme('multiplier');
set_select(pay_discretisation, 'Month');
update_pay_durndisc();
document.getElementById('pay_disc_quantity').value = '1';
pay_disc_type_absolute.checked = false;
pay_disc_type_relative.checked = true;
change_pay_disctype('relative');
for (let i = 1; i <= 24; i++) {
document.getElementById('payscheme_mult_' + i.toString()).value = 1 + ((i - 1) % 3);
}
}
currency.addEventListener('change', function() {
show_currency_else();
// update currency symbols throughout
update_currency();
});
currency_else.addEventListener('change', function() {
show_currency_else();
// update currency symbols throughout
update_currency();
});
function show_currency_else() {
mycurrency = get_select_text(currency);
switch (mycurrency) {
case 'Other':
div_currency.style.display = 'inline-block';
mycurrency = currency_else.value;
break;
default:
div_currency.style.display = 'none';
// mycurrency = get_select_text(currency);
break;
}
}
function update_currency() {
// let mycurrency = currency.value;
mycurrency = currency.value;
// if (mycurrency == '-') {
// mycurrency = '';
// }
// invoice
for (let i = 1; i <= inv_goods_max; i++) {
let si = i.toString();
document.getElementById('inv_value_g' + si).innerText = 'Value [' + mycurrency + ']:';
}
for (let i = 1; i <= inv_services_max; i++) {
let si = i.toString();
let mylabel = document.getElementById('inv_rate_s' + si + '_label');
let temp = mylabel.innerText;
mylabel.innerText = 'Rate [' + mycurrency + temp.substring(temp.indexOf(']'), temp.length);
}
// estimate
for (let i = 1; i <= est_goods_max; i++) {
let si = i.toString();
let mylabel = document.getElementById('est_value_g' + si);
mylabel.innerText = 'Value [' + mycurrency + ']:';
}
for (let i = 1; i <= est_services_max; i++) {
let si = i.toString();
let mylabel = document.getElementById('est_rate_s' + si + '_label');
let temp = mylabel.innerText;
mylabel.innerText = 'Rate [' + mycurrency + temp.substring(temp.indexOf(']'), temp.length);
}
// payment-plan
document.getElementById('pay_linear_unit_label').value = 'Unit payment [' + mycurrency + ']';
document.getElementById('pay_mult_unit_label').value = 'Unit payment [' + mycurrency + ']';
if (paytype_multiplier.checked) {
for (let i = 1; i <= paytype_mult_max; i++) {
let si = i.toString();
document.getElementById('paytype_mult_' + si + '_label').innerText = 'Payment ' + si + ' [' + mycurrency + ']';
}
}
if (paytype_random.checked) {
for (let i = 1; i <= paytype_random_max; i++) {
let si = i.toString();
document.getElementById('paytype_value_' + si + '_label').innerText = 'Payment ' + si + ' [' + mycurrency + ']';
}
}
}
// invoice
function show_services(this_form_type) {
let N = Number(document.getElementById(this_form_type + '_services_n').value);
let services_max = 0;
switch (this_form_type) {
case 'inv':
services_max = inv_services_max;
break;
case 'est':
services_max = est_services_max;
break;
}
if (N > services_max) {
for (let i = services_max + 1; i <= N; i++) {
let si = String(i);
let child_div = document.createElement('div');
// child_div.outerHTML = '
';
child_div.id = 'div_' + this_form_type + '_service_' + si;
// child_div.className = "div_service"; - d
let child_title = document.createElement('label');
child_title.className = 'div_title';
child_title.innerText = 'Service ' + si;
let child_disc_rate_label = document.createElement('label');
// child_disc_rate_label.outerHTML = '
';
child_disc_rate_label.id = this_form_type + '_disc_rate_s' + si + '_label';
child_disc_rate_label.innerText = 'Rate discretisation:';
child_disc_rate_label.className = 'input_label label_title';
let child_disc_durn_label = document.createElement('label');
// child_disc_rate_label.outerHTML = '
';
child_disc_durn_label.id = this_form_type + '_disc_rate_s' + si + '_label';
child_disc_durn_label.innerText = 'Duration discretisation:';
child_disc_durn_label.className = 'input_label label_title';
// let child_break = document.createElement('br');
let child_disc_rate_select = document.createElement('select');
// child_disc_rate_select.outerHTML = '
'
child_disc_rate_select.id = this_form_type + '_disc_rate_s' + si;
let child_disc_durn_select = document.createElement('select');
// child_disc_durn_select.outerHTML = '
'
child_disc_durn_select.id = this_form_type + '_disc_durn_s' + si;
let child_disc_rate_option_min = document.createElement('option');
// child_disc_rate_option_min.outerHTML = '
';
child_disc_rate_option_min.value = 'm';
child_disc_rate_option_min.innerText = 'Minute';
let child_disc_rate_option_hr = document.createElement('option');
// child_disc_rate_option_hr.outerHTML = '
';
child_disc_rate_option_hr.value = 'h';
child_disc_rate_option_hr.innerText = 'Hour';
child_disc_rate_option_hr.selected = true;
let child_disc_rate_option_day = document.createElement('option');
// child_disc_rate_option_day.outerHTML = '
';
child_disc_rate_option_day.value = 'd';
child_disc_rate_option_day.innerText = 'Day';
let child_disc_rate_option_week = document.createElement('option');
// child_disc_rate_option_week.outerHTML = '
';
child_disc_rate_option_week.value = 'w';
child_disc_rate_option_week.innerText = 'Week';
let child_disc_durn_option_day = document.createElement('option');
// child_disc_durn_option_month.outerHTML = '
';
child_disc_durn_option_day.value = 'd';
child_disc_durn_option_day.innerText = 'Day';
let child_disc_durn_option_week = document.createElement('option');
// child_disc_durn_option_month.outerHTML = '
';
child_disc_durn_option_week.value = 'w';
child_disc_durn_option_week.innerText = 'Week';
let child_disc_durn_option_month = document.createElement('option');
// child_disc_durn_option_month.outerHTML = '
';
child_disc_durn_option_month.value = 'M';
child_disc_durn_option_month.innerText = 'Month';
let child_disc_durn_option_year = document.createElement('option');
// child_disc_durn_option_year.outerHTML = '
';
child_disc_durn_option_year.value = 'y';
child_disc_durn_option_year.innerText = 'Year';
child_disc_rate_select.appendChild(child_disc_rate_option_min);
child_disc_rate_select.appendChild(child_disc_rate_option_hr);
child_disc_rate_select.appendChild(child_disc_rate_option_day);
child_disc_rate_select.appendChild(child_disc_rate_option_week);
child_disc_rate_select.onchange = function () {
change_rate_discretisation(this_form_type, i);
};
child_disc_durn_select.appendChild(child_disc_durn_option_day);
child_disc_durn_select.appendChild(child_disc_durn_option_week);
child_disc_durn_select.appendChild(child_disc_durn_option_month);
child_disc_durn_select.appendChild(child_disc_durn_option_year);
child_disc_durn_select.onchange = function () {
change_rate_discretisation(this_form_type, i);
};
let child_disc_rate_quantity_label = document.createElement('label');
// child_disc_rate_quantity_label.outerHTML = '
';
child_disc_rate_quantity_label.id = this_form_type + '_ratedisc_quantity_s' + si + '_label';
child_disc_rate_quantity_label.innerText = 'Quantity of rate discretisations per minimum unit rate:';
child_disc_rate_quantity_label.className = 'input_label label_title';
let child_disc_rate_quantity = document.createElement('input');
// child_disc_rate_quantity.outerHTML = '
';
child_disc_rate_quantity.type = 'number';
child_disc_rate_quantity.id = this_form_type + '_ratedisc_quantity_s' + si;
child_disc_rate_quantity.value = "1";
child_disc_rate_quantity.step = '1';
child_disc_rate_quantity.min = '1';
child_disc_rate_quantity.onchange = function() {
change_rate_discretisation(this_form_type, i);
};
let child_rate_label = document.createElement('label');
// child_rate_label.outerHTML = '
';
child_rate_label.id = this_form_type + '_rate_s' + si + '_label';
child_rate_label.innerText = 'Rate [£ / Hour]';
child_rate_label.className = 'input_label label_title';
let child_rate = document.createElement('input');
// child_rate.outerHTML = '
';
child_rate.type = 'number';
child_rate.id = this_form_type + '_rate_s' + si;
// Chassis Business Process Analyst
// child_rate.placeholder = "20.33";
// RADs Software Engineer
child_rate.placeholder = "23.94";
child_rate.step = '0.001';
child_rate.min = '0';
let child_disc_durn_quantity_label = document.createElement('label');
// child_disc_durn_quantity_label.outerHTML = '
';
child_disc_durn_quantity_label.id = this_form_type + '_durndisc_quantity_s' + si + '_label';
child_disc_durn_quantity_label.innerText = 'Quantity of duration discretisations:';
child_disc_durn_quantity_label.className = 'input_label label_title'
let child_disc_durn_quantity = document.createElement('input');
// child_disc_durn_quantity.outerHTML = '
';
child_disc_durn_quantity.type = 'number';
child_disc_durn_quantity.id = this_form_type + '_durndisc_quantity_s' + si;
child_disc_durn_quantity.placeholder = "4";
child_disc_durn_quantity.step = "0.001";
child_disc_durn_quantity.min = "0.001";
child_disc_durn_quantity.onchange = function() {
show_discs(this_form_type, "s", i, Number(this.value));
};
let child_sub_quantity_label = document.createElement('label');
// child_quantity_label.outerHTML = '
';
child_sub_quantity_label.id = this_form_type + '_sub_quantity_s' + si + '_label';
child_sub_quantity_label.innerText = 'Quantity of billing periods:';
child_sub_quantity_label.className = 'input_label label_title';
let child_sub_quantity = document.createElement('input');
// child_quantity.outerHTML = '
';
child_sub_quantity.type = 'number';
child_sub_quantity.id = this_form_type + '_sub_quantity_s' + si;
child_sub_quantity.onchange = function() {
show_discs(this_form_type, 's', i, Number(this.value));
}
child_sub_quantity.placeholder = "4";
child_sub_quantity.step = "1";
child_sub_quantity.min = "1";
// incremental
let child_incremental_label = document.createElement('label');
child_incremental_label.id = this_form_type + '_incremental_label_s' + si;
child_incremental_label.innerText = 'Incremental duration discretisation IDs:';
child_incremental_label.className = 'input_label label_title';
let child_incremental_check_yes = document.createElement('input');
child_incremental_check_yes.type = 'checkbox';
child_incremental_check_yes.id = this_form_type + '_increment_yes_s' + si;
child_incremental_check_yes.value = "Yes";
child_incremental_check_yes.checked = true;
child_incremental_check_yes.onchange = function () {
toggle_incremental_weeks(this_form_type, 'Yes', i);
};
let child_incremental_check_yes_label = document.createElement('label');
child_incremental_check_yes_label.id = this_form_type + '_increment_yes_s' + si + '_label';
child_incremental_check_yes_label.innerText = "Yes";
child_incremental_check_yes_label.className = 'input_subtitle';
let child_incremental_check_no = document.createElement('input');
child_incremental_check_no.type = 'checkbox';
child_incremental_check_no.id = this_form_type + '_increment_no_s' + si;
child_incremental_check_no.value = "No";
child_incremental_check_no.checked = false;
child_incremental_check_no.onchange = function () {
toggle_incremental_weeks(this_form_type, 'No', i);
};
let child_incremental_check_no_label = document.createElement('label');
child_incremental_check_no_label.id = this_form_type + '_increment_no_s' + si + '_label';
child_incremental_check_no_label.innerText = "No";
child_incremental_check_no_label.className = 'input_subtitle';
let child_div_incremental = document.createElement('div');
child_div_incremental.id = 'div_' + this_form_type + '_incremental_s' + si;
child_div_incremental.className = 'tbl_container';
let child_tbl_incremental = document.createElement('table');
child_tbl_incremental.id = 'tbl_inv_incremental_s' + si;
let child_tr_incremental = document.createElement('tr');
let child_td_incremental_base = document.createElement('td');
let child_div_incremental_base = document.createElement('div');
child_div_incremental_base.className = 'div_input_label';
let child_baseID_label = document.createElement('label');
child_baseID_label.id = this_form_type + '_baseID_s' + si + '_label';
child_baseID_label.innerText = 'Service description base (prefix):';
child_baseID_label.className = 'input_label label_title';
let child_baseID = document.createElement('input');
child_baseID.type = 'text';
child_baseID.id = this_form_type + '_baseID_s' + si;
child_baseID.onchange = function () {
change_incremental_phrase(this_form_type, i);
}
let child_td_incremental_suffix = document.createElement('td');
let child_div_incremental_suffix = document.createElement('div');
child_div_incremental_suffix.className = 'div_input_label';
let child_week1_label = document.createElement('label');
child_week1_label.id = this_form_type + '_week1_s' + si + '_label';
child_week1_label.innerText = 'First week ID:';
child_week1_label.className = 'input_label label_title';
let child_week1 = document.createElement('input');
child_week1.type = 'number';
child_week1.id = this_form_type + '_week1_s' + si;
child_week1.onchange = function () {
change_incremental_phrase(this_form_type, i);
};
child_div_incremental_base.appendChild(child_baseID_label);
child_div_incremental_base.appendChild(child_baseID);
child_td_incremental_base.appendChild(child_div_incremental_base);
child_tr_incremental.appendChild(child_td_incremental_base);
child_div_incremental_suffix.appendChild(child_week1_label);
child_div_incremental_suffix.appendChild(child_week1);
child_td_incremental_suffix.appendChild(child_div_incremental_suffix);
child_tr_incremental.appendChild(child_td_incremental_suffix);
child_tbl_incremental.appendChild(child_tr_incremental);
child_div_incremental.appendChild(child_tbl_incremental);
// bringing it all together
child_div.appendChild(child_title);
child_div.appendChild(document.createElement('br'));
child_div.appendChild(child_disc_rate_label);
child_div.appendChild(document.createElement('br'));
child_div.appendChild(child_disc_rate_select);
child_div.appendChild(document.createElement('br'));
child_div.appendChild(document.createElement('br'));
child_div.appendChild(child_disc_rate_quantity_label);
child_div.appendChild(document.createElement('br'));
child_div.appendChild(child_disc_rate_quantity);
child_div.appendChild(document.createElement('br'));
child_div.appendChild(document.createElement('br'));
child_div.appendChild(child_rate_label);
child_div.appendChild(document.createElement('br'));
child_div.appendChild(child_rate);
child_div.appendChild(document.createElement('br'));
child_div.appendChild(document.createElement('br'));
child_div.appendChild(child_disc_durn_label);
child_div.appendChild(document.createElement('br'));
child_div.appendChild(child_disc_durn_select);
child_div.appendChild(document.createElement('br'));
child_div.appendChild(document.createElement('br'));
child_div.appendChild(child_disc_durn_quantity_label);
child_div.appendChild(document.createElement('br'));
child_div.appendChild(child_disc_durn_quantity);
child_div.appendChild(document.createElement('br'));
child_div.appendChild(document.createElement('br'));
child_div.appendChild(child_sub_quantity_label);
child_div.appendChild(document.createElement('br'));
child_div.appendChild(child_sub_quantity);
child_div.appendChild(document.createElement('br'));
child_div.appendChild(document.createElement('br'));
child_div.appendChild(child_incremental_label);
child_div.appendChild(document.createElement('br'));
child_div.appendChild(child_incremental_check_yes);
child_div.appendChild(child_incremental_check_yes_label);
child_div.appendChild(child_incremental_check_no);
child_div.appendChild(child_incremental_check_no_label);
child_div.appendChild(document.createElement('br'));
child_div.appendChild(document.createElement('br'));
child_div.appendChild(child_div_incremental);
child_div.appendChild(document.createElement('br'));
// child_div.appendChild(child_div_service);
let date_disc = 'week'; // get_select_text(document.getElementById(this_form_type + '_disc_durn_s' + si));
let rate_disc = 'hour'; // get_select_text(document.getElementById(this_form_type + '_disc_rate_s' + si));
child_div.appendChild(create_service_div(this_form_type, si, date_disc, rate_disc));
switch (this_form_type) {
case 'inv':
div_inv_services.appendChild(child_div);
inv_services_children.push(1);
inv_services_max++;
break;
case 'est':
div_est_services.appendChild(child_div);
est_services_children.push(1);
est_services_max++;
break;
}
}
update_currency();
}
for (let i = 1; i <= N; i++) {
document.getElementById('div_' + this_form_type + '_service_' + String(i)).style.display = 'block'; // 'table';
}
if (N < inv_services_max) {
for (let i = N + 1; i <= inv_services_max; i++) {
document.getElementById('div_' + this_form_type + '_service_' + String(i)).style.display = 'none';
}
}
}
function create_service_div(this_form_type, i_str, date_disc, rate_disc) {
let child_div_service = document.createElement('div');
// child_div_service.outerHTML = '
goods_max) {
for (let i = goods_max + 1; i <= N; i++) {
// let child_div = create_good_div(this_form_type, String(i));
let tr_good = create_sub_good_tr(this_form_type, String(i));
switch (this_form_type) {
case 'inv':
div_inv_goods.appendChild(tr_good);
inv_goods_max++;
break;
case 'est':
div_est_goods.appendChild(tr_good);
est_goods_max++;
break;
}
}
update_currency();
}
for (let i = 1; i <= N; i++) {
document.getElementById('tr_' + this_form_type + '_good_' + String(i)).style.display = 'flex';
}
switch (this_form_type) {
case 'inv':
if (N < inv_goods_max && this_form_type == 'inv') {
for (let i = N + 1; i <= inv_goods_max; i++) {
document.getElementById('tr_inv_good_' + String(i)).style.display = 'none';
}
}
break;
case 'est':
if (N < est_goods_max && this_form_type == 'est') {
for (let i = N + 1; i <= est_goods_max; i++) {
document.getElementById('tr_est_good_' + String(i)).style.display = 'none';
}
}
break;
}
}
function create_good_div(this_form_type, i_str) {
let child_div = document.createElement('div');
child_div.id = 'div_' + this_form_type + '_good_' + i_str;
child_div.className = 'div_good tbl_container';
let child_title = document.createElement('label');
child_title.className = 'div_title';
child_title.innerText = 'Good ' + i_str;
let child_table = document.createElement('table');
child_table.id = 'tbl_' + this_form_type + '_good_' + i_str;
// bringing it all together
child_div.appendChild(child_title);
child_div.appendChild(document.createElement('br'));
child_table.appendChild(create_sub_good_tr(this_form_type, i_str));
child_div.appendChild(child_table);
return child_div;
}
function create_sub_good_tr(this_form_type, i_str) {
let el_tr = document.createElement('tr');
el_tr.id = 'tr_' + this_form_type + '_good_' + i_str;
let el_td_heading = document.createElement('td');
// el_td_heading.style.width = '100px';
let el_heading_label = document.createElement('label');
el_heading_label.id = this_form_type + '_heading_g' + i_str + '_label';
el_heading_label.innerText = 'Good ' + i_str;
el_heading_label.className = 'input_label';
el_heading_label.style.whiteSpace = 'nowrap';
let el_td_name = document.createElement('td');
let el_div_name = document.createElement('div');
el_div_name.className = 'div_input_label';
let el_name_label = document.createElement('label');
// el_disc_rate_label.outerHTML = '
';
el_name_label.id = this_form_type + '_name_g' + i_str + '_label';
el_name_label.innerText = 'Name:';
el_name_label.className = 'input_label';
// let el_break = document.createElement('br');
let el_name = document.createElement('input');
// el_disc_rate_quantity.outerHTML = '
';
el_name.type = 'text';
el_name.id = this_form_type + '_name_g' + i_str;
el_name.className = 'input_label';
let el_td_value = document.createElement('td');
let el_div_value = document.createElement('div');
el_div_name.className = 'div_input_label';
let el_value_label = document.createElement('label');
// el_disc_rate_label.outerHTML = '
';
el_value_label.id = this_form_type + '_value_g' + i_str + '_label';
el_value_label.innerText = 'Value [£]:';
el_value_label.className = 'input_label';
// let el_break = document.createElement('br');
let el_value = document.createElement('input');
// el_disc_rate_quantity.outerHTML = '
';
el_value.type = 'number';
el_value.className = 'input_label';
el_value.id = this_form_type + '_value_g' + i_str;
el_value.placeholder = "20000";
el_value.step = '0.01';
let el_td_quantity = document.createElement('td');
let el_div_quantity = document.createElement('div');
el_div_name.className = 'div_input_label';
let el_quantity_label = document.createElement('label');
// el_disc_rate_label.outerHTML = '
';
el_quantity_label.id = this_form_type + '_quantity_g' + i_str + '_label';
el_quantity_label.innerText = 'Quantity of goods:';
el_quantity_label.className = 'input_label';
// let el_break = document.createElement('br');
let el_quantity = document.createElement('input');
// el_disc_rate_quantity.outerHTML = '
';
el_quantity.type = 'number';
el_quantity.id = this_form_type + '_quantity_g' + i_str;
el_quantity.className = 'input_label';
el_quantity.placeholder = "1";
el_quantity.step = '1';
el_quantity.min = '1';
// el_div_heading.appendChild(el_heading_label);
// el_td_heading.appendChild(el_div_heading);
el_td_heading.appendChild(el_heading_label);
el_tr.appendChild(el_td_heading);
el_div_name.appendChild(el_name_label);
el_div_name.appendChild(el_name);
el_td_name.appendChild(el_div_name);
el_tr.appendChild(el_td_name);
el_div_value.appendChild(el_value_label);
el_div_value.appendChild(el_value);
el_td_value.appendChild(el_div_value);
el_tr.appendChild(el_td_value);
el_div_quantity.appendChild(el_quantity_label);
el_div_quantity.appendChild(el_quantity);
el_td_quantity.appendChild(el_div_quantity);
el_tr.appendChild(el_td_quantity);
return el_tr;
}
function change_rate_discretisation(this_form_type, service_index) { // , subservice_index
// FUNCTION
// following change of rate discretisation, update UI
// ARGUMENTS
// string this_form_type - 'inv' or 'est'
// long service_index - index of service within form_type services
// long subservice_index - index of subservice within service within form_type
// OUTPUTS
// METHODS
// console.log('this form type = ' + this_form_type);
// console.log('service index = ' + service_index.toString());
let si = service_index.toString();
// let ssi = subservice_index.toString();
let elem_rate = document.getElementById(this_form_type + '_disc_rate_s' + si);
let rate_quant = document.getElementById(this_form_type + '_ratedisc_quantity_s' + si).value;
let new_rate = get_select_text(elem_rate);
let elem_durn = document.getElementById(this_form_type + '_disc_durn_s' + si);
let new_durn = get_select_text(elem_durn);
let durn_quant = document.getElementById(this_form_type + '_durndisc_quantity_s' + si).value;
let subservice_quantity = Number(document.getElementById(this_form_type + '_sub_quantity_s' + si).value);
// assign rate text
document.getElementById(this_form_type + '_ratedisc_quantity_s' + si + '_label').innerText = 'Quantity of ' + new_rate.toLowerCase() + 's per minimum unit rate:'; // does not work
if (rate_quant == "1") {
document.getElementById(this_form_type + '_rate_s' + si + '_label').innerText = 'Rate [£ / ' + new_rate + ']:';
for (let i = 1; i <= subservice_quantity; i++) {
let sj = String(i);
console.log('si = ' + si + ' + sj = ' + sj);
document.getElementById(this_form_type + '_quantity_s' + si + '_' + sj + '_label').innerText = new_rate + 's worked:';
}
} else {
document.getElementById(this_form_type + '_rate_s' + si + '_label').innerText = 'Rate [£ / ' + rate_quant + ' ' + new_rate + 's]:';
for (let i = 1; i <= subservice_quantity; i++) {
let sj = String(i);
console.log('si = ' + si + ' + sj = ' + sj);
document.getElementById(this_form_type + '_quantity_s' + si + '_' + sj + '_label').innerText = 'x' + rate_quant + ' ' + new_rate + 's worked:';
}
}
document.getElementById(this_form_type + '_durndisc_quantity_s' + si + '_label').innerText = 'Quantity of ' + new_durn.toLowerCase() + 's per billing period:';
if (durn_quant == "1") {
document.getElementById(this_form_type + '_week1_s' + si + '_label').innerText = 'First ' + new_durn.toLowerCase() + ' ID:';
document.getElementById(this_form_type + '_incremental_label_s' + si).innerText = 'Incremental ' + new_durn.toLowerCase() + ' IDs:';
for (let i = 1; i <= subservice_quantity; i++) {
let sj = String(i);
console.log('si = ' + si + ' + sj = ' + sj);
document.getElementById(this_form_type + '_description_s' + si + '_' + sj + '_label').innerText = new_durn + ' ' + sj + ':';
}
} else {
document.getElementById(this_form_type + '_week1_s' + si + '_label').innerText = 'First x' + durn_quant + ' ' + new_durn.toLowerCase() + 's ID:';
document.getElementById(this_form_type + '_incremental_label_s' + si).innerText = 'Incremental x' + durn_quant + ' ' + new_durn.toLowerCase() + 's IDs:';
for (let i = 1; i <= subservice_quantity; i++) {
let sj = String(i);
console.log('si = ' + si + ' + sj = ' + sj);
document.getElementById(this_form_type + '_description_s' + si + '_' + sj + '_label').innerText = 'x' + durn_quant + ' ' + new_durn.toLowerCase() + 's ' + sj + ':';
}
}
// document.getElementById(this_form_type + '_week1_s' + si + '_label').innerText = 'First ' + new_durn.toLowerCase() + ' ID:';
// document.getElementById(this_form_type + '_incremental_label_s' + si).innerText = 'Incremental ' + new_durn.toLowerCase() + ' IDs:';
// for (let i = 1; i <= subservice_quantity; i++) {
// let sj = String(i);
// console.log('si = ' + si + ' + sj = ' + sj);
// document.getElementById('inv_description_s' + si + '_' + sj + '_label').innerText = new_durn + ' ' + sj + ':';
// }
}
function change_incremental_phrase(this_form_type, service_index) {
let si = service_index.toString();
let week1 = Number(document.getElementById(this_form_type + '_week1_s' + si).value);
let baseID = document.getElementById(this_form_type + '_baseID_s' + si).value;
let N;
switch (this_form_type) {
case 'inv':
N = inv_services_children[service_index - 1];
break;
case 'est':
N = est_services_children[service_index - 1];
break;
}
for (let j = 1; j <= N; j++) {
let myphrase = baseID + (week1 + j - 1).toString();
let sj = j.toString();
console.log('si = ' + si + ' + sj = ' + sj);
let my_elem_str = this_form_type + '_description_s' + si + '_' + sj;
console.log('my_elem_str = ' + my_elem_str);
document.getElementById(my_elem_str).value = myphrase;
}
}
function toggle_incremental_weeks(this_form_type, increment, service_index) {
let si = service_index.toString();
let check_yes = document.getElementById(this_form_type + '_increment_yes_s' + si);
let check_no = document.getElementById(this_form_type + '_increment_no_s' + si);
let div_increment = document.getElementById('div_' + this_form_type + '_incremental_s' + si);
switch (increment) {
case 'Yes':
if (check_yes.checked) {
check_no.checked = false;
div_increment.style.display = 'flex';
change_incremental_phrase(this_form_type, service_index);
} else {
check_no.checked = true;
div_increment.style.display = 'none';
}
break;
case 'No':
if (check_no.checked) {
check_yes.checked = false;
div_increment.style.display = 'none';
} else {
check_yes.checked = true;
div_increment.style.display = 'flex';
change_incremental_phrase(this_form_type, service_index);
}
break;
}
}
function show_discs(this_form_type, gvs, index, quantity) {
switch (gvs) {
case "g":
break;
case "s":
let N;
switch (this_form_type) {
case 'inv':
N = inv_services_children[index - 1];
break;
case 'est':
N = est_services_children[index - 1];
break;
}
let si = String(index);
let service_table = document.getElementById('tbl_' + this_form_type + '_service_' + si); //'div_' + this_form_type + '_service_' + si);
console.log('service_table id: ' + 'tbl_' + this_form_type + '_service_' + si);
let date_disc = get_select_text(document.getElementById(this_form_type + '_disc_durn_s' + si));
let rate_disc = get_select_text(document.getElementById(this_form_type + '_disc_rate_s' + si));
if (quantity > N) {
for (let i = N + 1; i <= quantity; i++) {
let sj = String(i);
let child_tr_service = create_sub_service_tr(this_form_type, si, sj, date_disc, rate_disc);
service_table.appendChild(child_tr_service);
switch (this_form_type) {
case 'inv':
inv_services_children[index - 1]++;
break;
case 'est':
est_services_children[index - 1]++;
break;
}
console.log('new service div added');
if (document.getElementById(this_form_type + '_increment_yes_s' + si).checked) {
change_incremental_phrase(this_form_type, index);
}
}
change_rate_discretisation(this_form_type, index);
}
for (let i = 1; i <= quantity; i++) {
// console.log("showing: " + 'tr_' + this_form_type + '_service_' + si + '_' + String(i));
document.getElementById('tr_' + this_form_type + '_service_' + si + '_' + String(i)).style.display = 'table-row';
}
if (quantity < N) {
for (let i = quantity + 1; i <= N; i++) {
document.getElementById('tr_' + this_form_type + '_service_' + si + '_' + String(i)).style.display = 'none';
}
}
break;
}
}
function create_sub_service_tr(this_form_type, i_str, j_str, date_disc, rate_disc) {
let child_tr_service = document.createElement('tr');
child_tr_service.id = 'tr_' + this_form_type + '_service_' + i_str + '_' + j_str;
let child_td_description = document.createElement('td');
let child_div_description = document.createElement('div');
// child_div_service.outerHTML = '
Week 1:';
child_description_label.innerText = date_disc + " " + j_str + ":";
child_description_label.id = this_form_type + '_description_s' + i_str + '_' + j_str + '_label';
child_description_label.className = 'input_label';
let child_description = document.createElement('input');
// child_description.outerHTML = '';
child_description.type = "text";
console.log('creating ' + this_form_type + '_description_s with i_str=' + i_str + ' + j_str=' + j_str);
child_description.id = this_form_type + "_description_s" + i_str + "_" + j_str;
child_description.className = "input_label";
let child_td_quantity = document.createElement('td');
let child_div_quantity = document.createElement('div');
let child_quantity_label = document.createElement('label');
// child_quantity_label.outerHTML = '';
child_quantity_label.id = this_form_type + '_quantity_s' + i_str + '_' + j_str + '_label';
child_quantity_label.innerText = rate_disc + "s worked:";
child_quantity_label.className = 'input_label';
let child_quantity = document.createElement('input');
// child_quantity.outerHTML = '';
child_quantity.type = "number";
child_quantity.id = this_form_type + "_quantity_s" + i_str + "_" + j_str;
child_quantity.className = "input_label";
child_quantity.step = "0.001";
// child_quantity.min = "0.001";
child_div_description.appendChild(child_description_label);
child_div_description.appendChild(child_description);
child_td_description.appendChild(child_div_description);
child_tr_service.appendChild(child_td_description);
child_div_quantity.appendChild(child_quantity_label);
child_div_quantity.appendChild(child_quantity);
child_td_quantity.appendChild(child_div_quantity);
child_tr_service.appendChild(child_td_quantity);
return child_tr_service;
}
function show_goods_services(this_form_type) {
let check_goods = document.getElementById(this_form_type + '_type_goods');
let check_services = document.getElementById(this_form_type + '_type_services');
let div_goods = document.getElementById('div_' + this_form_type + '_goods');
let div_services = document.getElementById('div_' + this_form_type + '_services');
if (check_goods.checked) {
div_goods.style.display = 'inline-block';
} else {
div_goods.style.display = 'none';
}
if (check_services.checked) {
div_services.style.display = 'inline-block';
} else {
div_services.style.display = 'none';
}
}
// estimate
// perfectly encompassed by invoice code?
// payment plan
function show_payschemes() {
let N = Number(pay_n.value);
if (N > 1) {
div_pay_type.style.display = 'inline-block';
show_paytypes(N);
div_payscheme.style.display = 'inline-block';
}
}
function change_paytype(my_paytype) {
let my_this, my_that1, my_that2;
switch (my_paytype) {
case 'linear':
my_this = paytype_linear;
my_that1 = paytype_multiplier;
my_that2 = paytype_random;
break;
case 'multiplier':
my_this = paytype_multiplier;
my_that1 = paytype_linear;
my_that2 = paytype_random;
break;
case 'random':
my_this = paytype_random;
my_that1 = paytype_multiplier;
my_that2 = paytype_linear;
break;
}
if (my_this.checked) {
my_that1.checked = false;
my_that2.checked = false;
} else {
if (!(my_that1.checked || my_that2.checked)) {
my_this.checked = true;
}
}
show_paytypes();
}
function show_paytypes(N = Number(pay_n.value)) {
if (paytype_linear.checked) {
div_paytype_linear.style.display = 'inline-block';
div_paytype_multiplier.style.display = 'none';
div_paytype_random.style.display = 'none';
} else if (paytype_multiplier.checked) {
div_paytype_linear.style.display = 'none';
div_paytype_multiplier.style.display = 'inline-block';
div_paytype_random.style.display = 'none';
if (N > paytype_mult_max) {
for (let i = 1 + paytype_mult_max; i <= N; i++) {
let si = i.toString();
let child_label = document.createElement('label');
// child_label.outerHTML = "";
child_label.id = 'paytype_mult_' + si + '_label';
child_label.innerText = "Payment multiplier " + si + ":";
child_label.className = 'input_label';
let child_input = document.createElement('input');
// child_input.outerHTML = "";
child_input.type = 'number';
child_input.id = 'paytype_mult_' + si;
child_input.value = '1';
child_input.step = '0.001';
div_paytype_multiplier.appendChild(child_label);
div_paytype_multiplier.appendChild(child_input);
div_paytype_multiplier.appendChild(document.createElement('br'));
div_paytype_multiplier.appendChild(document.createElement('br'));
}
paytype_mult_max = N;
} else if (N < paytype_mult_max) {
for (let i = 1; i <= N; i++) {
let si = i.toString();
let element1 = document.getElementById("paytype_mult_" + si + '_label');
element1.style.display = 'inline-block';
let element2 = document.getElementById("paytype_mult_" + si);
element2.style.display = 'inline-block';
}
for (let i = N + 1; i <= paytype_mult_max; i++) {
let si = i.toString();
let element1 = document.getElementById("paytype_mult_" + si + '_label');
element1.style.display = 'none';
let element2 = document.getElementById("paytype_mult_" + si);
element2.style.display = 'none';
}
}
} else {
div_paytype_linear.style.display = 'none';
div_paytype_multiplier.style.display = 'none';
div_paytype_random.style.display = 'inline-block';
if (N > paytype_random_max) {
for (let i = 1 + paytype_random_max; i <= N; i++) {
let si = String(i);
let child_label = document.createElement('label');
// child_label.outerHTML = "";
child_label.id = 'paytype_value_' + si + '_label';
child_label.innerText = "Payment " + si + " [£]:";
child_label.className = 'input_label';
let child_input = document.createElement('input');
// child_input.outerHTML = "";
child_input.type = 'number';
child_input.id = 'paytype_value_' + si;
child_input.placeholder = '10';
child_input.step = '0.01';
div_paytype_random.appendChild(child_label);
div_paytype_random.appendChild(child_input);
div_paytype_random.appendChild(document.createElement('br'));
div_paytype_random.appendChild(document.createElement('br'));
}
update_currency();
paytype_random_max = N;
} else if (N < paytype_random_max) {
for (let i = 1; i <= N; i++) {
let si = i.toString();
let element1 = document.getElementById("label_paytype_value_" + si);
element1.style.display = 'inline-block';
let element2 = document.getElementById("paytype_value_" + si);
element2.style.display = 'inline-block';
}
for (let i = N + 1; i <= paytype_random_max; i++) {
let si = i.toString();
let element1 = document.getElementById("label_paytype_value_" + si);
element1.style.display = 'none';
let element2 = document.getElementById("paytype_value_" + si);
element2.style.display = 'none';
}
}
}
}
function change_pay_disctype(my_disctype) {
let my_this, my_that;
switch (my_disctype) {
case 'absolute':
my_this = pay_disc_type_absolute;
my_that = pay_disc_type_relative;
break;
case 'relative':
my_this = pay_disc_type_relative;
my_that = pay_disc_type_absolute;
break;
}
if (my_this.checked) {
my_that.checked = false;
} else {
if (!my_that.checked) {
my_that.checked = true;
}
}
}
function show_schemes(N = Number(pay_n.value)) {
if (payscheme_linear.checked) {
// div_payscheme_linear.style.display = 'inline-block';
div_payscheme_multiplier.style.display = 'none';
} else { // if (payscheme_multiplier.checked) {
// div_payscheme_linear.style.display = 'none';
div_payscheme_multiplier.style.display = 'inline-block';
if (N > payscheme_mult_max) {
for (let i = 1 + payscheme_mult_max; i <= N; i++) {
let si = String(i);
let child_div = document.createElement('div');
child_div.id = 'div_payscheme_mult_' + si;
let child_label = document.createElement('label');
// child_label.outerHTML = "";
child_label.id = 'payscheme_mult_' + si + '_label';
child_label.innerText = "Payment minimum unit duration multiplier " + si + ":";
child_label.className = 'input_label label_title';
let child_input = document.createElement('input');
// child_input.outerHTML = "";
child_input.type = 'number';
child_input.id = 'payscheme_mult_' + si;
child_input.value = '1';
child_input.step = '1';
child_input.min = '1';
child_div.appendChild(child_label);
child_div.appendChild(document.createElement('br'));
child_div.appendChild(child_input);
child_div.appendChild(document.createElement('br'));
child_div.appendChild(document.createElement('br'));
div_payscheme_multiplier.appendChild(child_div);
div_payscheme_multiplier.appendChild(document.createElement('br'));
div_payscheme_multiplier.appendChild(document.createElement('br'));
}
update_currency();
payscheme_mult_max = N;
} else if (N < payscheme_mult_max) {
for (let i = 1; i <= N; i++) {
document.getElementById("label_payscheme_mult_" + si).style.display = 'inline-block';
document.getElementById("payscheme_mult_" + si).style.display = 'inline-block';
}
for (let i = N + 1; i <= payscheme_mult_max; i++) {
document.getElementById("label_payscheme_mult_" + si).style.display = 'none';
document.getElementById("payscheme_mult_" + si).style.display = 'none';
}
}
}
}
function change_payscheme(my_payscheme) {
let my_this, my_that;
switch (my_payscheme) {
case 'linear':
my_this = payscheme_linear;
my_that = payscheme_multiplier;
break;
case 'multiplier':
my_this = payscheme_multiplier;
my_that = payscheme_linear;
break;
}
if (my_this.checked) {
my_that.checked = false;
} else {
if (!(my_that.checked)) {
my_this.checked = true;
}
}
show_schemes();
}
function max(a, b) {
if (a > b) {
return a;
} else {
return b;
}
}
function min(a, b) {
return -1 * max(-a, -b);
}
function update_pay_durndisc() {
let new_durndisc = get_select_text(pay_discretisation);
document.getElementById('pay_disc_quantity_label').innerText = 'Quantity of ' + new_durndisc.toLowerCase() + 's in minimum unit duration:';
// document.getElementById('pay_disc_type_label').innerText = 'Payment ' + new_durndisc.toLowerCase() + 's in minimum unit duration:';
}
// element interation
function get_select_text(html_elem) {
let my_options = html_elem.getElementsByTagName('option');
let new_text = '';
for (let i = 0; i < my_options.length; i++) {
if (my_options[i].value == html_elem.value) {
console.log('my_options[i].value = ' + my_options[i].value + '= html_elem.value = ' + html_elem.value);
new_text = my_options[i].innerText;
break;
}
}
// console.log(new_text);
return new_text;
}
function set_select(select_elem, new_value) {
let my_options = select_elem.getElementsByTagName('option');
for (let i = 0; i < my_options.length; i++) {
if (new_value == my_options[i].innerText) {
my_options[i].selected = true;
} else {
my_options[i].selected = false;
}
}
}