From e738bd897b138e998cd2523ae4e8262cc9c34239 Mon Sep 17 00:00:00 2001 From: Kilian Saffran Date: Sat, 5 Dec 2020 07:27:59 +0100 Subject: [PATCH] v20201204 --- desktopapp/css/app.css | 6 + desktopapp/dialogs/InvoiceBooking.html | 4 - desktopapp/dialogs/MailTemplate.html | 54 +++++++ desktopapp/dialogs/hiddenfileupload.html | 6 + desktopapp/index.html | 11 +- desktopapp/js/app.js | 30 ++++ desktopapp/js/dataform.js | 9 +- desktopapp/js/global/email.js | 32 ++-- desktopapp/js/global/renderer.js | 9 ++ desktopapp/js/global/sqlite.js | 3 + desktopapp/js/modules/addresses.js | 107 ++++++++++--- desktopapp/js/modules/bookings.js | 3 +- desktopapp/js/modules/invoice.js | 112 ++++++++++--- desktopapp/js/modules/invoices.js | 4 +- desktopapp/main.js | 21 ++- desktopapp/package-lock.json | 2 +- desktopapp/package.json | 3 +- desktopapp/panels/addresses.html | 196 +++++++++++++---------- desktopapp/panels/bookings.html | 2 +- desktopapp/panels/invoice.html | 10 +- desktopapp/panels/invoices.html | 2 +- desktopapp/panels/offer.html | 2 +- desktopapp/panels/product.html | 2 +- desktopapp/panels/settings.html | 2 +- desktopapp/panels/templates.html | 2 +- desktopapp/panels/transactions.html | 2 +- install/local_asar_update.bat | 8 + tmpcompile.txt | 4 + 28 files changed, 465 insertions(+), 183 deletions(-) create mode 100644 desktopapp/css/app.css create mode 100644 desktopapp/dialogs/MailTemplate.html create mode 100644 desktopapp/dialogs/hiddenfileupload.html create mode 100644 desktopapp/js/app.js create mode 100644 install/local_asar_update.bat create mode 100644 tmpcompile.txt diff --git a/desktopapp/css/app.css b/desktopapp/css/app.css new file mode 100644 index 0000000..3d24221 --- /dev/null +++ b/desktopapp/css/app.css @@ -0,0 +1,6 @@ +@import "../js/vendor/tabulator/css/tabulator_site.css"; +@import "../js/vendor/slimselect/slimselect.css"; +@import "../js/vendor/flatpickr/flatpickr.min.css"; +@import "../js/vendor/flatpickr/themes/airbnb.css"; +@import "icons.css"; +@import "theme.css"; \ No newline at end of file diff --git a/desktopapp/dialogs/InvoiceBooking.html b/desktopapp/dialogs/InvoiceBooking.html index 172b068..20924ce 100644 --- a/desktopapp/dialogs/InvoiceBooking.html +++ b/desktopapp/dialogs/InvoiceBooking.html @@ -108,12 +108,8 @@
-
- -
-
diff --git a/desktopapp/dialogs/MailTemplate.html b/desktopapp/dialogs/MailTemplate.html new file mode 100644 index 0000000..8b4225d --- /dev/null +++ b/desktopapp/dialogs/MailTemplate.html @@ -0,0 +1,54 @@ + \ No newline at end of file diff --git a/desktopapp/dialogs/hiddenfileupload.html b/desktopapp/dialogs/hiddenfileupload.html new file mode 100644 index 0000000..0dc785b --- /dev/null +++ b/desktopapp/dialogs/hiddenfileupload.html @@ -0,0 +1,6 @@ +
+
+ + +
+
\ No newline at end of file diff --git a/desktopapp/index.html b/desktopapp/index.html index d837e83..db443a9 100644 --- a/desktopapp/index.html +++ b/desktopapp/index.html @@ -3,12 +3,7 @@ - - - - - - + Invoice Journal @@ -36,6 +31,7 @@
+ @@ -50,6 +46,7 @@ + @@ -64,7 +61,7 @@ - + diff --git a/desktopapp/js/app.js b/desktopapp/js/app.js new file mode 100644 index 0000000..e33d04c --- /dev/null +++ b/desktopapp/js/app.js @@ -0,0 +1,30 @@ +//let version=new Date().toISOString().substring(0,10); +// require(__dirname + '/js/vendor/tabulator/js/tabulator.js'); +// require(__dirname + '/js/vendor/moment/moment-with-locales.min.js'); +// require(__dirname + '/js/vendor/slimselect/slimselect.min.js'); +// require(__dirname + '/js/vendor/flatpickr/flatpickr.min.js'); +// require(__dirname + '/js/vendor/flatpickr/l10n/de.js'); +// require(__dirname + '/js/vendor/tinymce/js/tinymce/tinymce.min.js'); +// require(__dirname + '/js/vendor/mustache/mustache.min.js'); +// require(__dirname + '/js/global/request.js'); +// require(__dirname + '/js/global/myapp.js'); +// require(__dirname + '/js/dataform.js'); +// require(__dirname + '/js/timecalc.js'); +// require(__dirname + '/js/global/renderer.js'); +// require(__dirname + '/js/global/sqlite.js'); +// require(__dirname + '/js/global/report.js'); +// require(__dirname + '/js/modules/addresses.js'); +// require(__dirname + '/js/modules/bookings.js'); +// require(__dirname + '/js/modules/booking.js'); +// require(__dirname + '/js/modules/index.js'); +// require(__dirname + '/js/modules/invoice.js'); +// require(__dirname + '/js/modules/invoices.js'); +// require(__dirname + '/js/modules/offer.js'); +// require(__dirname + '/js/modules/offers.js'); +// require(__dirname + '/js/modules/product.js'); +// require(__dirname + '/js/modules/products.js'); +// require(__dirname + '/js/modules/transaction.js'); +// require(__dirname + '/js/modules/transactions.js'); +// require(__dirname + '/js/modules/settings.js'); +// require(__dirname + '/js/modules/datasets.js'); +// require(__dirname + '/js/modules/templates.js'); \ No newline at end of file diff --git a/desktopapp/js/dataform.js b/desktopapp/js/dataform.js index 22a0e73..89f9fd8 100644 --- a/desktopapp/js/dataform.js +++ b/desktopapp/js/dataform.js @@ -36,7 +36,7 @@ let dataform = { // } if (field.tagName == "TEXTAREA" ){ if (field.classList.contains("richeditarea")){ - flds[field.dataset.table][field.dataset.column] = tinymce.get(field.id).getContent(); + flds[field.dataset.table][field.dataset.column] = tinymce.get(field.id).getContent().replace(/'/g,"''"); } else { flds[field.dataset.table][field.dataset.column] = field.innerHTML; } @@ -146,10 +146,11 @@ let dataform = { var frm = document.querySelectorAll('.data_'+ dataclass); //console.log("frmdata",frm); if (data){ + for (var f in frm){ var tblid = null; - //console.log("ID",frm[f].id); + console.log("ID",frm[f].id); if (frm[f].id){ tblid = frm[f].id.replace(dataclass + "_",""); frm[f].dataset.id=data['id']; @@ -206,7 +207,7 @@ let dataform = { } }, setNumber(numdata,decimals){ - console.log("Number in ",numdata); + //console.log("Number in ",numdata); if (numdata == null || numdata == ''){ return ""; } @@ -214,7 +215,7 @@ let dataform = { numdata = parseFloat(numdata).toFixed(decimals).toString(); } numdata.toString().replace(/./,','); - console.log("Number out ",numdata); + //console.log("Number out ",numdata); return numdata; }, fillselectlist: function(obj,listdata,vidcol,vvalcol){ diff --git a/desktopapp/js/global/email.js b/desktopapp/js/global/email.js index dce04d6..adc342e 100644 --- a/desktopapp/js/global/email.js +++ b/desktopapp/js/global/email.js @@ -2,15 +2,15 @@ let email = { openthunderbird: function(maildata){ let args =[]; let mailcfg =[] - mailcfg.push("to='"+ data.to+"'"); - mailcfg.push("from='"+ data.from +"'"); - mailcfg.push("subject='"+ data.from +"'"); + mailcfg.push("to='"+ maildata.to+"'"); + mailcfg.push("from='"+ maildata.from +"'"); + mailcfg.push("subject='"+ maildata.subject +"'"); mailcfg.push("format=1"); // format => 1=HTML, 2=text - mailcfg.push("body='"+ data.body+"'"); - mailcfg.push("attachment='"+ data.attachments.join(',')+'"'); - args.push("-compose"); - args.push(mailcfg.join(",")); - + mailcfg.push("body='"+ maildata.body+"'"); + mailcfg.push("attachment='"+ maildata.attachments.join(',').replace(/\//g,"\\")+"'"); + args.push("-compose",mailcfg.join(",")) + //); + //process.stderr.write("Email:\n-----\n"+preferences.global.mailapp + " " + args.join(" ")+"\n-----\n"); const mailappout = spawn(preferences.global.mailapp, args); mailappout.stdout.on('data', (data) => { @@ -23,14 +23,14 @@ let email = { mailappout.on('close', (code) => { console.log(`pdfout: child process exited with code ${code}`); - if (code == 0){ - console.log("Copy",report.tmpoutput,"to",report.output); - if (fs.existsSync(report.output)){ - fs.unlinkSync(report.output); - } - fs.copyFileSync(report.tmpoutput,report.output); - report.callback({"file":report.reportfile}); - } + // if (code == 0){ + // console.log("Copy",report.tmpoutput,"to",report.output); + // if (fs.existsSync(report.output)){ + // fs.unlinkSync(report.output); + // } + // fs.copyFileSync(report.tmpoutput,report.output); + // report.callback({"file":report.reportfile}); + // } }); } diff --git a/desktopapp/js/global/renderer.js b/desktopapp/js/global/renderer.js index 0f3a620..a1ac094 100644 --- a/desktopapp/js/global/renderer.js +++ b/desktopapp/js/global/renderer.js @@ -19,6 +19,8 @@ let usersystem = { if (multiselect == true){ props.push('multiSelections'); } + console.log(dialog); + //dialog.send('open-file-dialog'); return dialog.showOpenDialog({title: dlgtitle,defaultPath: lastpath, filters: filefilters, properties: props }); }, selectdir: function(dlgtitle,lastpath){ @@ -89,7 +91,14 @@ let usersystem = { } }, getApplicationPath: function(){ + console.log(__dirname); let apath = path.dirname(__dirname); return apath; + }, + backupfile: function(backupfile,backuppath){ + let bname = path.basename(backupfile); + let ext = path.extname(backupfile); + let fname = bname.substring(0,bname.length - ext.length); + fs.copyFileSync(backupfile,backuppath + '/' + fname + '_' +moment().format('YYYYMMDDhhmm') + ext); } } \ No newline at end of file diff --git a/desktopapp/js/global/sqlite.js b/desktopapp/js/global/sqlite.js index ab5f130..5499a5d 100644 --- a/desktopapp/js/global/sqlite.js +++ b/desktopapp/js/global/sqlite.js @@ -3,6 +3,9 @@ const sqlite3 = require('sqlite3').verbose(); let db = { dbh: null, connect: function(dbfile){ + if (fs.existsSync(dbfile)){ + usersystem.backupfile(dbfile,path.dirname(dbfile) + '/backup') + } if (db.dbh != null){ db.disconnect(); } diff --git a/desktopapp/js/modules/addresses.js b/desktopapp/js/modules/addresses.js index db0a624..9a31e93 100644 --- a/desktopapp/js/modules/addresses.js +++ b/desktopapp/js/modules/addresses.js @@ -1,6 +1,8 @@ let addresses = { tbl: null, tblselector: null, + tblcontacts: null, + tblmailtemplates: null, current_id: null, viewpanel: function(){ this.gettbldata(); @@ -25,11 +27,61 @@ let addresses = { {title: "Name", field: "receipient", resizable: false}, ] }); + addresses.tbl = new Tabulator("#tbl_addresses",{ + headerFilterPlaceholder: "filter...", + height: "calc(100vh - 60px)", + layout: "fitDataStretch", + selectable: 1, + rowClick:function(e, row){ + console.log("Filter selected"); + let fsel = addresses.tbl.getSelectedData(); + console.log(fsel); + addresses.current_id = fsel[0].id; + addresses.edit(fsel[0].id); + //invoices.getsums(fsel); + }, + rowContext:function(e, row){ e.preventDefault(); }, + columns: [ + {title: "Name", field: "receipient", resizable: false}, + ] + }); + addresses.tblcontacts = new Tabulator("#tbl_contacts",{ + //headerFilterPlaceholder: "filter...", + height: "400px", + layout: "fitColumns", + selectable: 1, + rowContext:function(e, row){ e.preventDefault(); }, + columns: [ + {title: "Surname", field: "surname"}, + {title: "Prename", field: "prename"}, + {title: "E-Mail", field: "email"}, + {title: "Telefon", field: "phone"}, + {title: "Position", field: "job"} + ] + }); + addresses.tblmailtemplates = new Tabulator("#tbl_mailtemplates",{ + //headerFilterPlaceholder: "filter...", + height: "calc(100vh - 560px)", + layout: "fitColumns", + selectable: 1, + rowContext:function(e, row){ e.preventDefault(); }, + columns: [ + {title: "Name", field: "templatename" ,width: 300}, + {title: "Sender", field: "sendermail", width: 200}, + {title: "Betreff", field: "subject"}, + ] + }); if (addresses.tblselector == null){ - addresses.initSelector(); - } + if (document.getElementById("#tbl_addressselect")){ + addresses.initSelector(); + } + } + myapp.loaddialog("confirm").then(result => { + + }); }, initSelector: function(){ + addresses.tblselector = new Tabulator("#tbl_addressselect",{ headerFilterPlaceholder: "Filter...", height: "400px", @@ -37,7 +89,7 @@ let addresses = { selectable: 1, rowContext:function(e, row){ e.preventDefault(); }, columns: [ - {title:"Name", field:"receipient",input: "editor"}, + {title:"Name", field:"receipient",headerFilter:"input"}, {title: "Adresse",field: "address" }, {title: "PLZ", field: "zip" }, {title: "Ort",field: "city"}, @@ -45,9 +97,14 @@ let addresses = { ] }); }, - gettbldata: function(){ + gettbldata: function(idsel){ + db.queryarray("select id,receipient from addresses order by receipient").then(data => { - addresses.tbl.setData(data); + addresses.tbl.setData(data).then(res => { + if (idsel){ + addresses.tbl.selectRow(idsel); + } + }); }); // postData({ "get":"addresslist;","dbschema":"dks"}).then(data => { @@ -58,38 +115,44 @@ let addresses = { }, edit: function (selid){ addresses.current_id = selid; + dataform.cleanform('addresses'); db.query("select * from addresses where id='"+selid+"';").then(data => { - dataform.fillform('addresses',data,selid,null); + console.log("Address Data:",data); + dataform.fillform('addresses',{},data); }) // postData({"get":"addresslist","dbschema":"dks","id":selid}).then(data => { // }); }, - add:function(){ - let datafields = {"ins":"addresses"}; - postData({"fn":"add_address","dbschema":"dks"}).then(data => { - addresses.gettbldata(); + add:function(){ + db.newuuid().then(newid => { + db.query("select count(*) as cnt from addresses").then(adrcnt => { + let clnum=moment().format('YYMM') + timecalc.lpad(adrcnt.cnt,4,'0'); + console.log("New addresse ID",newid.id); + db.execAsync("INSERT INTO addresses (id,clientnumber,receipient) VALUES ('"+newid.id+"','"+ clnum+"','Neue Addresse');").then( res =>{ + addresses.gettbldata(newid.id); + addresses.current_id = fsel[0].id; + addresses.edit(fsel[0].id); + }); + }); }); }, confirmremove: function(){ var sel = addresses.tbl.getSelectedData(); - delcallback = addresses.remove; + //delcallback = ; if (sel[0]) { - addresses.current_id = sel[0].id; - document.getElementById("dlgdeleterow").style.display = 'block'; + myapp.confirm("Addresse löschen","Sind Sie Sicher dass Sie die Adresse löschen möchten?","Löschen","Abbrechen","addresses.remove();"); + // document.getElementById("btndlgdeleterowok").setAttribute("onclick","invoices.remove();"); + // document.getElementById("dlgdeleterow").style.display = 'block'; } }, - remove: function(data){ - req.reqdata({"del":"addresses","id":addresses.current_id},addresses.afterremove); - //table.selection = null, - delcallback = null; - - }, - afteremove: function(data){ - addresses.gettbldata(); - document.getElementById("dlgdeleterow").style.display = 'none'; + var sel = addresses.tbl.getSelectedData(); + db.execAsync("DELETE FROM addresses where id='"+sel[0].id+"';").then(res => { + addresses.tbl.deselectRow(sel[0].id); + addresses.gettbldata(); + }); }, duplicate: function(){ diff --git a/desktopapp/js/modules/bookings.js b/desktopapp/js/modules/bookings.js index 2847863..2a21947 100644 --- a/desktopapp/js/modules/bookings.js +++ b/desktopapp/js/modules/bookings.js @@ -4,7 +4,7 @@ let bookings = { viewpanel: function(){ myapp.viewpanel('bookings'); }, - inittable: function(){ + init: function(){ bookings.tbl = new Tabulator("#tbl_bookings",{ headerFilterPlaceholder: "filter...", height: "calc(100vh - 56px)", @@ -25,6 +25,7 @@ let bookings = { {title: "Brutto", field: "grossamount",headerSort: false, formatter:"money",hozAlign:"right", formatterParams:{ decimal:",", thousand:".", symbol:"€", symbolAfter:"p", precision:2}}, ] }); + bookings.gettbldata }, gettbldata: function(){ // db.querryarray("SELECT bookings.id, id_invoices,id_products,producttype,sku, COALESCE(bookings.quantity, 1) AS quantity, COALESCE(bookings.unitamount, 0.0) AS unitamount, unit,name,description,taxpercent,taxpercent AS vatpercent,taxamount,netamount,bookings.netamount + bookings.taxamount AS grossamount, (('' || COALESCE(name, '')) || '
') || COALESCE(description, '') AS displayitem FROM bookings where id_invoice='"+ invoice.current_id+"';").then(data => { diff --git a/desktopapp/js/modules/invoice.js b/desktopapp/js/modules/invoice.js index 41d1861..b3a3bb4 100644 --- a/desktopapp/js/modules/invoice.js +++ b/desktopapp/js/modules/invoice.js @@ -1,3 +1,5 @@ +const { fstat } = require("fs"); + let invoice = { current_id: null, bookingtbl: null, @@ -12,7 +14,9 @@ let invoice = { db.query("SELECT inv.*,sum(bk.netamount) AS netamount,sum(bk.taxamount) AS vatamount,sum(bk.netamount + bk.taxamount) AS grossamount FROM invoices inv JOIN bookings bk ON (inv.id = bk.id_invoices) WHERE inv.id='"+id+"' GROUP BY inv.id;").then(data => { console.log("invoicedata",data); dataform.fillform('invoices',invoice.selects,data); - invoice.hasPDF(data.pdffile); + if (data.pdffile){ + invoice.hasPDF(data.pdffile); + } invoice.getBookingData(); myapp.viewpanel('invoice'); @@ -166,9 +170,11 @@ let invoice = { dataform.setValue(document.getElementById("invoices_deadlinedays"),dldate.diff(invdate,'days')); }, setReference(){ - let invtype = document.getElementById("invoices_invoicetype").value; + let invtype = invoice.selects["invoices_invoicetype"].selected(); if ((invtype == 'invoice-out') || (invtype == 'creditnote-out')){ - document.getElementById("invoices_reference").value = invoice.getNewReference(document.getElementById("invoices_invoicedate").value); + console.log('Set ref'); + let newref= invoice.getNewReference(document.getElementById("invoices_invoicedate").value); + document.getElementById("invoices_reference").value = newref; dataform.savefield(document.getElementById("invoices_reference")); document.getElementById("invoices_businessyear").value=moment(document.getElementById("invoices_invoicedate").value).format("YYYY"); dataform.savefield(document.getElementById("invoices_businessyear")); @@ -193,10 +199,24 @@ let invoice = { // } }, getNewReference(strdate){ - preferences.defaultdata.invoicesequence = parseInt(preferences.defaultdata.invoicesequence) + 1; - myapp.setpref('invoicesequence',preferences.defaultdata.invoicesequence); - let newref = moment(strdate).format('YYYYMMDD') + '-' + timecalc.lpad(preferences.defaultdata.invoicesequence,4,'0'); - console.log(newref); + let newref=document.getElementById("invoices_reference").value; + let invtype=invoice.selects["invoices_invoicetype"].selected(); + let invstatus=invoice.selects["invoices_status"].selected(); + let re = /\d\d\d\d\d\d\d\d-\d\d\d\d/; + console.log("Reference",invtype,invstatus,newref); + if ((invtype == "invoice-out" || invtype == "creditnote-out") && + (invstatus == "preparation" || invstatus == "planned")){ + console.log("TEST",re.test(newref)); + if (re.test(newref)){ + newref=moment(strdate).format('YYYYMMDD') + '-' + newref.substring(newref.length - 4 ,newref.length); + } else { + preferences.defaultdata.invoicesequence = parseInt(preferences.defaultdata.invoicesequence) + 1; + myapp.setpref('invoicesequence',preferences.defaultdata.invoicesequence); + newref = moment(strdate).format('YYYYMMDD') + '-' + timecalc.lpad(preferences.defaultdata.invoicesequence,4,'0'); + } + } + + console.log("new Ref",newref); return newref; }, calculate: function(){ @@ -207,7 +227,6 @@ let invoice = { if (qu){ qu = parseFloat(qu);} else {qu = 1;} let price = document.getElementById("invoicebooking_unitamount").value; if (price){ price = parseFloat(price).toFixed(2);} else {price = 0.0;} - let vatpercent = null; let vatamount = null; let grossamount = null; console.log(qu + " * "+ price); @@ -221,8 +240,9 @@ let invoice = { vatamount = ((price * (vatpercent/100)).toFixed(2) * qu).toFixed(2); console.log("VAT:" + vatamount); } - if (invtype == "invoice-in"|| invtype == "creditnote-in"){ + if (invtype != "invoice-out" && invtype != "creditnote-out"){ vatamount = document.getElementById("invoicebooking_taxamount").value; + console.log("vat as amount",vatamount) if (vatamount){ vatamount = parseFloat(vatamount).toFixed(2);} else {vatamount = 0.0;} } dataform.setValue(document.getElementById("invoicebooking_taxamount"),vatamount); @@ -233,22 +253,33 @@ let invoice = { if (obj.value == "payed" ){ console.log("Set invoice payed!"); //document.getElementById + document.getElementById("invoices_payedamount").value=invoice.getSumGrossAmount(); + dataform.savefield(document.getElementById("invoices_payedamount")); + } else { + document.getElementById("invoices_payedamount").value=""; + dataform.savefield(document.getElementById("invoices_payedamount")); } }, changedInvoicedate: function(){ - let direction = document.getElementById("invoices_direction" ).value - if (direction == "out"){ + let invtype = invoice.selects["invoices_invoicetype"].selected(); + if (invoicetype == "invoice-out"){ console.log("Change Reference!"); } }, changedType: function(isinit){ - let invtype = document.getElementById("invoices_invoicetype").value; - let status = document.getElementById("invoices_status").value; + let invtype = invoice.selects["invoices_invoicetype"].selected(); + let status = invoice.selects["invoices_status"].selected(); let restatus = /[planned|preparation]/; console.log("Status valid:" +restatus.test(status)); + if (invtype == "invoice-out" || invtype == "creditnote-out"){ + document.getElementById("invoices_reference").value=invoice.getNewReference(document.getElementById("invoices_invoicedate").value); + document.getElementById("row_invoicetemplate").style.display = 'block'; + } else { + document.getElementById("row_invoicetemplate").style.display = 'none'; + } if (invtype == "invoice-out"){ if (restatus.test(status)){ console.log("can create"); @@ -259,18 +290,18 @@ let invoice = { document.getElementById("btnSendEmail").style.display = 'none'; console.log("can not create"); } - document.getElementById("bookings_taxpercent").style.display = 'block'; + document.getElementById("invoicebooking_taxpercent").style.display = 'block'; //document.getElementById("bookings_vatamount").style.display = 'none'; - document.getElementById("btnAddProduct").style.display = 'block'; + //document.getElementById("btnAddProduct").style.display = 'block'; //document.getElementById("pnlCatalog").style.display = 'block'; } - if (direction == "invoice-in"){ + if (invtype == "invoice-in"){ document.getElementById("btnCreateInvoice").style.display = 'none'; document.getElementById("btnSendEmail").style.display = 'none'; - document.getElementById("bookings_taxpercent").style.display = 'none'; + document.getElementById("invoicebooking_taxpercent").style.display = 'none'; //document.getElementById("bookings_vatamount").style.display = 'block'; - document.getElementById("bookings_taxamount").style.display = 'block'; - document.getElementById("btnAddProduct").style.display = 'none'; + document.getElementById("invoicebooking_taxamount").style.display = 'block'; + //document.getElementById("btnAddProduct").style.display = 'none'; //document.getElementById("pnlCatalog").style.display = 'none'; } console.log("Init or not" + isinit); @@ -295,16 +326,28 @@ let invoice = { document.getElementById("invoices_businessyear").value; console.log("invoice.openPDF", document.getElementById("invoices_pdffile").value); report.open('invoice', document.getElementById("invoices_pdffile").value); + //location.href=api + 'report.cgi?open=' + encodeURIComponent(document.getElementById("invoices_pdffile").value); } }, sendEmail: function(){ - + + email.openthunderbird() }, importPDF: function(){ - - document.getElementById("invfile_folder").value="invoices/"+document.getElementById("invoices_businessyear-").value; - document.getElementById("invfile_file").click(); + //document.getElementById("invfile_folder").value=; + // var file = ; + usersystem.selectfile("PDF importieren","",[{ name: 'PDF', extensions: ['pdf'] }]).then(file => { + console.log(file); + }); + // console.log("imported file:",file); + // if (file){ + // fs.copyFileSync(file,preferences.global.currentdataset.datapath + '/invoice/' + document.getElementById("invoices_businessyear").value + '/' + path.basename(file)); + // document.getElementById("invoices_pdffile").value = document.getElementById("invoices_businessyear").value + '/' + path.basename(file); + // dataform.savefield(document.getElementById("invoices_pdffile")); + // invoice.hasPDF(); + // } + //document.getElementById("invfile_file").click(); }, afterFileUpload: function(data){ console.log(data); @@ -346,10 +389,10 @@ let invoice = { }); }, - confirmremoveBooking: function(){ + confirmRemoveBooking: function(){ let sel = invoice.bookingtbl.getSelectedData(); if (sel[0]){ - myapp.confirm("Buchung löschen?","Sind Sie sicher dass sie die ausgewählte(n) Buchunge(n) löschen möchten?","Löschen","Abbrechen",'invoice.removeBookings();'); + myapp.confirm("Buchung löschen?","Sind Sie sicher dass sie die ausgewählte(n) Buchunge(n) löschen möchten?","Löschen","Abbrechen",'invoice.removeBooking();'); } }, removeBooking: function(){ @@ -404,7 +447,26 @@ let invoice = { }, sendEmail: function(){ + + db.query("select * from addresses where id='"+ document.getElementById("invoices_id_accounts").value +"';").then(data => { + let invref = document.getElementById("invoices_reference").value; + let mdata = {}; + mdata["from"] = preferences.defaultdata.email; + mdata["to"] = data.email; + mdata["subject"] = 'Facture No.' + invref; + mdata["body"] = 'Bonjour,

en annexe vous trouvez la facture ' + invref; + mdata.attachments = [preferences.global.currentdataset.datapath + '/invoice/' + document.getElementById("invoices_pdffile").value] + email.openthunderbird(mdata); + }); + }, + getSumGrossAmount(){ + let xd = invoice.bookingtbl.getData(); + let sum=0; + for (var d in xd){ + sum += xd[d].grossamount; + } + return sum.toFixed(2); } } diff --git a/desktopapp/js/modules/invoices.js b/desktopapp/js/modules/invoices.js index d3ea30e..9e42666 100644 --- a/desktopapp/js/modules/invoices.js +++ b/desktopapp/js/modules/invoices.js @@ -62,7 +62,8 @@ let invoices = { let cyear = moment(new Date()).format('YYYY'); invoices.tbl = new Tabulator("#tbl_invoices",{ initialHeaderFilter:[ - {field:"invoicedate", value: cyear} + {field:"invoicedate", value: cyear}, + {field:"businessyear", value: cyear} ], headerFilterPlaceholder: "filter...", height: "calc(100vh - 60px)", @@ -70,6 +71,7 @@ let invoices = { selectable: 1, rowContext:function(e, row){ e.preventDefault(); }, columns: [ + {title:"GJahr", field:"businessyear",headerFilter:"input",width: 80}, {title:"Datum", field:"invoicedate",headerFilter:"input",width: 100,formatter:"datetime",headerSort:true,formatterParams:{inputFormat:"YYYY-MM-DD",outputFormat:"DD.MM.YYYY",invalidPlaceholder:""}}, {title: "Typ", field: "invoicetype",headerFilter:"select",width: 180, headerFilterParams:{values:headerinvtypes},formatter:function(cell, formatterParams){ var value = cell.getValue(); if (value){ return "" + invtypes[value].text + "" } return ""; } }, {title: "Konto", field: "accountname",headerFilter:"input",width: 300}, diff --git a/desktopapp/main.js b/desktopapp/main.js index f1986fc..599fe89 100644 --- a/desktopapp/main.js +++ b/desktopapp/main.js @@ -11,6 +11,7 @@ let mainWindow let appcfg function createWindow () { + makeSingleInstance() //appcfg = localcfg(); let ua = app.getName() + '/' + app.getVersion() + '-' + os.type() + '/' + os.release() + '/' + os.arch mainWindow = new BrowserWindow({ @@ -18,13 +19,13 @@ function createWindow () { icon: __dirname + '/img/invoicejournal.png', minWidth: 1260, minHeight: 720, - title: "POT", + title: "Invoice Jounral", backgroundColor: "#fff", webPreferences: { nodeIntegration: true, worldSafeExecuteJavaScript: true, defaultEncoding: 'UTF-8', - enableRemoteModule: true, + //enableRemoteModule: true, webviewTag: true } }) @@ -34,7 +35,8 @@ function createWindow () { }) - mainWindow.loadFile(__dirname + "/index.html"); + //mainWindow.loadFile(__dirname + "/index.html") + mainWindow.loadURL(path.join('file://', __dirname, '/index.html')) mainWindow.setMenu(null) mainWindow.maximize() @@ -100,6 +102,19 @@ function createWindow () { } + +function makeSingleInstance () { + if (process.mas) return + + app.requestSingleInstanceLock() + + app.on('second-instance', () => { + if (mainWindow) { + if (mainWindow.isMinimized()) mainWindow.restore() + mainWindow.focus() + } + }) +} // function localcfg(){ // var data = null; // if (os.platform() == "darwin"){ diff --git a/desktopapp/package-lock.json b/desktopapp/package-lock.json index 16ea2f7..636931f 100644 --- a/desktopapp/package-lock.json +++ b/desktopapp/package-lock.json @@ -1,6 +1,6 @@ { "name": "InvoiceJournal", - "version": "1.0.0", + "version": "1.0.1", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/desktopapp/package.json b/desktopapp/package.json index 2113f24..2b00eec 100644 --- a/desktopapp/package.json +++ b/desktopapp/package.json @@ -1,6 +1,6 @@ { "name": "InvoiceJournal", - "version":"1.0.1", + "version": "1.0.1", "description": "Rechnungs Programm", "main": "main.js", "scripts": { @@ -16,6 +16,7 @@ "author": "DKS S.à r.l.", "license": "UNLICENSED", "devDependencies": { + "asar": "^3.0.3", "electron": "^10.1.1", "electron-packager": "^15.1.0" }, diff --git a/desktopapp/panels/addresses.html b/desktopapp/panels/addresses.html index e78845c..5482930 100644 --- a/desktopapp/panels/addresses.html +++ b/desktopapp/panels/addresses.html @@ -2,7 +2,7 @@
Adressen -
@@ -13,117 +13,141 @@
-
-
-
-
-
- +
+
+ +
+
+
+ +
-
-
-
- +
+
+ +
-
-
-
-
- +
+
+
+ +
-
-
-
- +
+
+ +
-
-
-
- +
+
+ +
-
-
-
-
- +
+
+
+ +
-
-
-
-
- +
+
+
+ +
-
-
-
- +
+
+ +
-
-
-
- +
+
+ +
-
-
-
-
- +
+
+
+ +
-
-
-
-
- +
+
+
+ +
-
-
-
-
- +
+
+
+ +
-
-
-
- +
+
+ +
-
-
-
-
- +
+
+
+ +
-
-
-
- +
+
+ +
+ +
+
+
+
Kontakte
+ + + +
- +
+
+
+
+
+
Mail Vorlagen
+ + + + +
+
+
+
\ No newline at end of file diff --git a/desktopapp/panels/bookings.html b/desktopapp/panels/bookings.html index abc825c..f231489 100644 --- a/desktopapp/panels/bookings.html +++ b/desktopapp/panels/bookings.html @@ -1,4 +1,4 @@ -
+
Buchungen diff --git a/desktopapp/panels/invoice.html b/desktopapp/panels/invoice.html index eb5a8c8..a3cdf9a 100644 --- a/desktopapp/panels/invoice.html +++ b/desktopapp/panels/invoice.html @@ -1,4 +1,4 @@ -
+
Rechnung @@ -87,10 +87,10 @@
-
+
-
@@ -169,4 +169,4 @@
-
\ No newline at end of file +
\ No newline at end of file diff --git a/desktopapp/panels/invoices.html b/desktopapp/panels/invoices.html index 61a3660..ffb2a6e 100644 --- a/desktopapp/panels/invoices.html +++ b/desktopapp/panels/invoices.html @@ -1,5 +1,5 @@
-
+
Rechnungen
diff --git a/desktopapp/panels/offer.html b/desktopapp/panels/offer.html index 29493db..502db64 100644 --- a/desktopapp/panels/offer.html +++ b/desktopapp/panels/offer.html @@ -1,4 +1,4 @@ -
+
Angebot diff --git a/desktopapp/panels/product.html b/desktopapp/panels/product.html index e8aabc4..f015e9e 100644 --- a/desktopapp/panels/product.html +++ b/desktopapp/panels/product.html @@ -1,4 +1,4 @@ -
+
Produkt diff --git a/desktopapp/panels/settings.html b/desktopapp/panels/settings.html index 4a5fa53..61d6ae4 100644 --- a/desktopapp/panels/settings.html +++ b/desktopapp/panels/settings.html @@ -1,4 +1,4 @@ -
+
Einstellungen diff --git a/desktopapp/panels/templates.html b/desktopapp/panels/templates.html index dce4067..e2d9be9 100644 --- a/desktopapp/panels/templates.html +++ b/desktopapp/panels/templates.html @@ -1,4 +1,4 @@ -
+
Vorlagen diff --git a/desktopapp/panels/transactions.html b/desktopapp/panels/transactions.html index 486d0a0..2d43cfa 100644 --- a/desktopapp/panels/transactions.html +++ b/desktopapp/panels/transactions.html @@ -1,4 +1,4 @@ -
+
Transaktionen diff --git a/install/local_asar_update.bat b/install/local_asar_update.bat new file mode 100644 index 0000000..9fc9499 --- /dev/null +++ b/install/local_asar_update.bat @@ -0,0 +1,8 @@ +@echo off +cd %~dp0 +cd .. +cd desktopapp +call npm run package-win64 > ../tmpcompile.txt +cd .. +echo "%CD%" +copy "%CD%\release-builds\invoicejournal-win32-x64\resources\app.asar" "%localappdata%\Programs\InvoiceJournal\resources\app.asar" \ No newline at end of file diff --git a/tmpcompile.txt b/tmpcompile.txt new file mode 100644 index 0000000..f8c98c1 --- /dev/null +++ b/tmpcompile.txt @@ -0,0 +1,4 @@ + +> InvoiceJournal@1.0.1 package-win64 C:\Users\ksaff\Workspace\invoicejournal\desktopapp +> electron-packager . invoicejournal --overwrite --platform=win32 --arch=x64 --asar --out=../release-builds --version-string.CompanyName=DKS --version-string.FileDescription=DKS --version-string.ProductName=InvoiceJournal --icon=img/invoicejournal.ico + -- 2.39.5