adminview settings and printtemplates
authorKilian Saffran <ksaffran@dks.lu>
Mon, 25 Feb 2019 20:27:41 +0000 (21:27 +0100)
committerKilian Saffran <ksaffran@dks.lu>
Mon, 25 Feb 2019 20:27:41 +0000 (21:27 +0100)
25 files changed:
admin.html
cashbox.html
css/app.css
index.html
js/app.js [deleted file]
js/mainapp.js [new file with mode: 0644]
main.js
modules/clients/index.js
modules/products/index.js
modules/settings/db/cashbox.sql [new file with mode: 0644]
modules/settings/form_datastore.html [new file with mode: 0644]
modules/settings/form_datastore.js [new file with mode: 0644]
modules/settings/form_printtemplate.html [new file with mode: 0644]
modules/settings/form_printtemplate.js [new file with mode: 0644]
modules/settings/index.html [new file with mode: 0644]
modules/settings/index.js [new file with mode: 0644]
modules/settings/lib/datastore.js [new file with mode: 0644]
modules/settings/lib/printtemplate.js [new file with mode: 0644]
modules/stations/index.html
modules/stations/index.js
modules/tables/index.html
modules/tables/index.js
modules/transactions/index.html
modules/transactions/index.js
renderer.js

index be926a1..ebf724e 100644 (file)
@@ -45,7 +45,7 @@
 <script src="node_modules/jquery/dist/jquery.min.js"></script>
 <script src="node_modules/bootstrap/dist/js/bootstrap.bundle.min.js"></script>
 
-<script src="js/app.js"></script>
+<script src="js/mainapp.js"></script>
 <script>if (window.module) module = window.module;</script>
 <script src="renderer.js"></script>
 </body>
index e69de29..c0f4c19 100644 (file)
@@ -0,0 +1,69 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+<meta charset="UTF-8">
+<meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+<link rel="stylesheet" href="node_modules/bootstrap/dist/css/bootstrap.min.css">
+<link rel="stylesheet" href="node_modules/bootstrap-table/dist/bootstrap-table.min.css">
+<link rel="stylesheet" href="css/cashbox.epic.css">
+<link rel="stylesheet" href="css/app.css">
+<title>CASHBOX</title>
+</head>
+<body>
+    <!--New Start-->
+    <div class="d-flex" id="wrapper">
+      <div class="container">
+      <div class="row " style="margin-top: 150px;">
+          <div class="col-md-12 justify-content-center text-center">
+            <img src="img/cashbox.png" style="width: 256px;"><br/><h1 class="text-white text-center" style="width: 100%">CashBox</h1>
+          </div>
+          <div class="col-md-2 justify-content-center text-center">
+              <nav class="navbar navbar-expand-md navbar-dark bg-dark">
+                  
+                  <div class="text-center">
+             <div class="btn-group" role="group" aria-label="Basic example">
+  <button class="btn btn-primary" onclick="browserapp.loadview('cashbox');"><i class="fas fa-plus"></i><br/>Kasse</button>
+      <button class="btn btn-primary" onclick="browserapp.loadview('admin');"><i class="fas fa-edit"></i><br/>Verwaltung</button>
+     </div>
+                  </div>
+                </nav>
+          </div>
+        </div>
+      </div>
+    </div>
+            <!-- Sidebar -->
+            <!-- <div class="bg-dark border-right" id="sidebar-wrapper">
+              <div class="sidebar-heading"><a href="javascript:location.href='index.html';"><img src="img/cashbox.png" style="width: 140px;"><br/>Invoice Journal</a></div>
+              <div class="list-group list-group-flush">
+                    <a  class="list-group-item list-group-item-action bg-light" href="javascript:browserapp.loadmodule('overview');">Übersicht</a>
+                    <a  class="list-group-item list-group-item-action bg-light" href="javascript:browserapp.loadmodule('invoices');">Rechnungen</a>
+                    <a class="list-group-item list-group-item-action bg-light" href="javascript:browserapp.loadmodule('accounts');">Konten</a>
+                    <a class="list-group-item list-group-item-action bg-light" href="javascript:browserapp.loadmodule('bankaccount');">Bankkonto</a>
+                    <a class="list-group-item list-group-item-action bg-light" href="javascript:browserapp.loadmodule('offers');">Angebote</a>
+                    <a class="list-group-item list-group-item-action bg-light" href="javascript:browserapp.loadmodule('products');">Produkte</a>
+                    <a  class="list-group-item list-group-item-action bg-light" href="javascript:browserapp.loadmodule('settings');">Einstellungen</a></li>
+                   
+              </div>
+            </div> -->
+            <!-- /#sidebar-wrapper -->
+        
+            <!-- Page Content -->
+            <!-- <div id="page-content-wrapper">
+              <iframe id="moduleframe" src="modules/overview/index.html" style="width: 100%;height: 100vh; border: 0px;">
+              </iframe> 
+            </div> -->
+            <!-- /#page-content-wrapper -->
+        
+          </div>
+    <!--New End-->
+
+<script>if (typeof module === 'object') {window.module = module; module = undefined;}</script>
+<script src="node_modules/jquery/dist/jquery.min.js"></script>
+<script src="node_modules/bootstrap/dist/js/bootstrap.bundle.min.js"></script>
+
+<script src="js/mainapp.js"></script>
+<script>if (window.module) module = window.module;</script>
+<script src="renderer.js"></script>
+</body>
+</html>
\ No newline at end of file
index d4d9112..7da579b 100644 (file)
@@ -55,6 +55,10 @@ select.form-control {
     background-repeat: no-repeat;
 }
 
+select.bg-primary, select.bg-primary:hover, select.bg-primary:active  {
+  background-image: url("data:image/svg+xml;utf8,<svg version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' width='24' height='24' viewBox='0 0 24 24'><path fill='#fff' d='M7.406 7.828l4.594 4.594 4.594-4.594 1.406 1.406-6 6-6-6z'></path></svg>");
+  color: #fff;
+  }
 input.right {
   text-align: right;
 }
@@ -63,4 +67,8 @@ input.right {
   color: #fff;
   
   
+}
+
+.card {
+margin: 10px;
 }
\ No newline at end of file
index 3f28e45..f017df1 100644 (file)
@@ -8,52 +8,36 @@
 <link rel="stylesheet" href="node_modules/bootstrap-table/dist/bootstrap-table.min.css">
 <link rel="stylesheet" href="css/cashbox.epic.css">
 <link rel="stylesheet" href="css/app.css">
-<title>CASHBOX</title>
+<title>Invoice Journal</title>
 </head>
 <body>
     <!--New Start-->
     <div class="d-flex" id="wrapper">
-      <div class="container">
-      <div class="row " style="margin-top: 150px;">
-          <div class="col-md-12 justify-content-center text-center">
-            <img src="img/cashbox.png" style="width: 256px;"><br/><h1 class="text-white text-center" style="width: 100%">CashBox</h1>
-          </div>
-          <div class="col-md-2 justify-content-center text-center">
-              <nav class="navbar navbar-expand-md navbar-dark bg-dark">
-                  
-                  <div class="text-center">
-             <div class="btn-group" role="group" aria-label="Basic example">
-var browserapp = {
-  <button class="btn btn-primary" onclick="browserapp.loadview('cashbox');"><i class="fas fa-plus"></i><br/>Kasse</button>
-      <button class="btn btn-primary" onclick="browserapp.loadview('admin');"><i class="fas fa-edit"></i><br/>Verwaltung</button>
-     </div>
-                  </div>
-                </nav>
-          </div>
-        </div>
-      </div>
-    </div>
+
             <!-- Sidebar -->
-            <!-- <div class="bg-dark border-right" id="sidebar-wrapper">
-              <div class="sidebar-heading"><a href="javascript:location.href='index.html';"><img src="img/cashbox.png" style="width: 140px;"><br/>Invoice Journal</a></div>
+            <div class="bg-dark border-right" id="sidebar-wrapper">
+              <div class="sidebar-heading"><a href="javascript:location.href='index.html';"><img src="img/cashbox.png" style="width: 140px;"><br/>CashBox</a></div>
               <div class="list-group list-group-flush">
-                    <a  class="list-group-item list-group-item-action bg-light" href="javascript:browserapp.loadmodule('overview');">Übersicht</a>
-                    <a  class="list-group-item list-group-item-action bg-light" href="javascript:browserapp.loadmodule('invoices');">Rechnungen</a>
-                    <a class="list-group-item list-group-item-action bg-light" href="javascript:browserapp.loadmodule('accounts');">Konten</a>
-                    <a class="list-group-item list-group-item-action bg-light" href="javascript:browserapp.loadmodule('bankaccount');">Bankkonto</a>
-                    <a class="list-group-item list-group-item-action bg-light" href="javascript:browserapp.loadmodule('offers');">Angebote</a>
+                  <select class="form-control list-group-item list-group-item-action bg-primary text-white" id="globaldatasets" onchange="browserapp.loaddataset();">
+                    </select>
+                    <a class="list-group-item list-group-item-action bg-light" href="javascript:browserapp.loadmodule('overview');">Übersicht</a>
                     <a class="list-group-item list-group-item-action bg-light" href="javascript:browserapp.loadmodule('products');">Produkte</a>
-                    <a  class="list-group-item list-group-item-action bg-light" href="javascript:browserapp.loadmodule('settings');">Einstellungen</a></li>
+                    <a class="list-group-item list-group-item-action bg-light" href="javascript:browserapp.loadmodule('clients');">Kunden</a>
+                    <a class="list-group-item list-group-item-action bg-light" href="javascript:browserapp.loadmodule('tables');">Tische</a>
+                    <a class="list-group-item list-group-item-action bg-light" href="javascript:browserapp.loadmodule('stations');">Geräte</a>
+                    <a class="list-group-item list-group-item-action bg-light" href="javascript:browserapp.loadmodule('transactions');">Transaktionen</a>
+                    <a class="list-group-item list-group-item-action bg-light" href="javascript:browserapp.loadmodule('sales');">Verkäufe</a>
+                    <a class="list-group-item list-group-item-action bg-light" href="javascript:browserapp.loadmodule('settings');">Einstellungen</a></li>
                    
               </div>
-            </div> -->
+            </div>
             <!-- /#sidebar-wrapper -->
         
             <!-- Page Content -->
-            <!-- <div id="page-content-wrapper">
+            <div id="page-content-wrapper">
               <iframe id="moduleframe" src="modules/overview/index.html" style="width: 100%;height: 100vh; border: 0px;">
               </iframe> 
-            </div> -->
+            </div>
             <!-- /#page-content-wrapper -->
         
           </div>
@@ -63,7 +47,7 @@ var browserapp = {
 <script src="node_modules/jquery/dist/jquery.min.js"></script>
 <script src="node_modules/bootstrap/dist/js/bootstrap.bundle.min.js"></script>
 
-<script src="js/app.js"></script>
+<script src="js/mainapp.js"></script>
 <script>if (window.module) module = window.module;</script>
 <script src="renderer.js"></script>
 </body>
diff --git a/js/app.js b/js/app.js
deleted file mode 100644 (file)
index 70c9a10..0000000
--- a/js/app.js
+++ /dev/null
@@ -1,44 +0,0 @@
-
-// $("#menu-toggle").click(function(e) {
-//   e.preventDefault();
-//   $("#wrapper").toggleClass("toggled");
-// });
-
-$( document ).ready(function() {
-  console.log( "Main ready!" );
-  browserapp.loadmodule("overview");
-  console.log("After module load!");
-});
-console.log(navigator.platform);
-console.log(location.protocol);
-var browserapp = {
-loadview: function(viewname){
-  location.href= viewname + '.html';
-},
-loadmodule: function(modulename){
-  var appdata = browserapp.getconfig();
-  var params = "?";
-  for (var i in appdata){
-    params += "&" + i +"=" + encodeURIComponent(appdata[i]);
-  }
-  console.log("modules/"+modulename+"/index.html"+params);
-  $("#moduleframe").attr("src","modules/"+modulename+"/index.html"+ params);
-},
-loadmodulepage: function(modulename,page,pageparams = null){
-  var appdata = browserapp.getconfig();
-  var params = "?";
-  for (var i in appdata){
-    params += "&" + i +"=" + encodeURIComponent(appdata[i]);
-  }
-  if (pageparams){
-    for (var i in pageparams){
-      params += "&" + i +"=" + encodeURIComponent(pageparams[i]);
-    }
-  }
-  //console.log("modules/"+modulename+"/index.html"+params);
-  $("#moduleframe").attr("src","modules/"+modulename+"/"+ page +".html"+ params);
-},
-getconfig:function (){
-  return {dbfile:"invoicejournal",serviceurl:"http://localhost:6060/"};
-}
-}
\ No newline at end of file
diff --git a/js/mainapp.js b/js/mainapp.js
new file mode 100644 (file)
index 0000000..cb6645e
--- /dev/null
@@ -0,0 +1,58 @@
+$( document ).ready(function() {
+  console.log( "Main ready!" );
+  browserapp.setdatasets();
+  browserapp.loaddataset();
+  browserapp.loadmodule("overview");
+  console.log("After module load!");
+});
+
+//console.log(navigator.platform);
+//console.log(location.protocol);
+var browserapp = {
+  config: null,
+  datasets: null,
+  loadmodule: function(modulename){
+    //var appdata = browserapp.getconfig();
+    var params = "?";
+    for (var i in this.config){
+      params += "&" + i +"=" + encodeURIComponent(this.config[i]);
+    }
+    //console.log("modules/"+modulename+"/index.html"+params);
+    $("#moduleframe").attr("src","modules/"+modulename+"/index.html"+ params);
+  },
+  loadmodulepage: function(modulename,page,pageparams = null){
+    //var appdata = browserapp.getconfig();
+    var params = "?";
+    for (var i in this.config){
+      params += "&" + i +"=" + encodeURIComponent(this.config[i]);
+    }
+    if (pageparams){
+      for (var i in pageparams){
+        params += "&" + i +"=" + encodeURIComponent(pageparams[i]);
+      }
+    }
+    //console.log("modules/"+modulename+"/index.html"+params);
+    $("#moduleframe").attr("src","modules/"+modulename+"/"+ page +".html"+ params);
+  },
+  setdatasets: function(myds){
+    $("#globaldatasets").html("");
+    var ds = usersystem.getLocalDataSets();
+    for (var i in ds){
+      var prop = usersystem.getPreference(ds[i]);
+      $("#globaldatasets").append('<option value="'+ds[i]+'">'+prop.name+'</option>');
+    }
+  },
+  currentdataset: function(){
+    return  $("#globaldatasets :selected").val();
+  },
+  loaddataset: function(){
+    var gdset = $("#globaldatasets :selected").val();
+    if (gdset == ""){
+      this.config = null;
+    }else {
+      var ldata = usersystem.getPreference(gdset);
+      this.config={dbfile:ldata.dbfile,serviceurl:"http://"+ldata.server+":6060/"};
+    }
+  }
+  
+}
\ No newline at end of file
diff --git a/main.js b/main.js
index fb5f37a..f49e854 100644 (file)
--- a/main.js
+++ b/main.js
@@ -23,7 +23,7 @@ function createWindow () {
 
   mainWindow = new BrowserWindow({
     show: false,
-    frame: false,
+    // frame: false,
     webPreferences: {
       nodeIntegration: true
     }
index 4172c12..9f39e0d 100644 (file)
@@ -15,7 +15,7 @@ function loadtable(){
   // 'printf("%.2f",CAST(sum(pos.quantity * pos.unitamount) + case when pos.taxpercent > 0 then sum(pos.taxpercent * pos.quantity * pos.unitamount) else 0.0 end AS real)) as totalamount, ' +
   // 'printf("%.2f",COALESCE(ij.payedamount,0.0)) as payedamount, ' +
   // 'ij.status ' +
-  // 'from invoicejournal ij ' +
+  // 'from cashbox ij ' +
   // 'left join invoicepositions pos on (ij.id=pos.id_invoice) ' +
   // 'left join accounts rec on (ij.id_receipient = rec.id) ' +
   // 'left join accounts sen on (ij.id_sender = sen.id) where ij.byear=' + cfg.byear +' group by pos.id_invoice order by date desc;';
@@ -51,7 +51,7 @@ function loadtable(){
 }
 
 function loadyears(){
-  sql = "select byear from invoicejournal group by byear order by byear asc;";
+  sql = "select byear from cashbox group by byear order by byear asc;";
   var data = appdb.dbquery(sql);
   //onsole.log(data.sqldata);
   for (var i in data.sqldata){
index 2dabae4..026bc24 100644 (file)
@@ -15,7 +15,7 @@ function loadtable(){
   // 'printf("%.2f",CAST(sum(pos.quantity * pos.unitamount) + case when pos.taxpercent > 0 then sum(pos.taxpercent * pos.quantity * pos.unitamount) else 0.0 end AS real)) as totalamount, ' +
   // 'printf("%.2f",COALESCE(ij.payedamount,0.0)) as payedamount, ' +
   // 'ij.status ' +
-  // 'from invoicejournal ij ' +
+  // 'from cashbox ij ' +
   // 'left join invoicepositions pos on (ij.id=pos.id_invoice) ' +
   // 'left join accounts rec on (ij.id_receipient = rec.id) ' +
   // 'left join accounts sen on (ij.id_sender = sen.id) where ij.byear=' + cfg.byear +' group by pos.id_invoice order by date desc;';
diff --git a/modules/settings/db/cashbox.sql b/modules/settings/db/cashbox.sql
new file mode 100644 (file)
index 0000000..18e3267
--- /dev/null
@@ -0,0 +1,119 @@
+CREATE Table payementtypes (
+       id TEXT,
+       name TEXT,
+       modified DATETIME defaults CURRENT_TIMESTAMP,
+       created DATETIME defaults CURRENT_TIMESTAMP,
+       primary key (id)
+);
+
+CREATE TRIGGER trg_payementtypes_upd UPDATE ON payementtypes
+ BEGIN
+  UPDATE payementtypes SET modified=CURRENT_TIMESTAMP WHERE id = NEW.id;
+ END;
+
+
+CREATE Table groups (
+       id TEXT,
+       name TEXT,
+       modified DATETIME defaults CURRENT_TIMESTAMP,
+       created DATETIME defaults CURRENT_TIMESTAMP,
+       primary key (id)
+);
+
+CREATE TRIGGER trg_groups_upd UPDATE ON groups
+ BEGIN
+  UPDATE groups SET modified=CURRENT_TIMESTAMP WHERE id = NEW.id;
+ END;
+
+CREATE Table tables (
+       id TEXT,
+       name TEXT,
+       seats integer,
+       modified DATETIME defaults CURRENT_TIMESTAMP,
+       created DATETIME defaults CURRENT_TIMESTAMP,
+       primary key (id)
+);
+
+CREATE TRIGGER trg_tables_upd UPDATE ON tables
+ BEGIN
+  UPDATE tables SET modified=CURRENT_TIMESTAMP WHERE id = NEW.id;
+ END;
+CREATE TABLE products (
+       id TEXT,
+       id_group TEXT,
+       name TEXT,
+       specification TEXT,
+       netamount REAL,
+       grossamount REAL,
+       vatpercent REAL,
+       visible BOOLEAN,
+       modified DATETIME defaults CURRENT_TIMESTAMP,
+       created DATETIME defaults CURRENT_TIMESTAMP,
+       primary key (id)
+);
+
+CREATE TRIGGER trg_products_upd UPDATE ON products
+ BEGIN
+  UPDATE products SET modified=CURRENT_TIMESTAMP WHERE id = NEW.id;
+ END;
+CREATE TABLE transactions (
+       id TEXT,
+       id_payementtype TEXT,
+       id_client TEXT,
+       id_table TEXT,
+       id_product TEXT,
+       netamount REAL,
+       vatamount REAL,
+       grossamount REAL,
+       payedamount REAL,
+       cashbackamount REAL,
+       status TEXT,
+       statusdate DATE,
+       modified DATETIME defaults CURRENT_TIMESTAMP,
+       created DATETIME defaults CURRENT_TIMESTAMP,
+       primary key (id)
+);
+
+CREATE TRIGGER trg_transactions_upd UPDATE ON transactions
+ BEGIN
+  UPDATE transactions SET modified=CURRENT_TIMESTAMP WHERE id = NEW.id;
+ END;
+CREATE TABLE transactiondata (
+       id TEXT,
+       id_transaction TEXT,
+       id_product TEXT,
+       id_client TEXT,
+       id_table TEXT,
+       netamount REAL,
+       vatamount REAL,
+       grossamount REAL,
+       quantity integer,
+       modified DATETIME defaults CURRENT_TIMESTAMP,
+       created DATETIME defaults CURRENT_TIMESTAMP,
+       primary key (id)
+);
+
+CREATE TRIGGER trg_transactiondata_upd UPDATE ON transactiondata
+ BEGIN
+  UPDATE transactiondata SET modified=CURRENT_TIMESTAMP WHERE id = NEW.id;
+ END;
+CREATE TABLE printtemplates (
+       id TEXT,
+       name TEXT,
+       templatedesign TEXT,
+       templatesql TEXT,
+       templatetype TEXT,
+       modified DATETIME defaults CURRENT_TIMESTAMP,
+       created DATETIME defaults CURRENT_TIMESTAMP,
+       primary key (id)
+);
+
+CREATE TRIGGER trg_printtemplates_upd UPDATE ON printtemplates
+ BEGIN
+  UPDATE printtemplates SET modified=CURRENT_TIMESTAMP WHERE id = NEW.id;
+ END;
\ No newline at end of file
diff --git a/modules/settings/form_datastore.html b/modules/settings/form_datastore.html
new file mode 100644 (file)
index 0000000..a6c3f39
--- /dev/null
@@ -0,0 +1,194 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+<meta charset="UTF-8">
+<meta name="viewport" content="width=device-width, initial-scale=1.0">
+<link rel="stylesheet" href="../../node_modules/bootstrap/dist/css/bootstrap.min.css">
+<link rel="stylesheet" href="../../node_modules/bootstrap-table/dist/bootstrap-table.min.css">
+<link rel="stylesheet" href="../../node_modules/@fortawesome/fontawesome-free/css/fontawesome.min.css">
+<link rel="stylesheet" href="../../css/cashbox.epic.css">
+<link rel="stylesheet" href="../../css/app.css">
+<title>Datenbank-Einstellungen</title>
+</head>
+<body>
+        <nav class="navbar navbar-expand-md navbar-dark fixed-top bg-dark">
+        <button class="btn btn-primary" onclick="parent.browserapp.loadmodule('settings');"><i class="fas fa-chevron-left"></i><br>Back</button>
+                <a class="navbar-brand" href="#">&nbsp; Datenbank-Einstellungen</a>
+                <div class="ml-auto">
+           
+           <div class="btn-group" role="group" aria-label="Basic example">
+                <button class="btn btn-primary" onclick="datastore.save();"><i class="fas fa-save"></i><br/>Speichern</button>
+                <button class="btn btn-primary" onclick="datastore.test();"><i class="fas fa-sync"></i><br/>Testen</button>
+                <button class="btn btn-danger" onclick="datastore.test();" id="btnconnection"><i class="fas fa-wifi"></i><br/>Verbinden</button>
+                
+           </div>
+                </div>
+              </nav>
+    <div class="cotainer-fluid" style="margin-top: 52px;">  
+      <ul class="nav nav-tabs" id="pagetab" role="tablist">
+        <li class="nav-item"><a aria-controls="global" aria-selected="true" class="nav-link active" data-toggle="tab" href="#global" id="global-tab" role="tab">Global</a></li>
+        <li class="nav-item"><a aria-controls="templates" aria-selected="false" class="nav-link" data-toggle="tab" href="#templates" id="templates-tab" role="tab">Vorlagen & Drucker</a></li>
+      </ul>
+      <div class="tab-content" id="tabpagecontent">
+      <div aria-labelledby="global-tab" class="tab-pane fade show active" id="global" role="tabpanel">   
+      <div class="row">
+        <div class="col-md-12">
+          <div class="card">
+          <div class="card-body">
+          <div class="form-group">
+            <label for="name" >Name</label>
+            <input type="text" class="form-control" id="name" name="name"/>
+          </div>
+        </div>
+        </div>
+        </div>
+      </div>
+      <div class="row">
+        <div class="col-md-4">
+          <div class="card">
+            <div class="card-header"> Verbindung </div>
+            <div class="card-body">
+              <div class="form-group">
+                <label for="type">Verbindungs-Typ</label>
+                <select id="type" name="type" class="form-control">
+                  <option value="local">Lokal</option>
+                  <option value="local">LAN</option>
+                  <option value="Cloud">Cloud</option>
+                </select>
+              </div>
+              <div class="form-group">
+                <label for="server">Server</label>
+                  <input type="text" class="form-control" id="server" name="server"/>
+              </div>
+              <div class="form-group">
+                <label for="dbfile">Datenbank</label>
+                <input type="text" class="form-control" id="dbfile" name="dbfile"/>
+              </div>
+              <div class="form-group">
+                <label for="type">VPN</label>
+                <select id="vpn" name="vpn" class="form-control">
+                  <option value=""></option>
+                </select>
+              </div>
+          </div>
+        </div>
+        </div>
+        <div class="col-md-4">
+            <div class="card">
+              <div class="card-header">
+                Standard Werte
+              </div>
+              <div class="card-body">
+                <div class="form-group">
+                  <label for="dbname">Mehrwert-Steuer(%)</label>
+                  <input type="text" class="form-control" id="vat" name="vat"/>
+                </div>
+                <div class="form-group">
+                  <label for="dbname">Währung (Symbol)</label>
+                  <input type="text" class="form-control" id="currency" name="currency"/>
+                </div>      
+              </div>
+            </div>
+          </div>
+          <div class="col-md-4">
+              <div class="card">
+                <div class="card-header">
+                  E-Mail Server
+                </div>
+                <div class="card-body">
+                    <div class="form-group">
+                      <label for="mailserver">Email-Server</label>
+                      <input type="text" class="form-control" id="mailserver" name="mailserver"/>
+                    </div>
+                    <div class="form-group">
+                      <label for="mailport">Verschlüsselung/Port</label>
+                      <div class="input-group">
+                      <select id="mailencryption" name="mailencryption" class="form-control">
+                          <option value="">None</option>
+                          <option value="TLS">TLS</option>
+                          <option value="SSL">SSL</option>
+                        </select>
+                      <input type="text" class="form-control" id="mailport" name="mailport"/>
+                    </div>
+                    </div>
+                    <div class="form-group">
+                      <label for="maillogin">Login</label>
+                      <input type="text" class="form-control" id="maillogin" name="maillogin"/>
+                    </div>
+                    <div class="form-group">
+                      <label for="mailpassword">Passwort</label>
+                      <input type="password" class="form-control" id="mailpassword" name="mailpassword"/>
+                    </div>
+                </div>
+              </div>
+            </div>
+      </div>
+      </div>
+          <div aria-labelledby="templates-tab" class="tab-pane fade" id="templates" role="tabpanel">
+          <div class="row">
+            <div class="col-md-6" style="padding-right: 0px;">
+                    <nav class="navbar navbar-expand-md navbar-dark bg-dark">
+                        <h5 class="text-white">Druck-Vorlagen</h5>
+                              <div class="ml-auto">
+                         
+                         <div class="btn-group" role="group" aria-label="Basic example">
+                              <button class="btn btn-primary" onclick="printtemplate.new();"><i class="fas fa-plus"></i><br/>Neu</button>
+                              <button class="btn btn-primary" onclick="printtemplate.edit();"><i class="fas fa-edit"></i><br/>bearb.</button>
+                              <button class="btn btn-primary" onclick="printtemplate.delete();" ><i class="fas fa-trash"></i><br/>Löschen</button>
+                              <button class="btn btn-primary" onclick="printtemplate.duplicate();" ><i class="fas fa-copy"></i><br/>Copy</button>
+                         </div>
+                              </div>
+                            </nav>
+                
+                    
+                    <table id="tbl_invoicetemplates" class="table table-bordered table-hover table-striped">
+                        <thead class="thead-dark"> 
+                                <th data-checkbox="true"></th>
+                                <th data-sortable="true">Name</th>
+                                <th data-sortable="true">Typ</th>
+                                <th data-sortable="true">Standard</th>
+                        <tfoot></tfoot>
+                        <tbody></tbody>
+                    </table>
+            </div>
+            <div class="col-md-6" >
+              <div class="card">
+                <div class="card-header">Drucker</div>
+                <div class="card-body">
+                    <div class="form-group">
+                        <label for="ticketprinter">Kassenzettel-Drucker</label>
+                        <select id="ticketprinter" name="ticketprinter" class="form-control">
+                          <option value=""></option>
+                        </select>
+                        <button class="btn btn-primary">Drucker-Einstellungen</button>
+                      </div>
+                      <div class="form-group">
+                          <label for="a4printer">A4-Drucker</label>
+                          <select id="a4printer" name="a4printer" class="form-control">
+                            <option value=""></option>
+                          </select>
+                          <button class="btn btn-primary">Drucker-Einstellungen</button>
+                        </div>
+                </div>
+              </div>          
+            
+                  
+              </div>
+            </div>
+            </div>
+          </div>
+      </div>
+
+<script>if (typeof module === 'object') {window.module = module; module = undefined;}</script>
+<script src="../../node_modules/jquery/dist/jquery.min.js"></script>
+<script src="../../node_modules/bootstrap/dist/js/bootstrap.bundle.min.js"></script>
+<script src="../../node_modules/bootstrap-table/dist/bootstrap-table.min.js"></script>
+<script src="../../node_modules/@fortawesome/fontawesome-free/js/all.min.js"></script>
+<script src="../../js/moduleglobal.js"></script>
+<script src="../../js/database.js"></script>
+<script src="form_datastore.js"></script>
+<script src="lib/datastore.js"></script>
+<script src="lib/printtemplate.js"></script>
+<script>if (window.module) module = window.module;</script>
+</body>
+</html>
\ No newline at end of file
diff --git a/modules/settings/form_datastore.js b/modules/settings/form_datastore.js
new file mode 100644 (file)
index 0000000..8aaa4ea
--- /dev/null
@@ -0,0 +1,14 @@
+function initpage(){
+    console.log("ID:" + mpref.cfg.id);
+    if (mpref.cfg.id){
+        loadform();
+    }
+}
+
+function loadform(){
+    var pref = parent.usersystem.getPreference(mpref.cfg.id);
+    console.log(pref);
+    for (var i in pref){
+        $("#" + i).val(pref[i]);
+    }
+}
diff --git a/modules/settings/form_printtemplate.html b/modules/settings/form_printtemplate.html
new file mode 100644 (file)
index 0000000..04ab82f
--- /dev/null
@@ -0,0 +1,65 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+<meta charset="UTF-8">
+<meta name="viewport" content="width=device-width, initial-scale=1.0">
+<link rel="stylesheet" href="../../node_modules/bootstrap/dist/css/bootstrap.min.css">
+<link rel="stylesheet" href="../../node_modules/bootstrap-table/dist/bootstrap-table.min.css">
+<link rel="stylesheet" href="../../node_modules/@fortawesome/fontawesome-free/css/fontawesome.min.css">
+<link rel="stylesheet" href="../../css/cashbox.epic.css">
+<link rel="stylesheet" href="../../css/app.css">
+<title>Druck Template</title>
+</head>
+<body>
+        <nav class="navbar navbar-expand-md navbar-dark fixed-top bg-dark">
+            <button class="btn btn-primary" onclick="parent.browserapp.loadmodule('settings');"><i class="fas fa-chevron-left"></i><br>Back</button>
+                <a class="navbar-brand" href="#">Druck-Vorlage</a>
+                <div class="ml-auto">
+           <div class="btn-group" role="group" aria-label="Basic example">
+              <button class="btn btn-primary" onclick="printtemplate.save();"><i class="fas fa-save"></i><br/>Speichern</button>
+              <button class="btn btn-primary" onclick="printtemplate.test();"><i class="fas fa-sync"></i><br/>Testen</button>
+
+           </div>
+                </div>
+              </nav>
+    <div class="cotainer-fluid" style="margin-top: 52px;">            
+      <div class="row">
+        <input type="hidden" value="" id="id" name="id" />
+        <div class="col-md-6">
+          <div class="form-control">
+            <label for="name">Name</label>
+            <input type="text" class="form-control" id="name" name="name" />
+          </div>
+        </div>
+        <div class="col-md-6">
+            <div class="form-control">
+              <label for="name">Typ</label>
+              <select class="form-control" id="type" name="type" >
+                <option value="ticket">Ticket</option>
+                <option value="kassenbon">Kassenzettel</option>
+                <option value="a4template">A4-Vorlage</option>
+              </select>
+            </div>
+            </div>
+          </div>
+          <div class="col-md-12">
+              <div class="form-control">
+                  <label for="template">Vorlage</label>
+                  <textarea id="template" name="template" class="form-control richtextedit"></textarea>
+              </div>
+          </div>
+    </div>
+  </div>
+
+<script>if (typeof module === 'object') {window.module = module; module = undefined;}</script>
+<script src="../../node_modules/jquery/dist/jquery.min.js"></script>
+<script src="../../node_modules/bootstrap/dist/js/bootstrap.bundle.min.js"></script>
+<script src="../../node_modules/bootstrap-table/dist/bootstrap-table.min.js"></script>
+<script src="../../node_modules/@fortawesome/fontawesome-free/js/all.min.js"></script>
+<script src="../../js/moduleglobal.js"></script>
+<script src="../../js/database.js"></script>
+<script src="lib/printtemplate.js"></script>
+<script src="form_printtemplate.js"></script>
+<script>if (window.module) module = window.module;</script>
+</body>
+</html>
\ No newline at end of file
diff --git a/modules/settings/form_printtemplate.js b/modules/settings/form_printtemplate.js
new file mode 100644 (file)
index 0000000..ea81536
--- /dev/null
@@ -0,0 +1,4 @@
+function initpage(){
+  console.log(parent.usersystem.getsysinfo());
+  //parent.usersystem.setProperty("testproperty",{id:"TEST"});
+}
\ No newline at end of file
diff --git a/modules/settings/index.html b/modules/settings/index.html
new file mode 100644 (file)
index 0000000..631f384
--- /dev/null
@@ -0,0 +1,56 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+<meta charset="UTF-8">
+<meta name="viewport" content="width=device-width, initial-scale=1.0">
+<link rel="stylesheet" href="../../node_modules/bootstrap/dist/css/bootstrap.min.css">
+<link rel="stylesheet" href="../../node_modules/bootstrap-table/dist/bootstrap-table.min.css">
+<link rel="stylesheet" href="../../node_modules/@fortawesome/fontawesome-free/css/fontawesome.min.css">
+<link rel="stylesheet" href="../../css/cashbox.epic.css">
+<link rel="stylesheet" href="../../css/app.css">
+<title>Einstellungen</title>
+</head>
+<body>
+        <nav class="navbar navbar-expand-md navbar-dark fixed-top bg-dark">
+                <a class="navbar-brand" href="#">Einstellungen</a>
+                <div class="ml-auto">
+           <div class="btn-group" role="group" aria-label="Basic example">
+                <button class="btn btn-primary" onclick="datastore.import();"><i class="fas fa-file-import"></i><br/>importieren</button>
+                <button class="btn btn-primary" onclick="datastore.export();"><i class="fas fa-file-export"></i><br/>exportieren</button>
+                <button class="btn btn-primary" onclick="datastore.new();"><i class="fas fa-plus"></i><br/>Neu</button>
+                <button class="btn btn-primary" onclick="datastore.edit();"><i class="fas fa-edit"></i><br/>Bearb.</button>
+                <button class="btn btn-primary" onclick="datastore.delete();"><i class="fas fa-trash"></i><br/>Löschen</button>
+
+           </div>
+                </div>
+              </nav>
+    <div class="cotainer-fluid" style="margin-top: 52px;">            
+    <!-- <button class="btn btn-secondary" onclick="parent.usersystem.showError('MyError','My Error Message from settings!');">Show Error</button> -->
+    <table class="table table-bordered table-hover table-striped" id="tbl_datasets">
+        <thead class="thead-dark">
+          <tr>
+            <th data-checkbox="true"></th>
+            <th data-sortable="true">Name</th>
+            <th data-sortable="true">Database</th>
+            <th data-sortable="true">Server</th>
+            <th data-sortable="true">Type</th>
+            <th data-sortable="true">VPN</th>
+            <th>Verbunden</th>
+          </tr>
+        </thead>
+        <tfoot></tfoot>
+        <tbody></tbody>
+      </table>
+    </div>
+<script>if (typeof module === 'object') {window.module = module; module = undefined;}</script>
+<script src="../../node_modules/jquery/dist/jquery.min.js"></script>
+<script src="../../node_modules/bootstrap/dist/js/bootstrap.bundle.min.js"></script>
+<script src="../../node_modules/bootstrap-table/dist/bootstrap-table.min.js"></script>
+<script src="../../node_modules/@fortawesome/fontawesome-free/js/all.min.js"></script>
+<script src="../../js/moduleglobal.js"></script>
+<script src="../../js/database.js"></script>
+<script src="lib/datastore.js"></script>
+<script src="index.js"></script>
+<script>if (window.module) module = window.module;</script>
+</body>
+</html>
\ No newline at end of file
diff --git a/modules/settings/index.js b/modules/settings/index.js
new file mode 100644 (file)
index 0000000..3bc9e74
--- /dev/null
@@ -0,0 +1,71 @@
+var winh = Math.max(document.documentElement.clientHeight, window.innerHeight || 0);
+var tblh = winh-54;
+
+function initpage(){
+    console.log(parent.usersystem.getsysinfo());
+    loadtable();
+    //parent.usersystem.setProperty("testproperty",{id:"TEST"});
+}
+
+function loadtable(){
+
+    var connected=parent.browserapp.currentdataset();
+
+    var localds = parent.usersystem.getLocalDataSets();
+    console.log(localds);
+    for (var i in localds){
+      var prop = parent.usersystem.getPreference(localds[i]);
+      console.log("PROP");
+      console.log(connected +"<=>"+ localds[i]);
+      
+      console.log(prop);
+      var row = '<tr id="' + localds[i] + '">' +
+      '<td></td>' +
+      '<td>'+prop.name+'</td>' +
+      '<td>'+prop.dbfile+'</td>' +
+      '<td>'+prop.server+'</td>' +
+      '<td>'+prop.type+'</td>' +
+      '<td>'+prop.vpn+'</td>' +     
+      '<td class="btn-'+ ((localds[i]==connected)?'success':'secondary')+'"></td>'+
+      '</tr>';
+      $("#tbl_datasets").append(row);
+
+      //$("#globaldatasets").append('<option value="'+ds[i]+'">'+prop.name+'</option>');
+    }
+    $('#tbl_datasets').bootstrapTable({
+        pagination: false,
+        search: false,
+        height: tblh,
+        clickToSelect: true
+    });
+}
+
+// function settings_edit(){
+//     var settings_id= getTableSelectionID();
+//     if (settings_id){
+//       parent.browserapp.loadmodulepage('settings','form_datastore',{"id":settings_id});
+//     }
+    
+//   }
+
+function getTableSelectionID(){
+    var sel = $('#tbl_datasets').bootstrapTable('getSelections');
+    var id = null;
+    
+    if (sel){  id=sel[0]._id; }
+    console.log("Selected ID:" + id);
+    return id;
+  }
+  
+  function getTableSelectionIDs(){
+    var sel = $('#tbl_datasets').bootstrapTable('getSelections');
+    var ids = [];
+    if (sel){  
+      for (var s in sel){
+        ids.push(s._id);
+      }
+    }
+    return ids;
+  }
+
+  
\ No newline at end of file
diff --git a/modules/settings/lib/datastore.js b/modules/settings/lib/datastore.js
new file mode 100644 (file)
index 0000000..834821a
--- /dev/null
@@ -0,0 +1,46 @@
+var datastore = {
+    new: function(){
+        parent.browserapp.loadmodulepage('settings','form_datastore',{"id":""});
+    },
+    edit: function(){
+        var settings_id= getTableSelectionID();
+        console.log(settings_id);
+        if (settings_id){
+            parent.browserapp.loadmodulepage('settings','form_datastore',{"id":settings_id});
+        }
+    },
+    delete: function(){
+        
+    },
+    import: function(){
+        
+    },
+    export: function(){
+        
+    },
+    test: function(){
+        
+    },
+    save: function(){
+        var dts ={};
+        $("input,select").each(function(){
+            var inp = $(this);    
+            //console.log(inp);
+            dts[inp.attr("id")] = inp.val();
+        });
+        console.log(dts);
+        console.log(mpref);
+        if (mpref.cfg.id == ""){
+            var keyname = dts['name'].toLowerCase();
+            console.log(keyname);
+            keyname = keyname.replace(/[^a-z0-9-_]/g,"");
+            console.log(keyname);
+            mpref.cfg.id = "db."+ keyname;
+        }
+        if (dts.name){
+            console.log("Before save:" + mpref.cfg.id);
+            parent.usersystem.setPreference(mpref.cfg.id,dts);
+        }
+       
+    }
+}
\ No newline at end of file
diff --git a/modules/settings/lib/printtemplate.js b/modules/settings/lib/printtemplate.js
new file mode 100644 (file)
index 0000000..6ca67db
--- /dev/null
@@ -0,0 +1,14 @@
+var printtemplate = {
+  new: function(){
+
+  },
+  edit: function(){
+    
+  },
+  duplicate: function(){
+    
+  },
+  delete: function(){
+    
+  }
+}
index 2a40eb3..2a66de8 100644 (file)
@@ -6,7 +6,7 @@
 <link rel="stylesheet" href="../../node_modules/bootstrap/dist/css/bootstrap.min.css">
 <link rel="stylesheet" href="../../node_modules/bootstrap-table/dist/bootstrap-table.min.css">
 <link rel="stylesheet" href="../../node_modules/@fortawesome/fontawesome-free/css/fontawesome.min.css">
-<link rel="stylesheet" href="../../css/invoicejournal.epic.css">
+<link rel="stylesheet" href="../../css/cashbox.epic.css">
 <link rel="stylesheet" href="../../css/app.css">
 <title>Rechnungen</title>
 </head>
index b48d6a6..7c61e85 100644 (file)
@@ -18,7 +18,7 @@ function loadtable(){
   'printf("%.2f",CAST(sum(pos.quantity * pos.unitamount) + case when pos.taxpercent > 0 then sum(pos.taxpercent * pos.quantity * pos.unitamount) else 0.0 end AS real)) as totalamount, ' +
   'printf("%.2f",COALESCE(ij.payedamount,0.0)) as payedamount, ' +
   'ij.status ' +
-  'from invoicejournal ij ' +
+  'from cashbox ij ' +
   'left join invoicepositions pos on (ij.id=pos.id_invoice) ' +
   'left join accounts rec on (ij.id_receipient = rec.id) ' +
   'left join accounts sen on (ij.id_sender = sen.id) where ij.byear=' + cfg.byear +' group by pos.id_invoice order by date desc;';
@@ -54,7 +54,7 @@ function loadtable(){
 }
 
 function loadyears(){
-  sql = "select byear from invoicejournal group by byear order by byear asc;";
+  sql = "select byear from cashbox group by byear order by byear asc;";
   var data = appdb.dbquery(sql);
   //onsole.log(data.sqldata);
   for (var i in data.sqldata){
index 2a40eb3..2a66de8 100644 (file)
@@ -6,7 +6,7 @@
 <link rel="stylesheet" href="../../node_modules/bootstrap/dist/css/bootstrap.min.css">
 <link rel="stylesheet" href="../../node_modules/bootstrap-table/dist/bootstrap-table.min.css">
 <link rel="stylesheet" href="../../node_modules/@fortawesome/fontawesome-free/css/fontawesome.min.css">
-<link rel="stylesheet" href="../../css/invoicejournal.epic.css">
+<link rel="stylesheet" href="../../css/cashbox.epic.css">
 <link rel="stylesheet" href="../../css/app.css">
 <title>Rechnungen</title>
 </head>
index b48d6a6..7c61e85 100644 (file)
@@ -18,7 +18,7 @@ function loadtable(){
   'printf("%.2f",CAST(sum(pos.quantity * pos.unitamount) + case when pos.taxpercent > 0 then sum(pos.taxpercent * pos.quantity * pos.unitamount) else 0.0 end AS real)) as totalamount, ' +
   'printf("%.2f",COALESCE(ij.payedamount,0.0)) as payedamount, ' +
   'ij.status ' +
-  'from invoicejournal ij ' +
+  'from cashbox ij ' +
   'left join invoicepositions pos on (ij.id=pos.id_invoice) ' +
   'left join accounts rec on (ij.id_receipient = rec.id) ' +
   'left join accounts sen on (ij.id_sender = sen.id) where ij.byear=' + cfg.byear +' group by pos.id_invoice order by date desc;';
@@ -54,7 +54,7 @@ function loadtable(){
 }
 
 function loadyears(){
-  sql = "select byear from invoicejournal group by byear order by byear asc;";
+  sql = "select byear from cashbox group by byear order by byear asc;";
   var data = appdb.dbquery(sql);
   //onsole.log(data.sqldata);
   for (var i in data.sqldata){
index 2a40eb3..2a66de8 100644 (file)
@@ -6,7 +6,7 @@
 <link rel="stylesheet" href="../../node_modules/bootstrap/dist/css/bootstrap.min.css">
 <link rel="stylesheet" href="../../node_modules/bootstrap-table/dist/bootstrap-table.min.css">
 <link rel="stylesheet" href="../../node_modules/@fortawesome/fontawesome-free/css/fontawesome.min.css">
-<link rel="stylesheet" href="../../css/invoicejournal.epic.css">
+<link rel="stylesheet" href="../../css/cashbox.epic.css">
 <link rel="stylesheet" href="../../css/app.css">
 <title>Rechnungen</title>
 </head>
index b48d6a6..7c61e85 100644 (file)
@@ -18,7 +18,7 @@ function loadtable(){
   'printf("%.2f",CAST(sum(pos.quantity * pos.unitamount) + case when pos.taxpercent > 0 then sum(pos.taxpercent * pos.quantity * pos.unitamount) else 0.0 end AS real)) as totalamount, ' +
   'printf("%.2f",COALESCE(ij.payedamount,0.0)) as payedamount, ' +
   'ij.status ' +
-  'from invoicejournal ij ' +
+  'from cashbox ij ' +
   'left join invoicepositions pos on (ij.id=pos.id_invoice) ' +
   'left join accounts rec on (ij.id_receipient = rec.id) ' +
   'left join accounts sen on (ij.id_sender = sen.id) where ij.byear=' + cfg.byear +' group by pos.id_invoice order by date desc;';
@@ -54,7 +54,7 @@ function loadtable(){
 }
 
 function loadyears(){
-  sql = "select byear from invoicejournal group by byear order by byear asc;";
+  sql = "select byear from cashbox group by byear order by byear asc;";
   var data = appdb.dbquery(sql);
   //onsole.log(data.sqldata);
   for (var i in data.sqldata){
index 6076f0f..5459137 100644 (file)
@@ -5,7 +5,9 @@ var usersystem = {
     profilepath: function(){
         var ppath="";
         if (os.platform() == "darwin"){
-         ppath = os.homedir() + '/Library/Application Support/invoicejournal/';
+            ppath = os.homedir() + '/Library/Application Support/cashbox/';
+        } else if (os.platform() == "Win32") {
+            ppath = os.homedir() + '/AppData/Roaming/cashbox/';
         }
         return ppath;
     },
@@ -27,40 +29,37 @@ var usersystem = {
     showError: function(errtitle,errmsg){
         dialog.showErrorBox(errtitle, errmsg);
     },
-    setProperty(key,data){
-       
-        
+    setPreference: function(key,data){
+        //console.log("save preferences to: " + this.profilepath()  + key + ".json");
         if ((typeof data == 'object') || (typeof data == 'array')){
             data = JSON.stringify(data);
         }
-        fs.writeFile(this.profilepath()  + key + ".json", data, (err) => {
-            if (err) {
-                this.showError("Error writing Preference!",err.message);
-                console.log(err);
-                return false;
-            }
-            return true;
-            
-        });
-        return false;
+        var result = fs.writeFileSync(this.profilepath()  + key + ".json", data);
+        return result;
     },
-    getProperty(key){
+    getPreference: function(key){
         var data = null;
-        fs.readFile(this.profilepath()  + key + ".json", 'utf-8', (err, data) => {
-            if(err){
-                this.showError("Error reading Preference!",err.message);
-                return data;
-            }
+        if (fs.existsSync(this.profilepath()  + key + ".json")){
+            console.log("Read Key:" + key);
+            var data = fs.readFileSync(this.profilepath()  + key + ".json", 'utf-8');
             if (data.startsWith("{") || data.startsWith("[")){
                 data = JSON.parse(data);
             }
-            // Change how to handle the file content
-            console.log("The file content is : " + data);
-            return JSON.stringify(data);
-        });
+            return data;
+        }
         return data;
     },
-    getsysinfo(){
+    getLocalDataSets: function(){
+        var datasets =[];
+        var files = fs.readdirSync(this.profilepath());
+        files.forEach(function(file) {
+            if (file.match('db\..*\.json')){
+                datasets.push(file.replace('.json',''));
+            }
+        });
+        return datasets;
+    },
+    getsysinfo: function(){
         return {
             "hostname": os.hostname(),
             "userdir": os.homedir(),