diff --git a/README.md b/README.md index 58beeac..e6d8489 100644 --- a/README.md +++ b/README.md @@ -68,3 +68,10 @@ This section has moved here: [https://facebook.github.io/create-react-app/docs/d ### `npm run build` fails to minify This section has moved here: [https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify](https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify) + + + + +----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +v2a \ No newline at end of file diff --git a/v1a/Logo_Slogan.png b/v1a/Logo_Slogan.png new file mode 100644 index 0000000..2bb9055 Binary files /dev/null and b/v1a/Logo_Slogan.png differ diff --git a/v1a/invoice.html b/v1a/invoice.html new file mode 100644 index 0000000..71a5977 --- /dev/null +++ b/v1a/invoice.html @@ -0,0 +1,30 @@ + + + + + + + + +Invoice +
+ Your browser does not support the HTML5 canvas tag. +
+ + + + +

To export: Print -> Save as PDF with normal A4 settings, except no margins, 1st page only.

+

Or, press the button below to save to your C:\Downloads folder with the name in the textbox.

+
+ + +
+ +
+ Download Invoice! +
+ + + + \ No newline at end of file diff --git a/v1a/mystyle.css b/v1a/mystyle.css new file mode 100644 index 0000000..a86eed1 --- /dev/null +++ b/v1a/mystyle.css @@ -0,0 +1,78 @@ +img.sticky { + position: -webkit-sticky; + position: sticky; + top: 0; + width: 400px; +} + +.extra-info { + display: none; + line-height: 12px; + font-size: 18px; + position: absolute; + top: 500px; + left: 200px; +} + +.extra-info1 { + display: none; + line-height: 12px; + font-size: 18px; + position: absolute; + top: 930px; + left: 200px; +} + +.extra-info2 { + display: none; + line-height: 12px; + font-size: 18px; + position: absolute; + top: 1350px; + left: 200px; +} + +.extra-info3 { + display: none; + line-height: 12px; + font-size: 18px; + position: absolute; + top: 1800px; + left: 200px; +} + +.info:hover .extra-info { + display: block; +} + +.info:hover .extra-info1 { + display: block; +} + +.info:hover .extra-info2 { + display: block; +} + +.info:hover .extra-info3 { + display: block; +} + +.info { + font-size: 20px; + padding-left: 5px; + width: 20px; + border-radius: 15px; +} + +.info:hover { + background-color: white; + padding: 0 0 0 5px; + width: 315px; + text-align: left !important; +} + +chicken { + position:absolute; + left: 100px; + top: 800px; +} diff --git a/v1a/plotting.js b/v1a/plotting.js new file mode 100644 index 0000000..a8f6210 --- /dev/null +++ b/v1a/plotting.js @@ -0,0 +1,605 @@ +// import { PDFDocument } from "pdf-lib"; +var n_pages = 0; +var ha4 = 1123; +var wa4 = 794; +var border = 75; // page border / margins +var margin = 50; // drawing margins +var slabel = margin - 20; // spacing for dimension labels - ~ 10 < margin +var hline = 25; +var canvases = [document.getElementById("canvas_1")]; +var ctxs = [canvases[0].getContext("2d")]; +var myfont = 'arial'; // ToDo +// var url_logo = 'https://github.com/Teddy-1024/Neural_Network/blob/master/Logo.png'; // direct html execution +var url_logo = './Logo.png'; + +// positioning +var h_my_b = 180; +var h_issue = 325; +var h_bank = 420; +var h_billtosite = 560; +var h_tablehead = 800; +var h_row_max = 1050; // update this !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +var max_rows = round_down((h_row_max - h_tablehead) / hline); + +// table columns +var w_tc1 = 120; +var w_tc2 = 420; +var w_tc3 = 520; +var w_tc4 = 620; + +// file storage +let fnm; // = namefile(); +// // console.log(fnm); +// document.getElementById('filename').value = fnm; + +process_localstorage(); + + +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 my_LS_get_obj(key) { + return JSON.parse(localStorage.getItem(key)); +} + +// Template page layout +function plot_page_layout(page_n, form_type) { + // let h0 = (page_n - 1) * ha4; + let i = page_n - 1; + // canvas elements + ctxs[i].beginPath(); + ctxs[i].font = '20px ' + myfont; + ctxs[i].fillText(form_type, border, 100); + // ctxs[i].fillText('ESTIMATE', border, 100); + ctxs[i].font = 'bold 12px ' + myfont; + ctxs[i].fillText('BANK NAME:', border, h_bank); + ctxs[i].fillText('ACCOUNT NAME:', border, h_bank + hline); + ctxs[i].fillText('ACCOUNT NUMBER:', border, h_bank + hline * 2); + ctxs[i].fillText('SORT CODE:', border, h_bank + hline * 3); + ctxs[i].font = 'bold 12px ' + myfont; + ctxs[i].fillText('ISSUE DATE:', wa4 / 2 + margin, h_issue); + ctxs[i].fillText('DUE DATE:', wa4 / 2 + margin, h_issue + hline); + ctxs[i].fillText('REFERENCE:', wa4 / 2 + margin, h_issue + hline * 2); + ctxs[i].font = 'bold 12px ' + myfont; + ctxs[i].fillText('BILL TO:', border, h_billtosite); + ctxs[i].fillText('SITE / LOCATION:', wa4 / 2 + margin, h_billtosite); + ctxs[i].stroke(); +} + +function plot_page_interpersonal(page_n, date_due, my_ref) { + // let h0 = (page_n - 1) * ha4; + let i = page_n - 1; + ctxs[i].font = '14px ' + myfont; + ctxs[i].fillText(localStorage.my_b_name, border, h_my_b ); + ctxs[i].font = '12px ' + myfont; + ctxs[i].fillText(localStorage.my_b_address1, border, h_my_b+hline*1); + ctxs[i].fillText(localStorage.my_b_address2, border, h_my_b+hline*2); + ctxs[i].fillText(localStorage.my_b_address3, border, h_my_b+hline*3); + ctxs[i].fillText(localStorage.my_b_address4, border, h_my_b+hline*4); + ctxs[i].fillText(localStorage.my_b_address5, border, h_my_b+hline*5); + ctxs[i].fillText(localStorage.my_b_email, border, h_my_b+hline*6); + ctxs[i].fillText(localStorage.my_b_number, border, h_my_b+hline*7); + + // logo + var img = new Image(); + img.crossOrigin = "anonymous"; + CORS_ALLOW_ALL_ORIGINS = true; + img.style.border = 'none'; + img.src = url_logo; // "https://raw.githubusercontent.com/Teddy-1024/Neural_Network/master/Deane_logo.png"; + sz_img = 200; + img.onload = function() { + ctxs[i].drawImage(img, wa4 - border * 3 / 2 -sz_img, border, sz_img, sz_img); // , 0, 0, 0, 0, border + 25, border + 2, sz_img, sz_img); + ctxs[i].stroke(); + } + + ctxs[i].font = '12px ' + myfont; + ctxs[i].fillText(localStorage.bank_name, border + 150, h_bank); + ctxs[i].fillText(localStorage.bank_AC_name, border + 150, h_bank + hline); + ctxs[i].fillText(localStorage.bank_AC_no, border + 150, h_bank + hline * 2); + ctxs[i].fillText(localStorage.bank_SC, border + 150, h_bank + hline * 3); + + ctxs[i].font = '12px ' + myfont; + ctxs[i].fillText(localStorage.date, wa4 / 2 + margin + 120, h_issue); + ctxs[i].fillText(date_due, wa4 / 2 + margin + 120, h_issue + hline); + ctxs[i].fillText(my_ref, wa4 / 2 + margin + 120, h_issue + hline * 2); + + ctxs[i].font = '12px ' + myfont; + ctxs[i].fillText(localStorage.to_b_name, border, h_billtosite+hline*1); + ctxs[i].fillText(localStorage.to_b_address1, border, h_billtosite+hline*2); + ctxs[i].fillText(localStorage.to_b_address2, border, h_billtosite+hline*3); + ctxs[i].fillText(localStorage.to_b_address3, border, h_billtosite+hline*4); + ctxs[i].fillText(localStorage.to_b_address4, border, h_billtosite+hline*5); + ctxs[i].fillText(localStorage.to_b_address5, border, h_billtosite+hline*6); + ctxs[i].fillText(localStorage.to_b_email, border, h_billtosite+hline*7); + ctxs[i].fillText(localStorage.to_b_phone, border, h_billtosite+hline*8); + + ctxs[i].fillText(localStorage.client_contact, wa4/2 + margin, h_billtosite+hline*1); + ctxs[i].fillText(localStorage.client_name, wa4/2 + margin, h_billtosite+hline*2); + ctxs[i].fillText(localStorage.client_address1, wa4/2 + margin, h_billtosite+hline*3); + ctxs[i].fillText(localStorage.client_address2, wa4/2 + margin, h_billtosite+hline*4); + ctxs[i].fillText(localStorage.client_address3, wa4/2 + margin, h_billtosite+hline*5); + ctxs[i].fillText(localStorage.client_address4, wa4/2 + margin, h_billtosite+hline*6); + ctxs[i].stroke(); +} + +function round_down(quotient) { + let temp = quotient % 1; + return quotient - temp; +} + +function round_up(quotient) { + let temp = quotient % 1; + if (temp == 0) { + return quotient; + } + return 1 + quotient - temp; +} + +function plot_line_gs(description, quantity, rate, subtotal, h, page_i) { + let i = page_i - 1; + ctxs[i].font = '12px ' + myfont; + ctxs[i].fillText(description, w_tc1, h); + ctxs[i].fillText(quantity, w_tc2, h); + ctxs[i].fillText(rate, w_tc3, h); + ctxs[i].fillText(subtotal, w_tc4, h); +} + +function plot_line_pp(description, date, value, h, page_i) { + let i = page_i - 1; + ctxs[i].font = '12px ' + myfont; + ctxs[i].fillText(description, w_tc1, h); + ctxs[i].fillText(date, (w_tc2 + w_tc3) / 2, h); + ctxs[i].fillText(value, w_tc4, h); +} + +function plot_table_headings_payplan(h, page_i) { + let i = page_i - 1; + let currency = localStorage.getItem('currency'); + ctxs[i].font = 'bold 12px ' + myfont; + ctxs[i].fillText('DESCRIPTION', w_tc1 + 20, h); + ctxs[i].fillText('DATE', (w_tc2 + w_tc3 + 25) / 2, h); + ctxs[i].fillText('VALUE [' + currency + ']', w_tc4 - 16, h); + // latinum conversion rates + // 500 .bars, 10,000 .strips, 1,000,000 .slips + +} + +function plot_table_headings_invest(ratedisc, h, page_i) { + let i = page_i - 1; + let currency = localStorage.getItem('currency'); + ctxs[i].font = 'bold 12px ' + myfont; + ctxs[i].fillText('DESCRIPTION', w_tc1 + 30, h); + if (ratedisc[0] == 'Unit cost') { + ctxs[i].fillText('QUANTITY', w_tc2 - 20, h); + ctxs[i].fillText('UNIT COST [' + currency + ']', w_tc3 - 12, h); + } else { + ctxs[i].fillText(currency + ' / ' + ratedisc[0], w_tc3 - 12, h); + ctxs[i].fillText('# ' + ratedisc[1], w_tc2 - 20, h); + } + ctxs[i].fillText('SUBTOTAL', w_tc4-10, h); + // latinum conversion rates + // 500 .bars, 10,000 .strips, 1,000,000 .slips + +} + +function plot_subtotal(tot, h, page_i) { + let i = page_i - 1; + ctxs[i].font = '12px ' + myfont; + ctxs[i].fillText('£ ' + tot.toFixed(2), w_tc4 - 10, h); + ctxs[i].font = 'bold 12px ' + myfont; + ctxs[i].fillText('TOTAL:', w_tc4 - border - 10, h); +} + +function plot_invest(form_type, do_goods, rows_g, n_goods, do_services, rows_s, n_services, n_subs, ratedisc, date_due, my_ref) { + let txt_base_border = 0.5 * hline; + let min_table_delta = 2 * hline + txt_base_border; + let max_table_height = 1000; + // // ctx.beginPath(); + // ctx.font = '20px ' + myfont; + // ctx.fillText(form_type, border, 100); + let n_plotted = 0; + let page_i = 0; + // let h0 = (page_i - 1) * ha4; + let h1 = 0; + // ctx.font = '12px ' + myfont; + let subtotal; + // goods + if (do_goods) { + subtotal = 0; + for (let row_i = 0; row_i < n_goods; row_i++) { + h1 = h_tablehead + (row_i - n_plotted) * hline; + if (row_i % max_rows == 0) { + page_i++; + n_plotted = row_i - 1; + // h0 = (page_i - 1) * ha4; + // plot new page + // ctxs[page_i - 1].font = '20px ' + myfont; + // ctxs[page_i - 1].fillText(form_type, border, 100); + ctxs[page_i - 1].font = '12px ' + myfont; + plot_page_layout(page_i, form_type); + plot_page_interpersonal(page_i, date_due, my_ref); + plot_table_headings_invest(['Unit cost'], h_tablehead, page_i); + } + h1 = h_tablehead + (row_i - n_plotted) * hline; + plot_line_gs(rows_g[row_i][0], rows_g[row_i][1], rows_g[row_i][2], rows_g[row_i][3], h1, page_i); + subtotal += Number( rows_g[row_i][3]); + } + // output subtotal + h1 += hline; + plot_subtotal(subtotal, h1, page_i); + } + // services + if (do_services) { + if (!do_goods) { + page_i++; + h1 = h_tablehead; + ctxs[0].font = '12px ' + myfont; + plot_page_layout(page_i, form_type); + plot_page_interpersonal(page_i, date_due, my_ref); + } + for (let i = 0; i < n_services; i++) { + subtotal = 0; + if (max_table_height - min_table_delta < h1) { + // new page, reset start height + page_i++; + // h0 = (page_i - 1) * ha4; + h1 = h_tablehead; + // plot new page + // ctxs[page_i - 1].font = '20px ' + myfont; + // ctxs[page_i - 1].fillText(form_type, border, 100); + ctxs[page_i - 1].font = '12px ' + myfont; + plot_page_layout(page_i, form_type); + plot_page_interpersonal(page_i, date_due, my_ref); + } else { + h1 += hline * 1.2; + } + // plot table headings + plot_table_headings_invest(ratedisc[i], h1, page_i); + // plot rows + for (let j = 0; j < n_subs[i]; j++) { + h1 += hline; + if (max_table_height - txt_base_border < h1) { + // new page, reset start height + page_i++; + // h0 = (page_i - 1) * ha4; + h1 = h_tablehead; + // plot new page + plot_page_layout(page_i, form_type); + plot_page_interpersonal(page_i, date_due, my_ref); + plot_table_headings_invest(ratedisc[i], h1, page_i); + h1 += hline; + } + // plot row + plot_line_gs(rows_s[i][j][0], rows_s[i][j][1], rows_s[i][j][2], rows_s[i][j][3], h1, page_i); + subtotal += Number(rows_s[i][j][3]); + } + // output subtotal + h1 += hline; + plot_subtotal(subtotal, h1, page_i); + } + } + if (page_i < n_pages) { + let canvas_container = document.getElementById('parent_canvases'); + for (let i = page_i + 1; i <= n_pages; i++) { + canvas_container.removeChild(document.getElementById('canvas_' + i)); + } + n_pages = page_i; + } +} + +function plot_payplan(rows_p, n_pay, my_ref) { + let txt_base_border = 0.5 * hline; + let min_table_delta = 1 * hline + txt_base_border; + let max_table_height = 1000; + // ctx.beginPath(); + // ctx.font = '20px ' + myfont; + // ctx.fillText('PAYMENT-PLAN', border, 100); + let n_plotted = 0; + let page_i = 0; + // let h0 = (page_i - 1) * ha4; + let h1; + // ctx.font = '12px ' + myfont; + let subtotal = 0; + // goods + if (n_pay >= 1) { + for (let row_i = 0; row_i < n_pay; row_i++) { + h1 = h_tablehead + (row_i - n_plotted) * hline; + if (row_i % max_rows == 0) { + page_i++; + // h0 = (page_i - 1) * ha4; + n_plotted = row_i - 1; + // plot new page + plot_page_layout(page_i, 'PAYMENT-PLAN'); + plot_page_interpersonal(page_i, rows_p[n_pay - 1][1], my_ref); + plot_table_headings_payplan(h_tablehead, page_i); + } + h1 = h_tablehead + (row_i - n_plotted) * hline; + plot_line_pp(rows_p[row_i][0], rows_p[row_i][1], rows_p[row_i][2], h1, page_i); + subtotal += Number(rows_p[row_i][2]); + } + // output subtotal + h1 += hline; + plot_subtotal(subtotal, h1, page_i); + } + // ctx.stroke(); +} + +// borders +// ctx.strokeStyle = "blue"; +// ctx.fillRect(margin, margin, wa4 - 2 * (border - margin - 5), border - margin - 5); +// ctx.fillRect(margin, ha4 - margin, wa4 - 2 * (border - margin - 5), border - margin - 5); +// ctx.stroke(); + +function create_canvases(quantity) { + if (quantity > 1) { + let div_parent = document.getElementById('parent_canvases'); + for (let i = 2; i <= quantity; i++) { + let new_canvas = document.createElement('canvas'); + new_canvas.id = 'canvas_' + i.toString(); + new_canvas.width = wa4; + new_canvas.height = ha4; + new_canvas.style.border = 'none'; + new_canvas.style.margin = 'auto'; + new_canvas.innerText = 'Your browser does not support the HTML5 canvas tag.'; + div_parent.appendChild(new_canvas); + canvases.push(new_canvas); + ctxs.push(canvases[i - 1].getContext('2d')); + } + } +} + +function namefile(form_type, my_ref, date_due = '') { + let svname; + switch (form_type) { + case 'PAYMENT-PLAN': + svname = 'Payment-Plan_' + my_ref + '_' + date_due; + break; + default: + // let endweek = Number(localStorage.week1) + Number(localStorage.nweeks - 1); + // svname = 'Invoice_Contechs_00-J55589_' + localStorage.date.substr(2, 2) + '_wks_'; + // svname = svname.concat(localStorage.week1); + // svname = svname.concat('-'); + // svname = svname.concat(endweek); + + // Chassis Business Process Analyst 00-J55589 + // svname = form_type.charAt(0) + form_type.substring(1, form_type.length).toLowerCase() + '_Contechs_00-J55589_' + my_ref; + // RADs Software Engineer 00-J56557 + // svname = form_type.charAt(0) + form_type.substring(1, form_type.length).toLowerCase() + '_Contechs_00-J56557_' + my_ref; + svname = "file_reference" + break; + } + document.getElementById('filename').value = svname; + return svname; +} + +function imgclick(canvas_i) { // download file! + const { + jsPDF + } = window.jspdf; + const pdf = new jsPDF(); + const imgData = canvases[canvas_i].toDataURL("image/png", 1.0); + pdf.addImage(imgData, 'PNG', 0, 0); + + pdf.save(document.getElementById('filename').value + '_' + (canvas_i + 1).toString()); + // mailsend(pdf); +} + +function download_pdfs(download_type = 'separate') { + // download type = 'together' (default) or 'separate' + // switch (download_type) { + // case 'separate': + for (let i = 0; i < n_pages; i++) { + imgclick(i); + } + // break; + // default: + // const { + // jsPDF + // } = window.jspdf; + // const doc = new jsPDF(); + // const arrayBuffer = doc.output('arraybuffer'); + // let pdf_list = []; + // for (let canvas_i = 0; canvas_i < n_pages; canvas_i++) { + // const pdf = new jsPDF(); + // const imgData = canvases[canvas_i].toDataURL("image/png", 1.0); + // pdf.addImage(imgData, 'PNG', 0, 0); + // } + // let merged_pdf = mergePdfs(pdf_list); + // merged_pdf.save(document.getElementById('filename').value); + // break; + // } +} + +// async function mergePdfs(pdfsToMerges) { // : ArrayBuffer[] +// const mergedPdf = await PDFDocument.create(); +// const actions = pdfsToMerges.map(async pdfBuffer => { +// const pdf = await PDFDocument.load(pdfBuffer); +// const copiedPages = await mergedPdf.copyPages(pdf, pdf.getPageIndices()); +// copiedPages.forEach((page) => { +// // console.log('page', page.getWidth(), page.getHeight()); +// // page.setWidth(210); +// mergedPdf.addPage(page); +// }); +// }); +// await Promise.all(actions); +// const mergedPdfFile = await mergedPdf.save(); +// return mergedPdfFile; +// } + +function gen_inv_ID(companycode, week1, weekn, date) { + let year = date.substr(2, 2);// date.getFullYear(); + let name = year + "_wks_" + week1 + "-" + weekn; + return name; +} + +function gen_date_due(date0) { + let date_0 = new Date(date0); + let y0 = date_0.getFullYear(); + let m0 = date_0.getMonth(); + // let d0 = date0.getDate(); + // let month = Number(date.substr(5, 2)); + // let year = Number(date.substr(0, 4)); + let date_1 = new Date(y0, m0 + 2, 1); + // if (month >= 11) { + // year = year + 1; + // month = month - 10; + // } else { + // month = month + 2; + // } + let n_working_days = 1; + let n_days_total = 4; + let date_temp = date_1; + for (let i = 1; i < 6; i++) { + date_temp.setDate(date_temp.getDate() + 1); + let billday = date_temp.getDay(); + if (!(billday == 0 || billday == 6)) { + n_working_days++; + } + if (n_working_days == n_days_total) { + break; + } + } + let date_2 = date_temp; + return date2str(date_2); + // for (let i = 0; i < 6; i++) { + // billday = i + 1; + // let tempbilldate = new Date(year.toString() + '-' + month.toString().padStart(2, '0') + '-' + billday.toString().padStart(2, '0')); + // let tempbillday = tempbilldate.getDay(); // {Sunday - Saturday = 0 - 6} + // if (!(tempbillday == 0 || tempbillday == 6)) { + // n_working_days++; + // } + // if (n_working_days == n_days_total) { + // break; + // } + // } + // return year.toString() + '-' + month.toString().padStart(2, '0') + '-' + billday.toString().padStart(2, '0'); +} + +function date2str(date_in) { + return date_in.getFullYear().toString() + '-' + (date_in.getMonth() + 1).toString().padStart(2, '0') + '-' + date_in.getDate().toString().padStart(2, '0'); +} + +function process_localstorage() { + // find form type and get rows + let form_type = localStorage.getItem('form_type'); + console.log('form type = ' + form_type); + switch (form_type) { + case 'PAYMENT-PLAN': + let n_pay = Number(localStorage.getItem('payments_n')); + let paytype = localStorage.getItem('paytype'); + let values = []; + let dates = []; + let rows_p = []; + switch (paytype) { + case 'linear': + values.push(localStorage.getItem('pay_value_unit')); + if (n_pay > 1) { + for (let i = 1; i < n_pay; i++) { + values.push(values[0]); + } + } + break; + case 'multiplier': + let value_0 = Number(localStorage.getItem('pay_value_unit')); + let multipliers = my_LS_get_obj('multiplier'); + if (n_pay > 1) { + for (let i = 0; i < n_pay; i++) { + values.push((value_0 * multipliers[i]).toString()); + } + } + break; + case 'random': + let randoms = my_LS_get_obj('value'); + if (n_pay > 1) { + for (let i = 0; i < n_pay; i++) { + values.push(randoms[i]); + } + } + break; + } + let description = localStorage.getItem('description'); + // let discretisation = localStorage.getItem('discretisation'); + // let payscheme = localStorage.getItem('payscheme'); + let dates_in = my_LS_get_obj('dates'); + // let disc_quantity = Number(localStorage.getItem('disc_quantity')); + for (let i = 0; i < n_pay; i++) { + dates.push(date2str(new Date(dates_in[i]))); + } + for (let i = 0; i < n_pay; i++) { + rows_p.push([description, dates[i], values[i]]); + } + n_pages = round_up(n_pay / max_rows) + // canvas.height = ha4 * n_pages; + fnm = namefile(form_type, localStorage.week1, dates[0]); + create_canvases(n_pages); + plot_payplan(rows_p, n_pay, localStorage.week1); + break; + default: // case 'INVOICE' || 'ESTIMATE': + let inv_ref = gen_inv_ID(localStorage.to_b_code, localStorage.week1, String(Number(localStorage.week1) + Number(localStorage.subservice_quantities.substring(2, localStorage.subservice_quantities.substring(2).indexOf('"') + 2)) - 1), localStorage.date); + let date_due = gen_date_due(localStorage.date); + let rows_g = []; + let nrows_g = 0; + let goods_n = 0; + let rows_s = []; + // let n_services = 0; + let services_n; + let n_subs = []; + // let durnrates = []; + let do_goods = localStorage.getItem('bool_goods') == 'true'; + if (do_goods) { + goods_n = Number(localStorage.getItem('goods_n')); + let mygoods_n = my_LS_get_obj('mygoods_n'); + let mygoods_q = my_LS_get_obj('mygoods_q'); + let mygoods_v = my_LS_get_obj('mygoods_v'); + for (let i = 1; i <= goods_n; i++) { + nrows_g++; + rows_g.push([mygoods_n[i - 1], mygoods_q[i - 1], mygoods_v[i - 1], (Number(mygoods_v[i - 1]) * Number(mygoods_q[i - 1])).toFixed(2)]); + } + n_pages = round_up(goods_n / max_rows); + } + let do_services = localStorage.getItem('bool_services') == 'true'; + let ratediscs; + // let durndiscs; + if (do_services) { + // n_services = 1; + services_n = Number(localStorage.getItem('services_n')); + ratediscs = my_LS_get_obj('ratediscs'); + // durndiscs = my_LS_get_obj('durndiscs'); + let rates = my_LS_get_obj('rates'); + // let durn_disc_qs = my_LS_get_obj('durn_disc_qs'); + let description = my_LS_get_obj('descriptions'); + let quantities = my_LS_get_obj('quantities'); + let subservice_quantities = my_LS_get_obj('subservice_quantities'); + for (let i = 1; i <= services_n; i++) { + // let my_serve = -1; + // for (let j = 0; j < n_subs[i - 1]; j++) { + // if (durnrates[j][0] == durndiscs[i - 1] && durnrates[j][1] == ratediscs[i - 1]) { + // my_serve = j; + // break; + // } + // } + // if (my_serve == -1) { + // my_serve = n_services - 1; + n_subs.push(0); + // durnrates.push([durndiscs[i - 1], ratediscs[i - 1]]); + rows_s.push([]); + // n_services++; + // } + for (let j = 1; j <= Number(subservice_quantities[i - 1]); j++) { + n_subs[i - 1]++; + rows_s[i - 1].push([description[i - 1][j - 1], quantities[i - 1][j - 1], rates[i - 1], (Number(quantities[i - 1][j - 1]) * Number(rates[i - 1])).toFixed(2)]); + } + n_pages += round_up(n_subs[i - 1] / max_rows); + } + + } + // canvas.height = ha4 * n_pages; + fnm = namefile(form_type, inv_ref); + create_canvases(n_pages); + plot_invest(form_type, do_goods, rows_g, goods_n, do_services, rows_s, services_n, n_subs, ratediscs, date_due, inv_ref); + break; + } +} \ No newline at end of file diff --git a/v1a/scripts.js b/v1a/scripts.js new file mode 100644 index 0000000..993d68c --- /dev/null +++ b/v1a/scripts.js @@ -0,0 +1,1872 @@ +// 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; + } + } +} \ No newline at end of file diff --git a/v1a/stylesheet.css b/v1a/stylesheet.css new file mode 100644 index 0000000..d761fdb --- /dev/null +++ b/v1a/stylesheet.css @@ -0,0 +1,145 @@ +body { + background-color: lightpink; + font-family: "Arial, Helvetica, sans-serif"; +} + +div { + width: 100%; + display: inline-block; +} + +/* Inputs */ +input, button { + margin: 5px; + height: 4vh; + width: 20vw; + border-radius: 1vh; + border-color: darkviolet; + padding: 3px 10px 3px; +} + +select { + height: 3vh; + width: 100px; + border-radius: 1vh; + border-width: 2px; + border-color: darkviolet; + padding: 3px 10px 3px; +} + + +datalist { + + /* display: flex; + display: block; + position: relative; */ +} +option { + border-color: darkviolet; +} + +input[type="text"] { + border-radius: 1vh; +} + +input[type="number"] { + width: 3vw; +} + +input[type="date"] { + width: 8vw; +} + +input[type="checkbox"] { + -moz-appearance:none; + -webkit-appearance:none; + -o-appearance:none; + outline: none; + content: none; + width: 50px; +} +input[type="checkbox"]:before { + width: 30px; + height: 30px; + content: '✓'; + font-size: 20px; + font-style: bold; + text-align: center; + border-radius: 5px; + border: 2px solid darkviolet; + background-color: white; + color: transparent; + display: inline-block; + margin-top: 0px; + margin-bottom: 20px; +} +input[type="checkbox"]:checked:before { + color: black; +} + + +/* Labels */ +label { + margin: 5px; +} + +.div_title { + font-size: 24px; +} + +.input_title { + font-size: 20px; +} + +.input_subtitle { + font-size: 18px; +} + +.errmsg { + display: none; + visibility: hidden; +} + + + +/* table */ +.div_label_input { + margin: auto; + width: 100%; + display: flex; + flex-wrap: wrap; + justify-content: center; +} + +.input_label { + box-sizing: border-box; + flex: 1; + margin: 1rem; + padding: 1rem; + border-radius: 5px; + width: 100%; +} + +.input_label.label_title { + margin: 0; + padding: 0; + font-size: 20px; +} + +.tbl_container { + display: flex; + flex-wrap: flex; + justify-content: center; +} + +label.input_label { + padding-left: 5% !important; + padding-right: 5% !important; +} + +.column { + align-items: center; + flex: 1; + display: flex; + flex-direction: column; +} \ No newline at end of file diff --git a/v1a/userin.html b/v1a/userin.html new file mode 100644 index 0000000..51043a8 --- /dev/null +++ b/v1a/userin.html @@ -0,0 +1,745 @@ + + + + + + + +
+
+
+ + +
+ +
+
+ + + +
+
+ + +
+
+
+ + + +
+ +
+ + +
+ + +
+ + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + +
+
+ + +
+
+
+ + +
+
+
+ + +
+
+
+ + +
+
+
+ + +
+
+
+ + +
+
+
+ + +
+
+
+ + +
+
+
+ + +
+
+
+ + +
+
+
+ +
+
+ +
+
+ + + + + + + + + +
+
+ + +
+
+
+ + +
+
+
+ + +
+
+
+ + +
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + +
+
+ + +
+
+
+ + +
+
+
+ + +
+
+
+ + +
+
+
+ + +
+
+
+ + +
+
+
+ + +
+
+
+ + +
+
+
+ + +
+
+
+ + +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + +
+
+ + +
+
+
+ + +
+
+
+ + +
+
+
+ + +
+
+
+ + +
+
+
+ + +
+
+
+ + +
+
+
+ + +
+
+
+
+
+ +
+
+
+

+
+ + + + + +

+
+
+
+

+
+ + + + + + + + + +
+ + +
+ + +
+
+
+ + +
+
+
+ + +
+
+
+
+
+
+
+
+

+
+
+
+

+
+ +

+
+

+ +
+

+
+ +

+
+ +

+
+ + + +

+
+ + + + + +
+
+ + +
+
+
+ + +
+
+
+ +
+
+ +
+ + + + + + + +
+
+ + +
+
+
+ + +
+
+
+
+
+
+ +
+
+ +
+
+
+

+
+ + + + +

+
+
+
+

+
+ + + + + + + + + +
+ + +
+ + +
+
+
+ + +
+
+
+ + +
+
+
+
+
+
+
+
+

+
+
+
+

+
+ +

+
+

+ +
+

+
+ +

+
+ +

+
+ + + +

+
+ + + + + +
+
+ + +
+
+
+ + +
+
+
+
+ + + + + + + +
+
+ + +
+
+
+ + +
+
+
+
+
+
+

+
+
+
+

+
+

+
+
+ + + + + + +
+ +
+

+
+

+
+ +
+
+
+

+
+

+
+ +
+

+
+

+
+ +
+

+ +
+
+ + + + + +
+
+
+

+ +
+

+ + +
+
+ + + + +

+
+
+

+
+
+
+
+ +
+
+ + +
+ +
+
+ + + +
+
+ + + +
+
+ + +
+
+

+
+
+ + + \ No newline at end of file