<script src="js/global/request.js?v=6" type="text/javascript"></script>
<script src="js/global/myapp.js?v=6" type="text/javascript"></script>
<script src="js/dataform.js?v=6" type="text/javascript"></script>
+ <script src="js/timecalc.js?v=6" type="text/javascript"></script>
<script src="js/global/renderer.js?v=6" type="text/javascript"></script>
<script src="js/global/sqlite.js?v=6" type="text/javascript"></script>
<script src="js/global/report.js?v=6" type="text/javascript"></script>
\r
-var preferences = {\r
+let preferences = {\r
global: null,\r
page: null,\r
+ defaultdata: {}\r
}\r
\r
-var myapp = {\r
+let myapp = {\r
loadpanel: function(idpanel){\r
return new Promise(\r
function(resolve, reject){\r
document.getElementById('dlgmessage').style.display='block';\r
return false;\r
},\r
- connectdb: function(){\r
-\r
- }\r
- // loadpage(page){\r
- // location.href = page; \r
- // },\r
- // loadpage: function(data){\r
- // if (table){\r
- // table.selection = null;\r
- // }\r
- // document.getElementById("modulescripts").innerHTML ="";\r
- // document.getElementById("mainapp").innerHTML = '';\r
- // myapp.addmoduledata(data);\r
- // document.getElementById("mainapp").insertAdjacentHTML('afterbegin',data);\r
- // var re = '\<script src=\"(.+)\"\>';\r
- // var found = data.match(re);\r
- \r
- // if (found){\r
- // console.log('script found!');\r
- // console.log(found);\r
- // var se = document.createElement('script');\r
- // se.setAttribute('type', 'text/javascript');\r
- // se.setAttribute('src',found[1]);\r
- // document.getElementById("modulescripts").appendChild(se);\r
- // }\r
- // return false;\r
- // },\r
- // setpref: function(obj){\r
- // fdata = obj.dataset;\r
- // fdata["save"] = "pref";\r
- // if (obj.tagName == 'INPUT' || obj.tagName == 'SELECT' || obj.tagName == 'TEXTAREA'){\r
- // if (obj.type == 'checkbox' || obj.type == 'radio'){\r
- // if (obj.checked == true){\r
- // fdata["value"] = obj.value;\r
- // } else {\r
- // fdata["value"] = null;\r
- // }\r
- // }else {\r
- // fdata["value"] = obj.value;\r
- // }\r
- // }\r
- // req.reqdata(fdata,record.saveresult);\r
- // },\r
- \r
- // loadconfig: function() {\r
- // this.cfg = this.getSearchParams();\r
- // },\r
- \r
-\r
- // loadappview: function(panelid) {\r
- // document.getElementById('modules').style.display = 'none';\r
- // document.getElementById('appview').style.display = 'block';\r
- // //console.log(appident);\r
- // //console.log(location.origin + '/app/' + appident + '/index.html');\r
- // //location.href = location.origin + '/app/' + appident + '.html';\r
- // },\r
- // loadapppage: function(pagename) {\r
- \r
- // console.log(location.origin + '/' + pagename + '.html' + ((app.dataset)?'?db=' + myapp.dataset:''));\r
- // location.href = location.origin + '/' + pagename + '.html' + ((app.dataset)?'?db=' + myapp.dataset:'');\r
- // },\r
- // loadmodulepage: function(modulepage, data) {\r
- // var pm = [];\r
- // if (typeof data == 'object') {\r
- // var xdata = [];\r
- // for (var i in data) {\r
- // var value = '';\r
- // if (typeof(data[i]) == 'object') {\r
- // value = encodeURIComponent(JSON.stringify(data[i]));\r
- // } else {\r
- // value = encodeURIComponent(data[i]);\r
- // }\r
- // xdata.push(i + "=" + value);\r
- // }\r
- // rdata = xdata.join("&");\r
- // } \r
- // if (app.dataset){\r
- // pm.push("db=" + myapp.dataset);\r
- // }\r
- // if (pm.length > 0) {\r
- // modulepage = modulepage + "?" + pm.join("&") + ((rdata != "")?'&' + rdata:"");\r
- // }\r
- \r
- // document.getElementById("moduleframe").setAttribute('src', 'modules/' + modulepage);\r
- // document.getElementById('appview').style.display = 'none';\r
- // document.getElementById('modules').style.display = 'block';\r
- \r
- \r
- // },\r
- \r
- // logout: function() {\r
- // req.reqdata("POST", location.href, { "logout": "1" }, admin.reloadpage);\r
-\r
- // },\r
- // reloadpage: function() {\r
- // location.href = location.href;\r
- // },\r
- ,getdatasets: function() {\r
- //req.reqdata("POST", "app.cgi", { "databases": "1" }, myapp.loaddatasets);\r
- },\r
- // getpreference: function(pagename, callback) {\r
- // req.reqdata("POST", "db.cgi", { "db": basedb, "type": "array", "sql": "select * from preferences where page='" + pagename + "' and ident='" + admin.getCookie("dksident") + "';" }, callback);\r
- // },\r
- // setpreference: function(pagename, prefdata) {\r
- // var txtprefdata = encodeURIComponent(prefdata);\r
- // if (typeof prefdata == 'object') {\r
- // txtprefdata = encodeURIComponent(JSON.stringify(prefdata));\r
- // }\r
- // req.reqdata("POST", "db.cgi", { "db": basedb, "exec": "INSERT INTO preferences (ident,page,preferences) VALUES ('" + admin.getCookie("dksident") + "','" + pagename + "','" + txtprefdata + "');" }, null);\r
- // },\r
- loaddatasets: function(data) {\r
- console.log("loadeddatasets");\r
- console.log(data);\r
- myapp.dataset=data.databases[0].id;\r
- // var gdt = document.getElementById('globaldatasets');\r
- // //console.log(gdt);\r
- // gdt.innerHTML = '';\r
- // if (data) {\r
- // var opts = '';\r
- // for (var i in data) {\r
- // opts += '<option value="' + data[i].datastore + '">' + data[i].name + '</option>';\r
- // }\r
- // gdt.innerHTML = opts;\r
- // }\r
- // if (admin.current_dataset.db) {\r
-\r
- // } else {\r
- // admin.current_dataset["db"] = gdt.value;\r
- // }\r
- // //console.log(admin.current_dataset);\r
+ setpref: function(key,value){\r
+ db.execAsync("REPLACE INTO defaultdata (id,pref) VALUES ('"+key+"','"+value+"');").then(res => {\r
+ myapp.loadpreferences();\r
+ });\r
+ return false;\r
},\r
+ loadpreferences: function(){\r
+ db.queryarray("select id,pref from defaultdata;").then(res => {\r
+ for (var i=0;i<res.length;i++){\r
+ preferences["defaultdata"][res[i].id] = res[i].pref;\r
+ }\r
+ });\r
+ return false;\r
+ }\r
// getCookie: function(cname) {\r
// var name = cname + "=";\r
// var decodedCookie = decodeURIComponent(document.cookie);\r
preferences.global = usersystem.getPreference('invoicejournal');\r
preferences.global["currentdataset"] = usersystem.getPreference(preferences.global.dataset);\r
}\r
+ \r
console.log("Content loaded",preferences);\r
db.connect(preferences.global.currentdataset.datapath + "/" + preferences.global.currentdataset.database);\r
- \r
+ myapp.loadpreferences();\r
//.newuuid().then(data => {console.log(data);});\r
myapp.viewpanel("index");\r
//index.init();\r
db.dbh = new sqlite3.Database(dbfile);
},
query: function(sql){
+ process.stderr.write("Query:\n-----\n"+sql+"\n-----\n");
return new Promise((resolve, reject) => {
db.dbh.get(`${sql}`, (err, row) => {
if (err) {
});
},
queryarray: function(sql){
+ process.stderr.write("QueryArray:\n-----\n"+sql+"\n-----\n");
return new Promise((resolve, reject) => {
let queries = [];
db.dbh.each(`${sql}`, (err, row) => {
});
},
querybykey: function(key,sql){
+ process.stderr.write("QueryByKey:\n-----\n"+sql+"\n-----\n");
return new Promise((resolve, reject) => {
let ret = {}
db.dbh.each(`${sql}`, (err, row) => {
});
},
exec: function(sql,callback){
+ process.stderr.write("Exec:\n-----\n"+sql+"\n-----\n");
try {
return db.dbh.exec(sql);
} catch(e){
},
execAsync: function(sql){
+ process.stderr.write("ExecAsync:\n-----\n"+sql+"\n-----\n");
return new Promise((resolve, reject) => {
db.dbh.exec(`${sql}`, (err, row) => {
if (err) {
myapp.viewpanel('index');
},
init(){
- db.queryarray("select id,pref from defaultdata;").then(res => {
- for (var i=0;i<res.length;i++){
- preferences["defaultdata"][res[i].id] = res[i].pref;
- }
- console.log(preferences);
- });
+ // db.queryarray("select id,pref from defaultdata;").then(res => {
+ // console.log(res);
+ // for (var i=0;i<res.length;i++){
+ // console.log(res[i]);
+ // preferences["defaultdata"][res[i].id] = res[i].pref;
+ // }
+ // console.log("preferences",preferences);
+
+ // });
// index.selects["bussinessyear"] = new SlimSelect({
// select: "#bussinessyear",
// showSearch: false,
dataform.filldatalist(document.getElementById("list_invoicebooking_units"),units,'unit');
})
},
+ dlgSelectAddress(){
+ db.queryarray("select * from addresses order by receipient").then(data => {
+ addresses.tblselector.setData(data).then(dd => {
+ if ((document.getElementById("invocies_id_account")) && (document.getElementById("invocies_id_account").value != '')){
+ addresses.tblselector.selectRow(document.getElementById("invoices_id_accounts").value);
+ }
+ });
+ myapp.viewdialog("SelectAddress");
+ });
+},
changeAccount: function(obj){
- let adrsel = adresses.tblselector.getSelectedData();
+ let adrsel = addresses.tblselector.getSelectedData();
if (adrsel[0]){
document.getElementById("invoices_id_accounts").value= adrsel[0].id;
document.getElementById("invoices_accountname").value= adrsel[0].receipient;
let dldate = moment(document.getElementById("invoices_deadlinedate").value);
dataform.setValue(document.getElementById("invoices_deadlinedays"),dldate.diff(invdate,'days'));
},
- setReference(data){
+ setReference(){
// console.log("Set Reference");
// console.log(data);
document.getElementById("invoices_reference").value = data[0]["setinvoicereference"];
// invoice.calculate();
// }
},
+ 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);
+ return newref;
+ },
calculate: function(){
//let invid = document.getElementById("invoices_id").value;
let invtype = document.getElementById("invoices_invoicetype").value;
let payedval = document.getElementById("invoices_grossamount").value;
dataform.setValue(document.getElementById("invoices_payedamount"),payedval);
},
- dlgSelectAddress(){
- db.queryarray("select * from addresses order by receipient").then(data => {
- addresses.tblselector.setData(data).then(dd => {
- addresses.tblselector.selectRow(document.getElementById("invoices_id_accounts").value);
- });
- myapp.viewdialog("SelectAddress");
- });
- },
+
addBooking:function(){
dataform.cleanform();
db.newuuid().then( nuuid => {
"sended":{"value":"sended","text" : "verschickt", "class": "text-orange"},
"overdue":{"value":"overdue","text" : "überfällig", "class": "text-red"},
"payed":{"value":"payed","text" : 'bezahlt', "class": "text-green"},
- "canceled":{"value":"canceled","text" : "storniert", "class": "text-grey"}
+ "canceled":{"value":"canceled","text" : "storniert", "class": "text-grey"},
+ "reminder1":{"value":"reminder1","text" : "Mahnung 1", "class": "text-red"},
+ "reminder2":{"value":"reminder2","text" : 'Mahnung 2', "class": "text-red"},
+ "reminder3":{"value":"reminder3","text" : "Mahnung 3", "class": "text-red"}
}
let headerstatustypes = {
"sended":"verschickt",
"overdue":"überfällig",
"payed":"bezahlt",
- "canceled":"storniert"
+ "canceled":"storniert",
+ "reminder1":"Mahnung 1",
+ "reminder2":"Mahnung 2",
+ "reminder3":"Mahnung 3"
};
//selectedfilter: '2020',
viewpanel: function(){
myapp.viewpanel('invoices');
+ this.gettbldata();
},
init: function(){
let cyear = moment(new Date()).format('YYYY');
]
});
- this.gettbldata();
+
},
gettbldata: function(){
let sel= invoices.tbl.getSelectedData();
/*--(to_char(inv.invoicedate::timestamp with time zone, 'YYYY'::text) || '-Q'::text) || to_char(inv.invoicedate::timestamp with time zone, 'Q'::text) AS quarter, --to_char(inv.invoicedate::timestamp with time zone, 'YYYY-MM'::text) AS month,*/
- db.queryarray("SELECT inv.invoicedate, inv.id, inv.direction, inv.accountname, inv.reference, inv.status, sum(COALESCE(bk.netamount, 0.0)) AS netamount, sum(COALESCE(bk.taxamount, 0.0)) AS vatamount, sum(COALESCE(bk.netamount, 0.0) + COALESCE(bk.taxamount, 0.0)) AS grossamount, inv.businessyear, inv.id_accounts, inv.invoicetype FROM invoices inv LEFT JOIN bookings bk ON inv.id = bk.id_invoices GROUP BY inv.id ORDER BY inv.invoicedate DESC;") .then(data => {
+ db.queryarray("SELECT inv.invoicedate, inv.id, inv.accountname, inv.reference, inv.status, sum(COALESCE(bk.netamount, 0.0)) AS netamount, sum(COALESCE(bk.taxamount, 0.0)) AS vatamount, sum(COALESCE(bk.netamount, 0.0) + COALESCE(bk.taxamount, 0.0)) AS grossamount, inv.businessyear, inv.id_accounts, inv.invoicetype FROM invoices inv LEFT JOIN bookings bk ON inv.id = bk.id_invoices GROUP BY inv.id ORDER BY inv.invoicedate DESC;") .then(data => {
invoices.tbl.setData(data).then(dd => {
if (sel[0]){
invoices.tbl.selectRow(sel[0].id);
});
return false;
},
-
loadfilterdata: function(data){
if (data && data.sqldata) { invoices.tblfilter.setData(data.sqldata);}
},
let today=moment().format('YYYY-MM-DD');
let deadline=moment().add(preferences.defaultdata.invoicedeadlinedays,'days').format('YYYY-MM-DD');
- db.execAsync("INSERT INTO invoices (id,invoicedate,deadlinedays,deadlinedate,status,id_template) VALUES ('"+newid.id+"',date('"+today+"'),'"+preferences.defaultdata.invoicedeadlinedays+"',date('"+deadline+"'),'preparation','"+preferences.defaultdata.id_invoicetemplate+"');").then( res =>{
+ db.execAsync("INSERT INTO invoices (id,invoicedate,deadlinedays,deadlinedate,status,id_template,invoicetype) VALUES ('"+newid.id+"',date('"+today+"'),'"+preferences.defaultdata.invoicedeadlinedays+"',date('"+deadline+"'),'preparation','"+preferences.defaultdata.id_invoicetemplate+"','invoice-out');").then( res =>{
db.newuuid().then(newbookingid => {
- db.execAsync("INSERT INTO bookings (id,id_invoices) VALUES ('"+ newbookingid.id+"','"+ newid+"');").then(res => {
+ db.execAsync("INSERT INTO bookings (id,id_invoices) VALUES ('"+ newbookingid.id+"','"+ newid.id+"');").then(res => {
invoice.viewpanel(newid);
});
});
duplicate: function(){
var sel = invoices.tbl.getSelectedData();
if (sel[0]) {
- //req.reqdata({"dbschema":"dks","fn":"duplicate_invoice","params":{0:sel[0].id}},invoices.gettbldata);
- postData({"dbschema":"dks","fn":"duplicate_invoice","id":sel[0].id}).then(data => {
- invoices.gettbldata();
- })
+ console.log("Duplicate:",sel[0].id);
+ db.newuuid().then(newid => {
+
+ let today=moment().format('YYYY-MM-DD');
+ let deadline=moment().add(preferences.defaultdata.invoicedeadlinedays,'days').format('YYYY-MM-DD');
+ let newref= invoice.getNewReference(today);
+ let inssql = "INSERT INTO invoices (id, id_template, id_offer, accountvatid, clientnumber, isinnereu, payedamount, businessyear, invoicedate, deadlinedays, deadlinedate, status, footertext, reference, invoicetype, headertext, pdffile, offerreference, referencenumber, id_accounts, accountname, accountaddress, accountzip, accountcity, accountcountry) SELECT '"+ newid.id+"' as id, id_template, id_offer, accountvatid, clientnumber, isinnereu, null as payedamount, businessyear, date('"+today+"') as invoicedate,'"+preferences.defaultdata.invoicedeadlinedays+"' as deadlinedays,date('"+deadline+"') as deadlinedate, 'preparation' as status, footertext, '"+newref +"' AS reference, invoicetype, headertext, pdffile, offerreference, referencenumber, id_accounts, accountname, accountaddress, accountzip, accountcity, accountcountry FROM invoices where id='"+ sel[0].id+"';";
+ console.log("Execute:" + inssql);
+ db.execAsync(inssql).then(res => {
+ db.queryarray("select * from bookings where id_invoices='"+ sel[0].id+"'").then( bc => {
+ for (var b in bc){
+ let nbc = bc[b];
+ console.log(nbc);
+ db.newuuid().then(nbuuid => {
+ console.log(nbc);
+ let bsql = "INSERT INTO bookings (id, id_invoices, id_products, producttype, sku, quantity, unitamount, unit, name, description, taxamount, taxpercent, bookingdate, netamount) SELECT '"+nbuuid.id+"' as id, '"+newid.id+"' as id_invoices, id_products, producttype, sku, quantity, unitamount, unit, name, description, taxamount, taxpercent, bookingdate, netamount FROM bookings where id='"+ nbc.id+"';";
+ console.log(bsql);
+ db.execAsync(bsql).then(res => {
+ if (b==bc.length-1){
+ invoice.viewpanel(newid.id);
+ }
+ });
+ });
+ }
+ });
+ });
+ });
}
-
}
}
\ No newline at end of file
<option class="text-grey" value="canceled">
storniert
</option>
+ <option class="text-red" value="reminder1">
+ Mahnung 1
+ </option>
+ <option class="text-red" value="reminder2">
+ Mahnung 2
+ </option>
+ <option class="text-red" value="reminder3">
+ Mahnung 3
+ </option>
</select>
</div>
</div>
"text">
</div>
<div class="cell" style="width: 200px;">
- <input class="input border text data_invoices" data-column="receipientvatid" data-id="" data-table="invoices" id="invoices_receipientvatid" name="invoices_receipientvatid" onblur="dataform.savefield(this);" placeholder="USt.-ID" type="text">
+ <input class="input border text data_invoices" data-column="accountvatid" data-id="" data-table="invoices" id="invoices_accountvatid" name="invoices_accountvatid" onblur="dataform.savefield(this);" placeholder="USt.-ID" type="text">
</div>
</div>
<div class="row">
"dataform.savefield(this);" type="text">
</div>
</div>
- <div class="row">
- <div class="cell" style="width: 300px;">
- <label class="label" for="invoices_reminderdates">Mahnungsdaten</label> <input class="input border text data_invoices" data-column="reminderdates" data-id="" data-table="invoices" id="invoices_reminderdates" name=
- "invoices_reminderdates" onblur="dataform.savefield(this);" type="text">
- </div>
- </div>
+
</div>
</div>
<div class="cell">