v20201102
authorkilian <ksaffran@dks.lu>
Mon, 2 Nov 2020 17:34:22 +0000 (18:34 +0100)
committerkilian <ksaffran@dks.lu>
Mon, 2 Nov 2020 17:34:22 +0000 (18:34 +0100)
desktopapp/index.html
desktopapp/js/global/myapp.js
desktopapp/js/global/sqlite.js
desktopapp/js/modules/index.js
desktopapp/js/modules/invoice.js
desktopapp/js/modules/invoices.js
desktopapp/panels/invoice.html

index a8e07fc..d837e83 100644 (file)
@@ -46,6 +46,7 @@
       <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> 
index 2ca8af5..8810bfe 100644 (file)
@@ -1,10 +1,11 @@
 \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
@@ -74,137 +75,20 @@ var myapp = {
       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
@@ -248,9 +132,10 @@ document.addEventListener("DOMContentLoaded", function() {
       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
index 771fffc..2b08b63 100644 (file)
@@ -9,6 +9,7 @@ let db = {
     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) {
@@ -20,6 +21,7 @@ let db = {
     });
   },
   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) => {
@@ -38,6 +40,7 @@ let db = {
     });
   },
   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) => {
@@ -56,6 +59,7 @@ let db = {
     });
   },
   exec: function(sql,callback){
+    process.stderr.write("Exec:\n-----\n"+sql+"\n-----\n");
     try {
       return db.dbh.exec(sql);
     } catch(e){
@@ -64,6 +68,7 @@ let db = {
     
   },
   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) {
index 77863c9..5711e30 100644 (file)
@@ -4,12 +4,15 @@ let index={
     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,
index b0e0e5d..c7841f3 100644 (file)
@@ -118,8 +118,18 @@ let invoice = {
       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;
@@ -146,7 +156,7 @@ let invoice = {
     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"];
@@ -169,6 +179,13 @@ let invoice = {
     //   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;
@@ -312,14 +329,7 @@ let invoice = {
     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 => {
index d64360d..0c590ae 100644 (file)
@@ -5,7 +5,10 @@ let statustypes = {
   "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 = {
@@ -16,7 +19,10 @@ let headerstatustypes = {
   "sended":"verschickt",
   "overdue":"überfällig",
   "payed":"bezahlt",
-  "canceled":"storniert"
+  "canceled":"storniert",
+  "reminder1":"Mahnung 1",
+  "reminder2":"Mahnung 2",
+  "reminder3":"Mahnung 3"
 };
 
 
@@ -50,6 +56,7 @@ let invoices = {
   //selectedfilter: '2020',
   viewpanel: function(){
     myapp.viewpanel('invoices');
+    this.gettbldata();
   },
   init: function(){
     let cyear = moment(new Date()).format('YYYY');
@@ -74,12 +81,12 @@ let invoices = {
       ]
     });
     
-    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);
@@ -91,7 +98,6 @@ let invoices = {
     });
     return false;
   },
-
   loadfilterdata: function(data){
     if (data && data.sqldata) { invoices.tblfilter.setData(data.sqldata);}
   },
@@ -109,10 +115,10 @@ let invoices = {
       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);
           });
         });
@@ -140,11 +146,33 @@ let invoices = {
   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
index 146d47a..f7a5f47 100644 (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">