--- /dev/null
+<div id="dlgAddress" class="modal" >
+ <div class="modal-content animate-opacity card-4" >
+ <header>
+ <div class="bar-item SubHeadTitle">Adresse</div>
+ <span onclick="myapp.closeDialog('Address');" class="button display-topright">×</span>
+ </header>
+ <div class="container padding">
+ <form id="frm_addresses" >
+ <div class="row">
+ <div class="cell container" style="width: 400px;">
+ <label class="label" for="addresses_receipient">Name / Firma</label>
+ <input class="input data_addresses border text" data-column="receipient" data-id="" data-table="addresses" id="addresses_receipient" type="text">
+ </div>
+ <div class="cell container" style="width: 120px;">
+ <label class="label" for="addresses_clientnumber">Kundern-Nr.</label>
+ <input class="input data_addresses border text" data-column="clientnumber" data-id="" data-table="addresses" id="addresses_clientnumber" placeholder="YYMMDDNNN" type="text">
+ </div>
+ </div>
+ <div class="row">
+ <div class="cell" style="width: 60px;">
+ <label class="label" for="addresses_title">Titel</label>
+ <input class="input border data_addresses text" data-column="title" data-id="" data-table="addresses" id="addresses_title" type="text">
+ </div>
+ <div class="cell" style="width: 300px;">
+ <label class="label" for="addresses_prename">Vorname</label>
+ <input class="input border data_addresses text" data-column="prename" data-id="" data-table="addresses" id="addresses_prename" type="text">
+ </div>
+ <div class="cell" style="width: 300px;">
+ <label class="label" for="addresses_surname">Nachname</label>
+ <input class="input border data_addresses text" data-column="surname" data-id="" data-table="addresses" id="addresses_surname" type="text">
+ </div>
+ </div>
+ <div class="row">
+ <div class="cell container" style="width: 660px;">
+ <label class="label" for="addresses_address">Adresse</label>
+ <input class="input border data_addresses text" data-column="address" data-id="" data-table="addresses" id="addresses_address" type="text">
+ </div>
+ </div>
+ <div class="row">
+ <div class="cell container" style="width: 60px;">
+ <label class="label" for="addresses_country">Land</label>
+ <input class="input border data_addresses text" data-column="country" data-id="" data-table="addresses" id="addresses_country" type="text">
+ </div>
+ <div class="cell container" style="width: 120px;">
+ <label class="label" for="addresses_zip">PLZ</label>
+ <input class="input border data_addresses text" data-column="zip" data-id="" data-table="addresses" id="addresses_zip" type= "text">
+ </div>
+ <div class="cell container" style="width: 480px;">
+ <label class="label" for="addresses_city">Ort</label>
+ <input class="input data_addresses border text" data-column="city" data-id="" data-table="addresses" id="addresses_city" type="text">
+ </div>
+ </div>
+ <div class="row">
+ <div class="cell container" style="width: 400px;">
+ <label class="label" for="addresses_email">E-mail</label>
+ <input class="input data_addresses border text" data-column="email" data-id="" data-table="addresses" id="addresses_email" type="text">
+ </div>
+ </div>
+ <div class="row">
+ <div class="cell container" style="width: 400px;">
+ <label class="label" for="addresses_phone">Telefon</label>
+ <input class="input border text" data-column="phone" data-id="" data-table="addresses" id="addresses_phone" type="text">
+ </div>
+ </div>
+ <div class="row">
+ <div class="cell container" style="width: 300px;">
+ <label class="label" for="addresses_iban">Kontonummer</label>
+ <input class="input border text" data-column="iban" data-id="" data-table="addresses" id="addresses_iban" type="text">
+ </div>
+ <div class="cell container" style="width: 150px;">
+ <label class="label" for="addresses_bic">BIC</label>
+ <input class="input border text" data-column="bic" data-id="" data-table="addresses" id="addresses_bic" type="text">
+ </div>
+ </div>
+ <div class="row">
+ <div class="cell container" style="width: 200px;">
+ <label class="label" for="addresses_vatid">USt-Id</label>
+ <input class="input border text" data-column="vatid" data-id="" data-table="addresses" id="addresses_vatid" type="text">
+ </div>
+ <div class="cell container" style="width: 200px;">
+ <label class="label" for="addresses_lang">Sprache</label>
+ <input class="input border text" data-column="lang" data-id="" data-table="addresses" id="addresses_lang" type="text">
+ </div>
+ </div>
+ </form>
+ </div>
+ <footer class="container right-align padding-16">
+ <button class="button theme-light margin-right border" onclick="myapp.closeDialog('Address');"><span class="icon-close" style="font-size: 16px;"></span>Abbrechen</button>
+ <button class="button moduletoolbar margin-right" id="btnCloseBooking" onclick="addresses.save();"><span class="icon-save" style="font-size: 16px;"></span>Speichern</button>
+ </footer>
+ </div>
+</div>
\ No newline at end of file
<div class="container row">
<div class="cell" style="width: 600px;">
<label for="invoicebooking_description" class="label">Beschreibung</label>
- <textarea class="input border data_invoicebooking richeditarea" style="height: 200px;" data-id="" data-column="description" data-table="bookings" id="invoicebooking_description" name="invoicebooking_description"></textarea>
+ <textarea class="input border data_invoicebooking" style="height: 200px;" data-id="" data-column="description" data-table="bookings" id="invoicebooking_description" name="invoicebooking_description"></textarea>
</div>
</div>
</div>
</div>
<footer class="container right-align padding-16">
<button class="button theme-light margin-right border" onclick="myapp.closeDialog('InvoiceBooking');"><span class="icon-close" style="font-size: 16px;"></span>Abbrechen</button>
- <button class="button moduletoolbar margin-right" id="btnCloseBooking" onclick="invoice.saveBooking();"><span class="icon-save" style="font-size: 16px;"></span>Speichers</button>
+ <button class="button moduletoolbar margin-right" id="btnCloseBooking" onclick="invoice.saveBooking();"><span class="icon-save" style="font-size: 16px;"></span>Speichern</button>
</footer>
</div>
</div>
\ No newline at end of file
</div>
<div class="container third">
<div class="bar" id="idxbar_quicklinks">
- <button class="bar-item bodybtn border padding margin" onclick="reportnew.generate('invoice/simple.odt',{},'testsimple',null);"><span class="icon-pdf" style="font-size: 64px;"></span>Gen Report</button>
+
</div>
</div>
</div>
<script src="js/renderer.js?v=6" type="text/javascript"></script>
<script src="js/sqlite.js?v=6" type="text/javascript"></script>
<script src="js/report.js?v=6" type="text/javascript"></script>
+ <script src="js/email.js?v=6" type="text/javascript"></script>
<div id="modulescripts">
</div>
if (field.classList.contains("richeditarea")){
flds[field.dataset.table][field.dataset.column] = tinymce.get(field.id).getContent();
} else {
- flds[field.dataset.table][field.dataset.column] = field.innerHTML;
+ flds[field.dataset.table][field.dataset.column] = field.value;
}
} else if (field.type == "checkbox" ){
if (field.checked){
+var emlformat = require('eml-format');
+import MsgReader from '@kenjiuno/msgreader'
+
let email = {
+ templatetype: "eml",
+ currenttemplate: {},
openthunderbird: function(maildata){
let args =[];
let mailcfg =[];
});
},
openOutlook: function(){
+ const mailappout = spawn(preferences.global.mailapp, args);
//outlook.exe /c ipm.note /m "someone@microsoft.com&subject=test%20subject&body=test%20body" /a test.txt
},
+ create: function(mailtemplate,repdata,accdata){
+ if (mailtemplate == 'msg'){
+ email.templatetype ='msg';
+ const msgFileBuffer = fs.readFileSync('./data/test.msg')
+ const msgtmpl = new MsgReader(msgFileBuffer)
+ email.currenttemplate = msgtmpl.getFileData()
+ } else {
+ var eml = fs.readFileSync(preferences.global.currentdataset.datapath + '/templates/email/' + mailtemplate, "utf-8");
+ emlformat.read(eml, function(error, data) {
+ if (error) return console.log(error);
+ email.currenttemplate = JSON.stringify(data, " ", 2);
+ console.log(data);
+ console.log("globalprefs",preferences.global);
+ });
+ }
+ console.log("globalprefs",preferences.global);
+ },
// sendWithSMTP: function(maildata){
// const transporter = nodemailer.createTransport({
// host: preferences.global.mailserver,
});
},
viewdialog: function( dlgname){
- //app.loaddialog(dlgname).then(result => {
+ // myapp.loaddialog(dlgname).then(result => {
document.getElementById("dlg" + dlgname).style.display = 'block';
- //});
+ // });
},
closeDialog: function(dlgname){
document.getElementById("dlgconfirm").style.display = 'block';
},
message: function(title,message){
- document.getElementById('dlgmessage_title').innerHTML=title;
- document.getElementById('dlgmessage_text').innerHTML=message;
- document.getElementById('dlgmessage').style.display='block';
+ myapp.loaddialog("message").then(result => {
+ document.getElementById('dlgmessage_title').innerHTML=title;
+ document.getElementById('dlgmessage_text').innerHTML=message;
+ document.getElementById('dlgmessage').style.display='block';
+ });
return false;
},
setpref: function(key,value){
console.log("Render",preferences.global.currentdataset.datapath + '/templates/' + id_report);
console.log("to",report.tmpoutput);
carbone.render(preferences.global.currentdataset.datapath + '/templates/' + id_report, data, options, function(err, result){
- if (err) return console.log("XX ERR",err);
+ if (err) {
+ console.log("XX ERR",err);
+ myapp.message("Error",err);
+ return;
+ }
console.log("docresult",result);
fs.writeFileSync(report.tmpoutput, result);
// to kill automatically LibreOffice workers
if (report.callback){
report.callback({"file":report.reportfile});
}
- process.exit();
+ //process.exit();
});
}
}
\ No newline at end of file
<div class="display-container bar toolbar">
<button class="bar-item toolbarbtn" onclick="myapp.gotoHome();"><span class="icon-back" style="font-size: 16px;"></span>zurück</button>
- <div class="bar-item PageHeadTitle">
- Adressen
- </div><button class="bar-item toolbarbtn right" onclick="addresses.confirmremove();"><span class="icon-trash" style="font-size: 16px;"></span>löschen</button> <button class="bar-item toolbarbtn right" onclick=
- "addresses.duplicate();"><span class="icon-duplicate" style="font-size: 16px;"></span>dupizieren</button> <!-- <button class="bar-item toolbarbtn right" onclick="addresses.edit();"><span class="icon-edit" style="font-size: 16px;"></span>
-[% lbl.edit %]</button> -->
- <button class="bar-item toolbarbtn right" onclick="addresses.add();"><span class="icon-add" style="font-size: 16px;"></span> neu</button>
+ <div class="bar-item PageHeadTitle">Adressen</div>
+ <button class="bar-item toolbarbtn right" onclick="addresses.confirmremove();"><span class="icon-trash text-red" style="font-size: 16px;"></span>löschen</button>
+ <button class="bar-item toolbarbtn right" onclick="addresses.duplicate();"><span class="icon-duplicate" style="font-size: 16px;"></span>dupizieren</button>
+ <button class="bar-item toolbarbtn right" onclick="addresses.edit();"><span class="icon-edit" style="font-size: 16px;"></span>bearb.</button>
+ <button class="bar-item toolbarbtn right" onclick="addresses.add();"><span class="icon-add" style="font-size: 16px;"></span> neu</button>
</div>
-<div class="display-container">
+<div id="tbl_addresses"></div>
+<!-- <div class="display-container">
<div class="cell-row">
<div class="cell" style="width: 400px;">
<div id="tbl_addresses"></div>
<div class="cell">
<div class="row" >
<div class="cell container" style="width: 400px; background-color: #e4e4e4; padding-bottom: 10px;">
- <form id="frm_addresses" name="frm_addresses">
- <div class="row">
- <div class="cell container" style="width: 400px;">
- <div class="">
- <label class="label" for="addresses_receipient">Name / Firma</label> <input class="input data_addresses border text" data-column="receipient" data-id="" data-table="addresses" id="addresses_receipient" name="addresses_receipient" onblur=
- "dataform.savefield(this);" type="text">
- </div>
- </div>
- <div class="cell container" style="width: 120px;">
- <div class="">
- <label class="label" for="addresses_clientnumber">Kundern-Nr.</label> <input class="input data_addresses border text" data-column="clientnumber" data-id="" data-table="addresses" id="addresses_clientnumber" name="addresses_clientnumber"
- onblur="dataform.savefield(this);" placeholder="YYMMDDNNN" type="text">
- </div>
- </div>
- </div>
- <div class="row">
- <div class="cell" style="width: 60px;">
- <div class="">
- <label class="label" for="addresses_title">Titel</label> <input class="input border data_addresses text" data-column="title" data-id="" data-table="addresses" id="addresses_title" name="addresses_title" onblur="dataform.savefield(this);"
- type="text">
- </div>
- </div>
- <div class="cell" style="width: 300px;">
- <div class="">
- <label class="label" for="addresses_prename">Vorname</label> <input class="input border data_addresses text" data-column="prename" data-id="" data-table="addresses" id="addresses_prename" name="addresses_prename" onblur=
- "dataform.savefield(this);" type="text">
- </div>
- </div>
- <div class="cell" style="width: 300px;">
- <div class="">
- <label class="label" for="addresses_surname">Nachname</label> <input class="input border data_addresses text" data-column="surname" data-id="" data-table="addresses" id="addresses_surname" name="addresses_surname" onblur=
- "dataform.savefield(this);" type="text">
- </div>
- </div>
- </div>
- <div class="row">
- <div class="cell container" style="width: 660px;">
- <div class="">
- <label class="label" for="addresses_address">Adresse</label> <input class="input border data_addresses text" data-column="address" data-id="" data-table="addresses" id="addresses_address" name="addresses_address" onblur=
- "dataform.savefield(this);" type="text">
- </div>
- </div>
- </div>
- <div class="row">
- <div class="cell container" style="width: 60px;">
- <div class="">
- <label class="label" for="addresses_country">Land</label> <input class="input border data_addresses text" data-column="country" data-id="" data-table="addresses" id="addresses_country" name="addresses_country" onblur=
- "dataform.savefield(this);" type="text">
- </div>
- </div>
- <div class="cell container" style="width: 120px;">
- <div class="">
- <label class="label" for="addresses_zip">PLZ</label> <input class="input border data_addresses text" data-column="zip" data-id="" data-table="addresses" id="addresses_zip" name="addresses_zip" onblur="dataform.savefield(this);" type=
- "text">
- </div>
- </div>
- <div class="cell container" style="width: 480px;">
- <div class="">
- <label class="label" for="addresses_city">Ort</label> <input class="input data_addresses border text" data-column="city" data-id="" data-table="addresses" id="addresses_city" name="addresses_city" onblur="dataform.savefield(this);" type=
- "text">
- </div>
- </div>
- </div>
- <div class="row">
- <div class="cell container" style="width: 400px;">
- <div class="">
- <label class="label" for="addresses_email">E-mail</label> <input class="input data_addresses border text" data-column="email" data-id="" data-table="addresses" id="addresses_email" name="addresses_email" onblur="dataform.savefield(this);"
- type="text">
- </div>
- </div>
- </div>
- <div class="row">
- <div class="cell container" style="width: 400px;">
- <div class="">
- <label class="label" for="addresses_phone">Telefon</label> <input class="input border text" data-column="phone" data-id="" data-table="addresses" id="addresses_phone" name="addresses_phone" onblur=
- "dataform.savefield(this);" type="text">
- </div>
- </div>
- </div>
- <div class="row">
- <div class="cell container" style="width: 300px;">
- <div class="">
- <label class="label" for="addresses_iban">Kontonummer</label> <input class="input border text" data-column="iban" data-id="" data-table="addresses" id="addresses_iban" name="addresses_iban" onblur=
- "dataform.savefield(this);" type="text">
- </div>
- </div>
- <div class="cell container" style="width: 150px;">
- <div class="">
- <label class="label" for="addresses_bic">BIC</label> <input class="input border text" data-column="bic" data-id="" data-table="addresses" id="addresses_bic" name="addresses_bic" onblur="dataform.savefield(this);" type=
- "text">
- </div>
- </div>
- </div>
- <div class="row">
- <div class="cell container" style="width: 200px;">
- <div class="">
- <label class="label" for="addresses_vatid">USt-Id</label> <input class="input border text" data-column="vatid" data-id="" data-table="addresses" id="addresses_vatid" name="addresses_vatid" onblur="dataform.savefield(this);"
- type="text">
- </div>
- </div>
- <div class="cell container" style="width: 200px;">
- <div class="">
- <label class="label" for="addresses_lang">Sprache</label> <input class="input border text" data-column="lang" data-id="" data-table="addresses" id="addresses_lang" name="addresses_lang" onblur="dataform.savefield(this);"
- type="text">
- </div>
- </div>
- </div>
- </form>
+
</div>
<div class="cell" style="width: calc( 100vw - 800px);">
<div class="bar moduletoolbar">
</div>
</div>
-</div>
\ No newline at end of file
+</div> -->
\ No newline at end of file
let addresses = {
tbl: null,
tblselector: null,
- tblcontacts: null,
- tblmailtemplates: null,
+ // tblcontacts: null,
+ // tblmailtemplates: null,
current_id: null,
viewmodule: function(){
this.gettbldata();
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);
+ rowDlbClick:function(e, row){
+ // console.log("Filter selected");
+ //
+ // console.log(fsel);
+ // addresses.current_id = fsel[0].id;
+ addresses.edit();
//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"},
+ {title: "Nr.", field: "clientnumber",headerFilter:"input" },
+ {title: "Name", field: "receipient",headerFilter:"input" },
+ {title: "Adresse",field: "address" },
+ {title: "PLZ", field: "zip" },
+ {title: "Ort",field: "city"},
+ {title: "Land",field: "country"},
+ {title: "E-mail",field: "email"},
+ {title: "Tel.",field: "phone"},
]
});
+ // 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){
if (document.getElementById("#tbl_addressselect")){
addresses.initSelector();
}
myapp.loaddialog("confirm").then(result => {
+ });
+ myapp.loaddialog("Address").then(result => {
+
});
},
initSelector: function(){
},
gettbldata: function(idsel){
- db.queryarray("select id,receipient from addresses order by receipient").then(data => {
+ db.queryarray("select * from addresses order by receipient").then(data => {
addresses.tbl.setData(data).then(res => {
if (idsel){
addresses.tbl.selectRow(idsel);
return false;
},
- edit: function (selid){
- addresses.current_id = selid;
+ edit: function (){
+ let fsel = addresses.tbl.getSelectedData();
+ addresses.current_id = fsel[0].id;
dataform.cleanform('addresses');
- db.query("select * from addresses where id='"+selid+"';").then(data => {
+ db.query("select * from addresses where id='"+fsel[0].id+"';").then(data => {
console.log("Address Data:",data);
dataform.fillform('addresses',{},data);
+ myapp.viewdialog("Address");
}).catch(e => { console.log(e);});
// postData({"get":"addresslist","dbschema":"dks","id":selid}).then(data => {
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);
+ //addresses.current_id = fsel[0].id;
+ addresses.edit();
});
}).catch(e => { console.log(e);});;
}).catch(e => { console.log(e);});;
duplicate: function(){
},
+ save: function(){
+ let aflds = dataform.getformcontent("addresses",{"addresses":{}});
+ aflds.addresses["id"]=addresses.current_id;
+ let sql = db.create_replace("addresses",aflds.addresses);
+ console.log(sql);
+ db.execAsync(sql).then(res => {
+ //invoice.getBookingData();
+ myapp.closeDialog("Address");
+ });
+ }
}
\ No newline at end of file
let booking = {
- editors:{"invoicebooking_description":null},
+ // editors:{"invoicebooking_description":null},
initDialog: function(){
- tinymce.init({
- selector: '#invoicebooking_description',
- plugins: 'paste searchreplace autolink directionality visualblocks visualchars template charmap nonbreaking textpattern noneditable charmap autoresize ',
- menubar: false,
- entity_encoding : 'raw',
- toolbar: 'undo redo | bold italic underline strikethrough | fontselect fontsizeselect | forecolor removeformat | charmap',
- toolbar_sticky: true,
- language: 'de',
- statusbar: false,
- forced_root_block : '',
- min_height: 150,
- branding: false,
- contextmenu: false,
- });
+ // tinymce.init({
+ // selector: '#invoicebooking_description',
+ // plugins: 'paste searchreplace autolink directionality visualblocks visualchars template charmap nonbreaking textpattern noneditable charmap autoresize ',
+ // menubar: false,
+ // entity_encoding : 'raw',
+ // toolbar: 'undo redo | bold italic underline strikethrough | fontselect fontsizeselect | forecolor removeformat | charmap',
+ // toolbar_sticky: true,
+ // language: 'de',
+ // statusbar: false,
+ // forced_root_block : '',
+ // min_height: 150,
+ // branding: false,
+ // contextmenu: false,
+ // });
}
// current_id: null,
// loaddata: function(id){
</div>
<div class="row" id="row_invoicetemplate">
<div class="cell" style="width: 300px;">
- <label class="label" for="invoices_id_template">Vorlage</label>
+ <label class="label" for="invoices_id_template">Druck-Vorlage</label>
<select class="select border data_invoices" data-column="id_template" data-id="" data-selected="" data-table="invoices" id="invoices_id_template" name="invoices_id_template" onchange="dataform.savefield(this);" value="">
</select>
</div>
</div>
+ <div class="row" id="row_mailtemplate">
+ <div class="cell" style="width: 300px;">
+ <label class="label" for="invoices_mailtemplate">E-Mail-Vorlage</label>
+ <select class="select border data_invoices" data-column="mailtemplate" data-id="" data-selected="" data-table="invoices" id="invoices_mailtemplate" name="invoices_mailtemplate" onchange="dataform.savefield(this);" value="">
+ </select>
+ </div>
+ </div>
<div class="row">
<div class="cell" style="max-width: 140px;">
<label class="label" for="invoices_invoicedate">Datum</label>
bookingtbl: null,
documents: {},
//addresstbl: null,
- selects:{"invoices_invoicetype":null,"invoices_status":null,"invoices_id_template":null},
+ selects:{"invoices_invoicetype":null,"invoices_status":null,"invoices_id_template":null,"invoices_mailtemplate":null},
viewmodule: function(id){
myapp.loadmodule('invoices','invoice').then(result => {
dataform.cleanform('invoice');
select: "#invoices_id_template",
showSearch: false
});
+ invoice.selects["invoices_mailtemplate"] =new SlimSelect({
+ select: "#invoices_mailtemplate",
+ showSearch: false
+ });
// invoice.selects["invoices_id_accounts"] = new SlimSelect({
// select: "#invoices_id_accounts",
//invoice.getAccountsList();
invoice.getReportList();
+ invoice.getMailTemplates();
invoice.getStatusList();
invoice.getDocumentList();
invoice.initbookings();
{title: "Einheit",field: "unit",width: 80 },
{title: "Preis", field: "unitamount",headerSort: false, formatter:"money",hozAlign:"right",width: 80, formatterParams:{ decimal:",", thousand:".", symbol:"€", symbolAfter:"p", precision:2}},
{title: "MwSt (%)", field: "vatpercent",headerSort: false, formatter:"money",hozAlign:"right",width: 70, formatterParams:{ decimal:",", thousand:".", symbol:"%", symbolAfter:"p", precision:2}},
- {title: "Netto", field: "netamount",headerSort: false, formatter:"money",hozAlign:"right",width: 100, formatterParams:{ decimal:",", thousand:".", symbol:"€", symbolAfter:"p", precision:2},bottomCalc:"sum",bottomCalcFormatter:"money",bottomCalcFormatterParams:{ decimal:",", thousand:".", symbol:"€", symbolAfter:"p", precision:2, }},
+ {title: "Netto", field: "netamount",headerSort: false, formatter:"money",hozAlign:"right",width: 100, formatterParams:{ decimal:",", thousand:".", symbol:"€", symbolAfter:"p", precision:2},bottomCalc:"sum",bottomCalcFormatter:"money",bottomCalcFormatterParams:{ decimal:",", thousand:".", symbol:"€", symbolAfter:"p", precision:2 }},
{title: "MwSt", field: "taxamount",headerSort: false, formatter:"money",hozAlign:"right",width: 90, formatterParams:{ decimal:",", thousand:".", symbol:"€", symbolAfter:"p", precision:2},bottomCalc:"sum",bottomCalcFormatter:"money",bottomCalcFormatterParams:{ decimal:",", thousand:".", symbol:"€", symbolAfter:"p", precision:2, }},
{title: "Brutto", field: "grossamount",headerSort: false, formatter:"money",hozAlign:"right",width: 100, formatterParams:{ decimal:",", thousand:".", symbol:"€", symbolAfter:"p", precision:2},bottomCalc:"sum",bottomCalcFormatter:"money",bottomCalcFormatterParams:{ decimal:",", thousand:".", symbol:"€", symbolAfter:"p", precision:2, }},
//,bottomCalcFormatter:"money", bottomCalcFormatterParams:{ decimal:",", thousand:".", symbol:"€", symbolAfter:"p", precision:2}
console.log(files);
let fileext = /\.(docx$|odt$)+/i;
files.forEach(file => {
- if (fileext.match(file)) {
+ console.log(file);
+ if (file.match(fileext)) {
replist.push({"value":file,"text":file});
}
});
});
return false;
},
+ getMailTemplates: function(){
+ console.log("read template path",preferences.global.currentdataset.datapath + '/templates/email');
+ fs.readdir(preferences.global.currentdataset.datapath + '/templates/email', (err, files) => {
+ if (err) console.log(err);
+ else {
+ let replist = [];
+ console.log(files);
+ let fileext = /\.(eml$|msg$)+/i;
+ files.forEach(file => {
+ console.log(file);
+ if (file.match(fileext)) {
+ replist.push({"value":file,"text":file});
+ }
+ });
+ dataform.fillselectlist(invoice.selects["invoices_mailtemplate"],replist,'value','text');
+ }
+ });
+ return false;
+ },
getStatusList: function(){
db.queryarray("SELECT id, status,color FROM statustypes where reporttypes LIKE '%\"invoice\"%' ORDER BY pos;").then(data => {
let stypes = [];
},
createPDF: function(){
//let idreport = invoice.selects["invoices_id_template"].selected();
- let idreport= 'invoice/' + 'simple.odt';
+ let idreport= 'invoice/' + invoice.selects["invoices_id_template"].selected();
let fname = document.getElementById("invoices_businessyear").value +"/" + preferences.defaultdata.fileprefix +document.getElementById("invoices_reference").value;
//"book":{"type":"queryarray","sql":"SELECT sku, replace(quantity,'.',',') as quantity, replace(printf('%.2f',unitamount),'.',',') as unitamount, unit, name, description, replace(printf('%.2f',taxamount),'.',',') as taxamount, replace(printf('%.2f',taxpercent),'.',',') as taxpercent, replace(printf('%.2f',netamount),'.',',') as netamount FROM bookings where id_invoices= '%%id%%';"},
//"vat":{"type":"query","sql":"select case when count(taxpercent)=1 then taxpercent else null end as taxpercent from (select replace(taxpercent,'.',',') as taxpercent from bookings where id_invoices= '%%id%%' group by taxpercent) xx;"}
if (gtaxpercent != ""){
gtaxpercent = gtaxpercent + "%";
}
- repdata["vatpercent"] = gtaxtpercent;
- reportnew.generate(idreport,repdata, fname,invoice.afterPDFCreation);
+ repdata["vatpercent"] = gtaxpercent;
+ report.generate(idreport,repdata, fname,invoice.afterPDFCreation);
});
});
afterPDFCreation: function(data){
console.log(data);
- // if (data && data.file){
- // document.getElementById("invoices_pdffile").value=data.file;
- // invoice.openPDF();
- // dataform.savefield(document.getElementById("invoices_pdffile"));
- // }
- // invoice.hasPDF();
+ if (data && data.file){
+ document.getElementById("invoices_pdffile").value=data.file;
+ invoice.openPDF();
+ dataform.savefield(document.getElementById("invoices_pdffile"));
+ }
+ invoice.hasPDF();
},
openPDF: function(){
if (document.getElementById("invoices_pdffile").value != ''){
}
},
sendEmail: function(){
+ db.query("select inv.accountvatid, inv.clientnumber, inv.payedamount, strftime('%d.%m.%Y',inv.invoicedate) as invoicedate, strftime('%d.%m.%Y',inv.deadlinedate) as deadlinedate, inv.footertext, inv.reference, inv.headertext, inv.pdffile, inv.offerreference, inv.referencenumber, inv.accountname, inv.accountaddress, inv.accountzip, inv.accountcity, inv.accountcountry, replace(printf('%.2f',sum(bk.netamount)),'.',',') as netamount,inv.footertext,inv.headertext,replace(printf('%.2f',sum(bk.taxamount)),'.',',') as vatamount, replace(printf('%.2f',sum(bk.netamount + bk.taxamount)),'.',',') as grossamount from invoices inv join bookings bk on (inv.id=bk.id_invoices) where inv.id = '"+ invoice.current_id +"';").then(repdata => {
+ let idacc = document.getElementById("invoices_id_accounts").value;
+ db.query("select * from addresses where id='" + idacc+ "';").then( accdata => {
+ email.create(invoice.selects["invoices_mailtemplate"].selected(),repdata,accdata);
+ });
+
+ });
email.openthunderbird()
},
dataform.cleanform("invoicebooking");
if (sel[0]){
db.query("select * from bookings where id='"+ sel[0].id +"'").then(bdata => {
- //console.log(bdata);
+ console.log(bdata);
dataform.fillform("invoicebooking",{},bdata);
myapp.viewdialog("InvoiceBooking");
}).catch(e => { console.log(e);});;
init: function(){
products.tbl = new Tabulator("#tbl_products",{
headerFilterPlaceholder: "filter...",
- groupBy:["producttype", "productgroup"],
- groupStartOpen:[true, true],
+ //groupBy:["producttype", "productgroup"],
+ //groupStartOpen:[true, true],
height: "calc(100vh - 60px)",
layout: "fitColumns",
selectable: 1,
<div class="row">
<div class="container cell" style="width: 400px;">
<form id="frm_defaultdata">
- <fieldset>
- <legend>Unternehmens-Daten</legend>
-
- <div class="row container group_container">
- <div class="">
- <input class="input border text data_defaultdata" data-column="pref" data-id="company" data-table="defaultdata" id="defaultdata_company" onblur="dataform.savefield(this);" placeholder="Name / Firma" type="text" value="DKS s.à r.l.">
- </div>
- <div class="">
- <input class="input border text data_defaultdata" data-column="pref" data-id="address" data-table="defaultdata" id="defaultdata_address" onblur="dataform.savefield(this);" placeholder="Adresse" type="text" value="4, rue Principale">
- </div>
- <div class="row">
- <div class="cell" style="width: 40px;">
- <div class="">
- <input class="input border text data_defaultdata" data-column="pref" data-id="country" data-table="defaultdata" id="defaultdata_country" onblur="dataform.savefield(this);" type="text" value="L">
- </div>
- </div>
- <div class="cell" style="width: 90px;">
- <div class="">
- <input class="input border text data_defaultdata" data-column="pref" data-id="zip" data-table="defaultdata" id="defaultdata_zip" onblur="dataform.savefield(this);" placeholder="PLZ" type="text" value="3770">
- </div>
- </div>
- <div class="cell" style="width: 270px;">
- <div class="">
- <input class="input border text data_defaultdata" data-column="pref" data-id="city" data-table="defaultdata" id="defaultdata_city" onblur="dataform.savefield(this);" placeholder="Ort" type="text" value="Tétange">
- </div>
- </div>
- </div>
- <div class="">
- <input class="input border text data_defaultdata" data-column="pref" data-id="email" data-table="defaultdata" id="defaultdata_email" onblur="dataform.savefield(this);" placeholder="E-mail" type="text" value="info@dks.lu">
- </div>
- <div class="">
- <input class="input border text data_defaultdata" data-column="pref" data-id="website" data-table="defaultdata" id="defaultdata_website" onblur="dataform.savefield(this);" placeholder="Webseite" type="text">
- </div>
- <div class="row">
- <div class="cell">
- <div class="">
- <input class="input border text data_defaultdata" data-column="vatid" data-id="" data-table="adresses" id="adresses_vatid-" name="adresses_vatid" onblur="dataform.savefield(this);" placeholder="USt-Id" type="text" value="LU 2537 5617">
- </div>
- </div>
- <div class="cell">
- <div class="">
- <input class="input border text data_defaultdata" data-column="rcs" data-id="" data-table="adresses" id="adresses_rcs-" name="adresses_rcs" onblur="dataform.savefield(this);" placeholder="Handelsregister" type="text">
- </div>
- </div>
- </div>
- </div>
- </fieldset>
<fieldset>
<legend>Standard-Werte</legend>
<div class="container group_container">
<div class="row">
<div class="cell">
<label class="label" for="defaultdata_vat">Mehrwertsteuer</label>
- <input class="input border number right-align text-align-right data_defaultdata" data-column="pref" data-id="vat" data-table="defaultdata" id="defaultdata_vat" onblur="dataform.savefield(this);" placeholder="Mehrwertsteuer" text-align-right="" type="number" value="17.00">
+ <input class="input border number right-align percent text-align-right data_defaultdata" data-column="pref" data-id="vat" data-table="defaultdata" id="defaultdata_vat" onblur="dataform.savefield(this);" placeholder="Mehrwertsteuer" text-align-right="" type="number" value="">
</div>
<div class="cell">
<label class="label" for="defaultdata_pref-invoicedeadlinedays">Fälligkeit (Tage)</label> <input class="input border number right-align text-align-right data_defaultdata" data-column="pref" data-id="invoicedeadlinedays" data-table="defaultdata" id=
- "defaultdata_pref-invoicedeadlinedays" onblur="dataform.savefield(this);" placeholder="Tage" text-align-right="" type="number" value="30">
+ "defaultdata_pref-invoicedeadlinedays" onblur="dataform.savefield(this);" placeholder="Tage" text-align-right="" type="number" value="">
</div>
</div>
<div id="row_defaultinvoice">
<div class="container group_container">
<div class="">
<label class="label" for="defaultdata_mailapp">Mail-Programm</label>
- <input class="input border text data_defaultdata" data-column="pref" data-id="mailapp" data-table="defaultdata" id="defaultdata_mailapp" onblur="dataform.savefield(this);" placeholder="Mail-App" type="text" value="">
+ <select class="select border text data_defaultdata" data-column="pref" data-id="mailapp" data-table="defaultdata" id="defaultdata_mailapp" onblur="dataform.savefield(this);" placeholder="Mail-App" type="text" value="">
+ <option value="thunderbird">Thunderbird</option>
+ <option value="outlook">Outlook</option>
+ </select>
</div>
</div>
</fieldset>
"sumchecker": "^3.0.1"
}
},
+ "@kenjiuno/decompressrtf": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/@kenjiuno/decompressrtf/-/decompressrtf-0.1.3.tgz",
+ "integrity": "sha512-Hpgi2jbP73+2Lri8MJ/Jbf8ZIViuG4Z4UsPU3bEqWB6MY8Z6kd8KDLmw/5pUVQq4gvKtDUto8DtXSuEUo3fpPA=="
+ },
+ "@kenjiuno/iconvlite-wrapper-with-iso2022jp": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/@kenjiuno/iconvlite-wrapper-with-iso2022jp/-/iconvlite-wrapper-with-iso2022jp-0.1.0.tgz",
+ "integrity": "sha512-glVyhmil2HejINatYPkXMkGZ8M+zN1hAhUm8mzypI+Fm5a1G4v4V6liXK1NLrlBOHAh3SNfzEICc0PxcOmpq7A==",
+ "requires": {
+ "encoding-japanese": "^1.0.29",
+ "iconv-lite": "^0.4.24"
+ }
+ },
+ "@kenjiuno/msgreader": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/@kenjiuno/msgreader/-/msgreader-1.4.0.tgz",
+ "integrity": "sha512-nBu7VTdIL9z/xBX3QFX/SOU+vknHorzIn2XygFRV4W2Sp2VMFBJ//2DgxKlR0wwK59CgNZjtDRDoazET5StgQg==",
+ "requires": {
+ "@kenjiuno/decompressrtf": "^0.1.3",
+ "@kenjiuno/iconvlite-wrapper-with-iso2022jp": "^0.1.0"
+ }
+ },
"@sindresorhus/is": {
"version": "0.14.0",
"resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz",
}
}
},
+ "eml-format2": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/eml-format2/-/eml-format2-0.5.0.tgz",
+ "integrity": "sha512-dDigfpSWSSzNHBG+U9ZDMIgR7CXPiBnPyW2cR6DWW/f+NDwQ2E45WhgFmADHAkl/T3Vjegn7amg9l+bJ3WD8ew=="
+ },
"encodeurl": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
"dev": true,
"optional": true
},
+ "encoding-japanese": {
+ "version": "1.0.30",
+ "resolved": "https://registry.npmjs.org/encoding-japanese/-/encoding-japanese-1.0.30.tgz",
+ "integrity": "sha512-bd/DFLAoJetvv7ar/KIpE3CNO8wEuyrt9Xuw6nSMiZ+Vrz/Q21BPsMHvARL2Wz6IKHKXgb+DWZqtRg1vql9cBg=="
+ },
"end-of-stream": {
"version": "1.4.4",
"resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
"electron-packager": "^15.1.0"
},
"dependencies": {
+ "@kenjiuno/msgreader": "^1.4.0",
"carbone": "^2.1.1",
+ "eml-format2": "^0.5.0",
"sqlite3": "^5.0.0"
}
}
--- /dev/null
+if ((-not (Get-Variable -Name PSScriptRoot -ValueOnly -ErrorAction SilentlyContinue)) -and
+ ($scriptBlockFile = $MyInvocation.MyCommand.ScriptBlock.File)) {
+ $PSScriptRoot = $MyInvocation.MyCommand.ScriptBlock.File
+
+}
+$PSScriptRoot
+$myfp = $PSScriptRoot + "\install_choco.ps1"
+$myfp
+Start-Process PowerShell -Verb RunAs -WorkingDirectory $PSScriptRoot -ArgumentList $myfp
\ No newline at end of file
$env:ChocolateyInstall="$InstallDir"
Set-ExecutionPolicy Bypass -Scope Process -Force;
iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))
-choco install python -y
+#choco install python -y
choco install libreoffice-still -y
\ No newline at end of file
; Script generated by the Inno Setup Script Wizard.
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!
-#define public MyAppVersion "1.0.1"
-#define public MyOutputDir "D:\Workspace\invoicejournal\release"
-#define public MySourceDir "D:\Workspace\invoicejournal"
-#define public MySetupName "setup_invoicejournal.exe"
+;#define public MyAppVersion "1.0.1"
+;#define public MyOutputDir "D:\Workspace\invoicejournal\release"
+;#define public MySourceDir "D:\Workspace\invoicejournal"
+;#define public MySetupName "setup_invoicejournal.exe"
#define MyAppName "Invoice Journal"
-#define MyAppPublisher "DKS s.�r.l."
+#define MyAppPublisher "DKS s.à r.l."
#define MyAppURL "https://www.dks.lu/"
#define MyAppExeName "invoicejournal.exe"
DisableWelcomePage=yes
DisableProgramGroupPage=yes
DisableDirPage=yes
-UserInfoPage=yes
+;UserInfoPage=yes
CloseApplications=force
CloseApplicationsFilter=invoicejournal.exe
LicenseFile={#MySourceDir}\install\EULA_Default.rtf
[Files]
Source: "{#MySourceDir}\release-builds\invoicejournal-win32-x64\invoicejournal.exe"; DestDir: "{app}"; Flags: overwritereadonly ignoreversion
Source: "{#MySourceDir}\release-builds\invoicejournal-win32-x64\*"; DestDir: "{app}"; Flags: overwritereadonly ignoreversion recursesubdirs createallsubdirs
-Source: "{#MySourceDir}\install\iinstall_choco.ps1"; DestDir: "{tmp}"
+Source: "{#MySourceDir}\install\install_choco.ps1"; DestDir: "{tmp}"
[Icons]
Name: "{autoprograms}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"
Name: "{autodesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"
[Run]
-Filename: "powershell.exe";Parameters: "-ExecutionPolicy Bypass -File ""{tmp}\setup.ps1"""; WorkingDir: {tmp}; Flags: runhidden
+Filename: "powershell.exe";Parameters: "-ExecutionPolicy Bypass -File ""{tmp}\install_choco.ps1"""; WorkingDir: {tmp}; Flags: runhidden
Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent
[Code]
-function CheckSerial(Serial: String): Boolean;
-begin
- Result := (Serial <> '');
-end;
+; function CheckSerial(Serial: String): Boolean;
+; begin
+; Result := (Serial <> '');
+; end;
-function NextButtonClick(CurPageID: Integer): Boolean;
-var
- WinHttpReq: Variant;
- WMIResult: Variant;
- Url: string;
-begin
- Result := True;
- if CurPageID = wpUserInfo then
- begin
- WMIResult := GetWMIInfo('')
- WinHttpReq := CreateOleObject('WinHttp.WinHttpRequest.5.1');
- Url := 'http://localhost/license/licensecheck.php?serial=' +
- WizardForm.UserInfoSerialEdit.Text;
+; function NextButtonClick(CurPageID: Integer): Boolean;
+; var
+; WinHttpReq: Variant;
+; WMIResult: Variant;
+; Url: string;
+; begin
+; Result := True;
+; if CurPageID = wpUserInfo then
+; begin
+; WMIResult := GetWMIInfo('')
+; WinHttpReq := CreateOleObject('WinHttp.WinHttpRequest.5.1');
+; Url := 'http://localhost/license/licensecheck.php?serial=' +
+; WizardForm.UserInfoSerialEdit.Text;
- WinHttpReq.Open('GET', Url, False);
- WinHttpReq.Send('');
- { Depending on implementation of the server, use wither HTTP status code (.Status) or }
- { contents of returned "page" (.ResponseText) }
- { Here we use the HTTP status code: }
- { 200 = serial is valid, anything else = serial is invalid, }
- { and when invalid, we display .ResponseText }
- Result := (WinHttpReq.Status = 200);
- if not Result then
- MsgBox(WinHttpReq.ResponseText, mbError, MB_OK);
- end;
-end;
\ No newline at end of file
+; WinHttpReq.Open('GET', Url, False);
+; WinHttpReq.Send('');
+; { Depending on implementation of the server, use wither HTTP status code (.Status) or }
+; { contents of returned "page" (.ResponseText) }
+; { Here we use the HTTP status code: }
+; { 200 = serial is valid, anything else = serial is invalid, }
+; { and when invalid, we display .ResponseText }
+; Result := (WinHttpReq.Status = 200);
+; if not Result then
+; MsgBox(WinHttpReq.ResponseText, mbError, MB_OK);
+; end;
+; end;
\ No newline at end of file
@REM call npm run package-win64 > tmpcompile.txt
@REM cd ..
-mkdir %CD%\release-builds\invoicejournal-win32-x64\tools
-xcopy %CD%\tools\* %CD%\release-builds\invoicejournal-win32-x64\tools\
+@REM mkdir %CD%\release-builds\invoicejournal-win32-x64\tools
+@REM xcopy %CD%\tools\* %CD%\release-builds\invoicejournal-win32-x64\tools\
del %CD%\release\%appname%_%tag%_Setup.exe
echo "Compile Setup %CD%\install\windows\setup_64bit.iss"
"C:/Program Files (x86)/Inno Setup 6/ISCC.exe" /V3 /DMyAppVersion=%tag% /DMyOutputDir=%CD%\release /DMySourceDir=%CD% /DMySetupName=%appname%_%tag%_Setup %CD%\install\windows\setup_64bit.iss