v20200114
authorkilian (dks-laptop) <ksaffran@dks.lu>
Wed, 15 Jan 2020 08:09:37 +0000 (09:09 +0100)
committerkilian (dks-laptop) <ksaffran@dks.lu>
Wed, 15 Jan 2020 08:09:37 +0000 (09:09 +0100)
40 files changed:
backoffice/api/index.cgi
backoffice/api/lib/dksconfig.pm
backoffice/api/lib/pdfreport.pm [new file with mode: 0644]
backoffice/api/report.cgi [new file with mode: 0644]
backoffice/data/reports/invoices/dks-deutsch.conf [new file with mode: 0644]
backoffice/data/reports/invoices/dks-deutsch.footer.tt [new file with mode: 0644]
backoffice/data/reports/invoices/dks-deutsch.header.tt [new file with mode: 0644]
backoffice/data/reports/invoices/dks-deutsch.tt [new file with mode: 0644]
backoffice/data/reports/invoices/dks-deutsch/dks_500.png [new file with mode: 0644]
backoffice/data/reports/invoices/dks-deutsch/sitc.png [new file with mode: 0644]
backoffice/data/reports/pot/pot_period.conf [new file with mode: 0644]
backoffice/data/reports/pot/pot_period.footer.tt [new file with mode: 0644]
backoffice/data/reports/pot/pot_period.header.tt [new file with mode: 0644]
backoffice/data/reports/pot/pot_period.tt [new file with mode: 0644]
backoffice/data/reports/pot/staff_workplan.conf [new file with mode: 0644]
backoffice/data/reports/pot/staff_workplan.footer.tt [new file with mode: 0644]
backoffice/data/reports/pot/staff_workplan.header.tt [new file with mode: 0644]
backoffice/data/reports/pot/staff_workplan.tt [new file with mode: 0644]
backoffice/index.cgi
backoffice/js/admin.js
backoffice/js/formsave.js
backoffice/js/request.js
backoffice/tmpl/block/dlgdeleterow.tt
backoffice/tmpl/module/companies/companies.js
backoffice/tmpl/module/companies/index.tt
backoffice/tmpl/module/companies/staffgroups.js
backoffice/tmpl/module/dashboard/index.tt
backoffice/tmpl/module/periods/index.js [moved from backoffice/tmpl/module/planning/index.js with 100% similarity]
backoffice/tmpl/module/periods/index.tt [moved from backoffice/tmpl/module/planning/index.tt with 94% similarity]
backoffice/tmpl/module/periods/reportperiod.js [moved from backoffice/tmpl/module/planning/reportperiod.js with 59% similarity]
backoffice/tmpl/module/periods/staffworkplan.js [moved from backoffice/tmpl/module/planning/staffworkplan.js with 96% similarity]
backoffice/tmpl/module/staff/index.tt
backoffice/tmpl/module/staff/staff.js
backoffice/tmpl/module/staff/staffcontract.js
backoffice/tmpl/module/users/index.tt
backoffice/tmpl/module/users/users.js
backoffice/tmpl/module/workplans/index.js
backoffice/tmpl/module/workplans/index.tt
backoffice/tmpl/module/workplans/workplans.js [new file with mode: 0644]
backoffice/tmpl/skeleton/index.tt

index 2d926f8..9edf8d5 100755 (executable)
@@ -74,7 +74,7 @@ if (($cgi->request_method() eq "GET") || ($cgi->request_method() eq "POST")){
     # }
  
     if ($p->{fn} eq "saveform"){
-      $html->{p} = $p;
+      $html->{p} = $p;
       $html->{result}->{ident} = $p->{ident};
       delete $p->{ident};
       delete $p->{fn};
@@ -82,7 +82,7 @@ if (($cgi->request_method() eq "GET") || ($cgi->request_method() eq "POST")){
       my $retid=undef;
       my $type = "upd";
       foreach my $px (keys(%{$p})){
-        $html->{result}->{datafield} = $px;
+        #$html->{result}->{datafield} = $px;
         if (($px =~ /\_id$/) && ($p->{$px} eq "")){
           $type = "ins";      
           delete $p->{$px};
@@ -95,7 +95,7 @@ if (($cgi->request_method() eq "GET") || ($cgi->request_method() eq "POST")){
       else {
         @sql = $db->create_ddl_update($p);
       } 
-      #$html->{sql} = \@sql;
+      $html->{sql} = \@sql;
       foreach my $s (@sql){
         #if ($type eq "ins"){
           $retid= $db->dbquerysorted($s);
@@ -104,7 +104,7 @@ if (($cgi->request_method() eq "GET") || ($cgi->request_method() eq "POST")){
         #}
         
       }
-      $html->{result}->{id} = $retid->{0};
+      $html->{result} = $retid->{0};
       #$p->{table},#$p->{field},$p->{value},$p->{id},$p->{type}
     }
     if($p->{fn} eq "deleterow"){
@@ -188,10 +188,10 @@ if (($cgi->request_method() eq "GET") || ($cgi->request_method() eq "POST")){
       }
     }
     if ($p->{fn} eq "getschemaaccess"){
-        my $sql = "select schemata, company from companies where schemata in (
-select json_array_elements_text(schemaaccess)  as schemaaccess from users where id=".$sess->{id}.") order by company;";
-        if ($sess->{usergroups} =~ /admin/){
-          $sql = "select schemata, company from companies order by company;";
+        my $sql = "select schemata,company from companies where schemata in (
+ select json_array_elements_text(schemaaccess) as schemaaccess from users where id=".$sess->{id}.") order by company;";
+        if ($sess->{usergroup} eq "admin"){
+          $sql = "select * from vw_schemata;";
         }
         $html->{result} = $db->dbquerysorted($sql);
     }
index e646d2b..f79ba1c 100644 (file)
@@ -11,7 +11,7 @@ our @EXPORT_OK = qw($sitecfg);
 our $sitecfg ={
   cookiename => 'potlu',
   dbtype => 'PgPP',
-  dsn => 'DBI:PgPP:dbname=potlu_db;host=DKS-LAPTOP.fritz.box',
+  dsn => 'DBI:PgPP:dbname=potlu_db;host=localhost',
   #dsn => 'DBI:PgPP:dbname=potlu_db;host=sql629.your-server.de',
   dbuser => 'potlu_user',
   dbpassword => 'r2btTTRfuJz4whez',
diff --git a/backoffice/api/lib/pdfreport.pm b/backoffice/api/lib/pdfreport.pm
new file mode 100644 (file)
index 0000000..7c1b7ca
--- /dev/null
@@ -0,0 +1,112 @@
+package pdfreport;
+
+use strict;
+use Template;
+use File::Basename qw/dirname basename/;
+use Data::Dumper;
+use File::Copy::Recursive qw(dircopy);
+sub new {
+    my $class = shift;
+    my $p = shift;
+    my $self = bless {}, $class;
+    $self->{tmplpath} =$p->{tmplpath};
+    $self->{tmp} =$p->{tmp};
+    $self->{pdf} = undef;
+    $self->{template} = undef;
+    #$self->{template} = $p->{template};
+    $self->{pdf}->{app} = "/usr/local/bin/wkhtmltopdf";
+    return $self;
+}
+
+sub createpdf(){
+  my $self = shift;
+  my $template = shift;
+  my $output = shift;
+  my $inputdata = shift;
+  my $r = -1;
+  print $self->{tmplpath}.'/'.$template.'.conf'."\n";
+  if (-e $self->{tmplpath}.'/'.$template.'.conf'){
+    $self->readpdfconfig($template,$inputdata);
+    print Dumper($self->{template});
+  }
+  print Dumper($self->{pdf});
+  print Dumper($self->{template});
+  my $tmpreportpath=$self->{tmplpath};
+  if (exists($self->{pdf}->{engine}) && ($self->{pdf}->{engine} eq "Template::Toolkit")){
+    $template = $self->createTTReport($template);
+    $tmpreportpath = $self->{tmp};
+  }
+  if ((keys(%{$self}) > 0) && (-e $tmpreportpath.'/'.$template.'.html')){
+    my $cmd = '"'.$self->{pdf}->{app}.'"';
+    if ($self->{pdf}->{bottom}){ $cmd .= " -B ".$self->{pdf}->{bottom}; }
+    if ($self->{pdf}->{left}){ $cmd .= " -L ".$self->{pdf}->{left}; }
+    if ($self->{pdf}->{right}){ $cmd .= " -R ".$self->{pdf}->{right}; }
+    if ($self->{pdf}->{top}){ $cmd .= " -T ".$self->{pdf}->{top}; }
+    if ($self->{pdf}->{orientation}){ $cmd .= " -O ".$self->{pdf}->{orientation}; }
+    if ($self->{pdf}->{size}){ $cmd .= " -s ".$self->{pdf}->{size}; }
+    if ($self->{pdf}->{encoding}){ $cmd .= " --encoding '".$self->{pdf}->{encoding}."'"; }
+    if (-e $tmpreportpath.'/'.$template.'.header.html'){
+      $cmd .= ' --header-html "'.$tmpreportpath.'/'.$template.'.header.html"';
+    }
+    if (-e $tmpreportpath.'/'.$template.'.footer.html'){
+      $cmd .= ' --footer-html "'.$tmpreportpath.'/'.$template.'.footer.html"';
+    }
+    $cmd .= ' "'.$tmpreportpath.'/'.$template.'.html"';
+    $cmd .= ' "'.$output.'"';
+    print $cmd."\n";
+    $r = system($cmd);
+  }
+  if (-e $output){
+    return ($r,$output);
+  }
+  return ($r,undef);
+}
+
+sub createTTReport(){
+  my $self = shift;
+  my $template = shift;
+  my $uniquekey = $$;
+  if (-e $self->{tmplpath}.'/'.$template.".tt"){
+    $self->TTtoHTML($self->{tmplpath}.'/'.$template.".tt",$self->{tmp}.'/'.$template.$$.".html");
+  }
+  if (-e $self->{tmplpath}.'/'.$template.".header.tt"){
+    $self->TTtoHTML($self->{tmplpath}.'/'.$template.".header.tt",$self->{tmp}.'/'.$template.$$.".header.html");
+  }
+  if (-e $self->{tmplpath}.'/'.$template.".footer.tt"){
+    $self->TTtoHTML($self->{tmplpath}.'/'.$template.".footer.tt",$self->{tmp}.'/'.$template.$$.".footer.html");
+  }
+  if (-d $self->{tmplpath}.'/'.$template){
+    dircopy($self->{tmplpath}.'/'.$template,$self->{tmp}.'/'.$template);
+  }
+  return $template.$$;
+}
+
+sub TTtoHTML(){
+  my $self = shift;
+  my $ttfile = shift;
+  my $outfile = shift;
+  my $template = Template->new({INCLUDE_PATH => [dirname($ttfile)]});#,ENCODING => 'utf8'
+  $template->process(basename($ttfile),$self->{template},$outfile) || die "Template process failed: ", $template->error(), "\n";#,{binmode => ':utf8'}
+}
+
+sub readpdfconfig(){
+  my $self = shift;
+  my $template = shift;
+  my $inputdata = shift;
+  open(CFG,$self->{tmplpath}.'/'.$template.'.conf');
+  while (my $l = <CFG>){
+    chomp($l);
+    print $l."\n";
+    $l =~ s/^\s+//;
+    if (($l =~ /^#/) || ($l eq "")) {next;}
+    if ($l =~ /\w+=.+/){
+      my ($k1,$k2,$v) = $l =~ m/^(\w+)_(\w+)=\"(.+)\"$/;
+      $self->{lc($k1)}->{lc($k2)} = $v;
+    }
+  }
+  close(CFG);
+  foreach my $ik (keys(%{$inputdata})){
+    $self->{template}->{lc($ik)} = $inputdata->{$ik};
+  }
+}
+1;
\ No newline at end of file
diff --git a/backoffice/api/report.cgi b/backoffice/api/report.cgi
new file mode 100644 (file)
index 0000000..d00a63d
--- /dev/null
@@ -0,0 +1,118 @@
+#!/Users/kilian/perl5/perlbrew/perls/perl-5.24.1/bin/perl
+use strict;
+use FindBin qw($RealBin $Bin);
+# use lib ('CGI/api/lib/perl5');
+# use lib ('CGI/api/lib');
+use lib ($Bin.'/CGI/api/lib/perl5');
+use lib ($Bin.'/CGI/api/lib');
+use lib ($RealBin.'/lib/perl5');
+use lib ($RealBin.'/lib');
+use CGI;
+use CGI::Cookie;
+# use CGI::Carp qw/fatalsToBrowser/;
+use File::Basename;
+use JSON::PP;
+use MIME::Type::FileName;
+use dksconfig qw/$sitecfg/;
+use dksdb;
+
+# use session;
+#use sendemail;
+my $cgi = new CGI();
+my $scriptpath = $cgi->url(-absolute => 1); 
+my $p = ();
+my @params = $cgi->param();
+foreach my $pe (@params){
+  $p->{$pe} = $cgi->param($pe);
+}
+my $html->{result} = ();
+# $p->{sid} = $cgi->cookie($sitecfg->{cookiename});
+# my $se = session->new();
+# my $sess = $se->getsession($p->{sid});
+print $cgi->header(-type=>"application/json", -charset => "utf-8");
+my $dbredirect = {};
+if ($sitecfg->{dbtype} eq "SQLite"){
+  if (exists($p->{db})){
+    $dbredirect->{dsn} = "DBI:SQLite:dbname=".$sitecfg->{datapath}.'/'.$p->{db}.'.sqlite';
+  }
+}
+#$html->{conn} = $dbredirect;
+# if ($sess == undef){
+#   $html->{error} = "No Authorisation";
+#   print JSON::PP::encode_json($html);
+#   exit(0);
+# }
+# $html->{p} = $p;
+# $html->{sess} =$sess;
+#my $datapath = $ENV{"DOCUMENT_ROOT"}.dirname(dirname($scriptpath)).'/data/';
+if (($cgi->request_method() eq "GET") || ($cgi->request_method() eq "POST")){
+  
+  # my @params = $cgi->param();
+  # foreach my $pp (@params){
+       #   $p->{$pp} = $cgi->param($pp);
+  # }
+  
+  if (exists($p->{list})){
+    #$html->{param} = $p;
+    my $reppath = $sitecfg->{datapath}.'/'.$p->{app}.'/templates/'.$p->{list};
+    #$html->{path} = $reppath;
+    if (-d $reppath){
+      #print "OK!";
+      my @allreps = ();
+      opendir(REP,$reppath);
+      while (my $f = readdir(REP)){
+        if ($f =~ /\.conf$/){
+          my $rep->{name}= $f;
+          $rep->{name} =~ s/\.conf$//; 
+          $rep->{label} = $rep->{name};
+          
+          open(RTPL,$reppath.'/'.$f);
+          while (my $l = <RTPL>){
+            chomp($l);
+            if ($l =~ /^REPORT_NAME/){
+              my ($k1,$k2,$v) = $l =~ m/^(\w+)_(\w+)=\"(.+)\"$/;
+              $rep->{label} = $v;
+            }
+          }
+          close(RTPL);
+          push(@allreps,$rep);
+        }
+      }
+      closedir(REP);
+      $html->{result}->{reports} = \@allreps; 
+    }
+  }
+  elsif (exists($p->{generate})){
+    # my $data = {
+    #   id_invoice => "469",
+    #   dsn => 'DBI:SQLite:dbname='.$dbpath.'/invoicejournal/dksbuchhaltung.sqlite'
+    # };
+    # my $rep = pdfreport->new({tmplpath => $RealBin.'/report', tmp => $RealBin.'/tmp'});
+    # my ($result,$file) = $rep->createpdf('ttinvoice',$RealBin.'/output/textinvoice.pdf',$data);
+    # print "$result: $file\n";
+  }
+  elsif (exists($p->{open})){
+    if (exists($p->{file}) && -e ){
+      
+      my $mimetype = MIME::Type::FileName::guess ($sitecfg->{data}.'/'.$p->{file});
+      my @stat = stat($sitecfg->{data}.'/'.$p->{file});
+      print $cgi->header(  
+        -type => $mimetype,
+        -target => basename($p->{file}),
+        -attachment => basename($p->{file})
+      );
+      open(DLD,$sitecfg->{data}.'/'.$p->{file});
+      binmode(DLD);
+      local $/ = \1024;
+      while (<DLD>){
+        print $_;
+      }
+      close(DLD);
+      exit(0);
+    }
+  }
+}
+print JSON::PP::encode_json($html);
+# for my $e ( keys %ENV ) {
+#     print "$e: $ENV{$e}<br/>";
+# }
\ No newline at end of file
diff --git a/backoffice/data/reports/invoices/dks-deutsch.conf b/backoffice/data/reports/invoices/dks-deutsch.conf
new file mode 100644 (file)
index 0000000..d5f503a
--- /dev/null
@@ -0,0 +1,12 @@
+PDF_TOP="40mm"
+PDF_BOTTOM="20mm"
+PDF_LEFT="20mm"
+PDF_RIGHT="10mm"
+PDF_SIZE="A4"
+PDF_ORIENTATION="Portrait"
+PDF_ENGINE="Template::Toolkit"
+PDF_ENCODING="UTF-8"
+TEMPLATE_DSN=""
+TEMPLATE_DBUSER=""
+TEMPLATE_DBPASSWORD=""
+REPORT_NAME="DKS - deutsch"
\ No newline at end of file
diff --git a/backoffice/data/reports/invoices/dks-deutsch.footer.tt b/backoffice/data/reports/invoices/dks-deutsch.footer.tt
new file mode 100644 (file)
index 0000000..0f19953
--- /dev/null
@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="UTF-8">
+<script>
+function subst() {
+    var vars = {};
+    var query_strings_from_url = document.location.search.substring(1).split('&');
+    for (var query_string in query_strings_from_url) {
+        if (query_strings_from_url.hasOwnProperty(query_string)) {
+            var temp_var = query_strings_from_url[query_string].split('=', 2);
+            vars[temp_var[0]] = decodeURI(temp_var[1]);
+        }
+    }
+    var css_selector_classes = ['page', 'frompage', 'topage', 'webpage', 'section', 'subsection', 'date', 'isodate', 'time', 'title', 'doctitle', 'sitepage', 'sitepages'];
+    for (var css_class in css_selector_classes) {
+        if (css_selector_classes.hasOwnProperty(css_class)) {
+            var element = document.getElementsByClassName(css_selector_classes[css_class]);
+            for (var j = 0; j < element.length; ++j) {
+                element[j].textContent = vars[css_selector_classes[css_class]];
+            }
+        }
+    }
+}
+</script></head>
+<body style="border:0; margin: 0;" onload="subst()">
+<table style="width: 100%;" >
+  <tr><td colspan="2" style="text-align: center;"><b>SAFFRAN IT Consulting s.à r.l.</b> ist eine Handelsbezeichnung von<br/> <b>DKS</b>, Société à responsabilité limitée, <b>RC</b> B168572 - <b>TVA:</b> LU 2537 5617 - <b>No. Aut:</b> 10024550 / 0<br/>
+    <b>IBAN:</b> LU25 0020 1100 2783 8700; <b>BIC:</b> BILLLULL</td></tr>
+  <tr>
+    <td></td>
+    <td style="text-align:right">
+      Seite <span class="page"></span>/<span class="topage"></span>
+    </td>
+  </tr>
+</table>
+</body></html>
\ No newline at end of file
diff --git a/backoffice/data/reports/invoices/dks-deutsch.header.tt b/backoffice/data/reports/invoices/dks-deutsch.header.tt
new file mode 100644 (file)
index 0000000..8e40350
--- /dev/null
@@ -0,0 +1,20 @@
+<!DOCTYPE html>
+<html><head>
+<meta charset="UTF-8">
+</head><body style="border:0; margin: 0;" o>
+<table style="width: 100%;">
+  <tr>
+    <td style="width: 150mm; margin-top:5mm;"><img src="ttinvoice/sitc.png" style="height: 35mm;"/></td>
+    <td style="width: 60mm;text-align: right;">
+      <div style="text-align: left;width: 60mm; font-size: 12pt;font: sans;">
+          <b>SAFFRAN IT Consulting S.à r.l.</b><br/>
+          4, rue Principale<br/>
+          L-3770 Tétange<br/><br/>
+          Tel: +352 691 504 574<br/>
+          info@saffran.lu / www.saffran.lu<br/>
+      </div>
+    </td>
+    <tr><td style="text-align: left;"></td><td></td></tr>
+  </tr>
+</table>
+</body></html>
diff --git a/backoffice/data/reports/invoices/dks-deutsch.tt b/backoffice/data/reports/invoices/dks-deutsch.tt
new file mode 100644 (file)
index 0000000..93f96d0
--- /dev/null
@@ -0,0 +1,126 @@
+[% USE DBI %]
+[% USE dksdb = DBI(dsn, dbuser, dbpassword) %]
+<!DOCTYPE html>
+<html>
+<head>
+  <title>Invoice</title>
+  <style>
+  div {
+  font-size: 18pt;
+}
+table {
+  font-size: 18pt;
+  border-spacing: unset;
+  border-collapse: unset;
+}
+td.invdatalbl {
+  font-weight: bold;
+  margin: 1mm; 
+  padding: 2mm;
+  border-collapse:collapse;;
+  width: 30mm;
+  background-color: #c6c6c6;
+}
+td.invdataval {
+  font-weight: normal; 
+  margin: 1mm; 
+  padding: 2mm;
+}
+.right{
+  text-align: right;
+}
+table#tbl_products {
+  border-spacing: 0;
+  border-collapse: 0;
+  margin-top: 10mm;
+  width: 100%;
+}
+table#tbl_products td {
+  padding: 2mm;
+  border-bottom: 1px solid black;
+}
+
+table#tbl_products th {
+  margin: 1mm; 
+  border: 1px solid #fff;
+  border-bottom: 0px;
+  padding: 2mm;
+  background-color: #c6c6c6;
+}
+
+th.footer {
+  margin: 1mm; 
+  border: 1px solid #fff;
+  background-color: unset;
+  border-bottom: 0px;
+  padding: 2mm;
+  text-align: right;
+}
+  </style>
+</head>
+<body>
+  [% qginv = dksdb.prepare("select * from vw_invoiceoutlist WHERE id= ?") %]
+  [% ginv = qginv.execute(id_invoice) %]
+  [% inv = ginv.get_all() %]
+  <table style="width: 100%;">
+    <tr>
+      <td style="width: 60%;"></td>
+      <td style="width: 40%;font-size: 30pt; font-weight: bold;">Rechnung</td>
+    </tr> 
+    <tr>
+      <td style="vertical-align: top; font-size: 25pt;">
+        [% inv.0.receipient %]<br/>[% inv.0.address %]<br>[% inv.0.zip %] [% inv.0.city %]<br/>[% inv.0.country %]<br/>
+      </td>
+      <td >
+        <table style="border: 1px solid black; width: 100%; font-size: 18pt;">
+          <tr> <td class="invdatalbl">Rechnungs-Nr.</td><td class="invdataval">[% inv.0.reference %]</td></tr>
+          <tr> <td class="invdatalbl">Datum</td><td class="invdataval">[% inv.0.invoicedate %]</td> </tr>
+          <tr> <td class="invdatalbl">Fälligkeit</td><td class="invdataval">[% inv.0.deadlinedate %]</td> </tr>
+          <tr> <td class="invdatalbl">Kundennummer</td><td class="invdataval">[% inv.0.ident %]</td> </tr>
+        </table>
+      </td>
+    </tr>
+    
+  </table>
+  [% qbookings = dksdb.prepare("SELECT id, id_invoice, quantity, unit, description, unitamount, netamount, taxamount, taxpercent, totalamount FROM vw_bookingoutlist where id_invoice= ?;") %]
+
+  <table id="tbl_products" >
+    <thead>
+      <tr>
+      <th>Produkt / Dienstleistung</th>
+      <th style="width: 25mm;" colspan="2">Anz.</th>
+      <th style="width: 25mm;">Einzel-Preis</th>
+      <th style="width: 25mm;">Netto-Summe</th>
+      </tr>
+    </thead>
+    <tbody>
+      [% FOREACH book = qbookings.execute(id_invoice) %]    
+      <tr>
+        <td>[% book.description %]</td>
+        <td class="right" style="width: 10mm;">[% book.quantity %]</td>
+        <td style="width: 15mm;">[% book.unit %]</td>
+        <td class="right">[% book.unitamount %] €</td>
+        <td class="right">[% book.netamount %] €</td>
+      </tr>
+      [% END %]
+          
+    </tbody>
+    <tfoot>
+      <tr>
+        <th colspan="4" class="footer right">Total Netto</td>
+        <td colspan="2" class="right" >[% inv.0.totalnet %] €</td>
+      </tr>
+      <tr>
+          <th colspan="4" class="footer right">MwSt. (17%)</td>
+          <td colspan="2" class="right" style="font-style: italic;">[% inv.0.totalvat %] €</td>
+        </tr>
+        <tr>
+            <th colspan="4" class="footer right">Gesamt zu bezahlen:</td>
+            <td colspan="2" class="right" style="font-weight: bold;">[% inv.0.totalgross %] €</td>
+          </tr>
+    </tfoot>
+  </table>
+  <div style="width: 100%; padding-left: 100mm;margin-top: 10mm;">Nous vous prions de virer le montant ci-dessus au compte<br>
+      <b>LU25 0020 1100 2783 8700 (BILLLULL)</b></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/backoffice/data/reports/invoices/dks-deutsch/dks_500.png b/backoffice/data/reports/invoices/dks-deutsch/dks_500.png
new file mode 100644 (file)
index 0000000..35c6adb
Binary files /dev/null and b/backoffice/data/reports/invoices/dks-deutsch/dks_500.png differ
diff --git a/backoffice/data/reports/invoices/dks-deutsch/sitc.png b/backoffice/data/reports/invoices/dks-deutsch/sitc.png
new file mode 100644 (file)
index 0000000..853b36a
Binary files /dev/null and b/backoffice/data/reports/invoices/dks-deutsch/sitc.png differ
diff --git a/backoffice/data/reports/pot/pot_period.conf b/backoffice/data/reports/pot/pot_period.conf
new file mode 100644 (file)
index 0000000..9861e2b
--- /dev/null
@@ -0,0 +1,12 @@
+PDF_TOP="40mm"
+PDF_BOTTOM="20mm"
+PDF_LEFT="20mm"
+PDF_RIGHT="10mm"
+PDF_SIZE="A4"
+PDF_ORIENTATION="Landscape"
+PDF_ENGINE="Template::Toolkit"
+PDF_ENCODING="UTF-8"
+TEMPLATE_DSN=""
+TEMPLATE_DBUSER=""
+TEMPLATE_DBPASSWORD=""
+REPORT_NAME="POT - Periode"
\ No newline at end of file
diff --git a/backoffice/data/reports/pot/pot_period.footer.tt b/backoffice/data/reports/pot/pot_period.footer.tt
new file mode 100644 (file)
index 0000000..0f19953
--- /dev/null
@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="UTF-8">
+<script>
+function subst() {
+    var vars = {};
+    var query_strings_from_url = document.location.search.substring(1).split('&');
+    for (var query_string in query_strings_from_url) {
+        if (query_strings_from_url.hasOwnProperty(query_string)) {
+            var temp_var = query_strings_from_url[query_string].split('=', 2);
+            vars[temp_var[0]] = decodeURI(temp_var[1]);
+        }
+    }
+    var css_selector_classes = ['page', 'frompage', 'topage', 'webpage', 'section', 'subsection', 'date', 'isodate', 'time', 'title', 'doctitle', 'sitepage', 'sitepages'];
+    for (var css_class in css_selector_classes) {
+        if (css_selector_classes.hasOwnProperty(css_class)) {
+            var element = document.getElementsByClassName(css_selector_classes[css_class]);
+            for (var j = 0; j < element.length; ++j) {
+                element[j].textContent = vars[css_selector_classes[css_class]];
+            }
+        }
+    }
+}
+</script></head>
+<body style="border:0; margin: 0;" onload="subst()">
+<table style="width: 100%;" >
+  <tr><td colspan="2" style="text-align: center;"><b>SAFFRAN IT Consulting s.à r.l.</b> ist eine Handelsbezeichnung von<br/> <b>DKS</b>, Société à responsabilité limitée, <b>RC</b> B168572 - <b>TVA:</b> LU 2537 5617 - <b>No. Aut:</b> 10024550 / 0<br/>
+    <b>IBAN:</b> LU25 0020 1100 2783 8700; <b>BIC:</b> BILLLULL</td></tr>
+  <tr>
+    <td></td>
+    <td style="text-align:right">
+      Seite <span class="page"></span>/<span class="topage"></span>
+    </td>
+  </tr>
+</table>
+</body></html>
\ No newline at end of file
diff --git a/backoffice/data/reports/pot/pot_period.header.tt b/backoffice/data/reports/pot/pot_period.header.tt
new file mode 100644 (file)
index 0000000..8e40350
--- /dev/null
@@ -0,0 +1,20 @@
+<!DOCTYPE html>
+<html><head>
+<meta charset="UTF-8">
+</head><body style="border:0; margin: 0;" o>
+<table style="width: 100%;">
+  <tr>
+    <td style="width: 150mm; margin-top:5mm;"><img src="ttinvoice/sitc.png" style="height: 35mm;"/></td>
+    <td style="width: 60mm;text-align: right;">
+      <div style="text-align: left;width: 60mm; font-size: 12pt;font: sans;">
+          <b>SAFFRAN IT Consulting S.à r.l.</b><br/>
+          4, rue Principale<br/>
+          L-3770 Tétange<br/><br/>
+          Tel: +352 691 504 574<br/>
+          info@saffran.lu / www.saffran.lu<br/>
+      </div>
+    </td>
+    <tr><td style="text-align: left;"></td><td></td></tr>
+  </tr>
+</table>
+</body></html>
diff --git a/backoffice/data/reports/pot/pot_period.tt b/backoffice/data/reports/pot/pot_period.tt
new file mode 100644 (file)
index 0000000..93f96d0
--- /dev/null
@@ -0,0 +1,126 @@
+[% USE DBI %]
+[% USE dksdb = DBI(dsn, dbuser, dbpassword) %]
+<!DOCTYPE html>
+<html>
+<head>
+  <title>Invoice</title>
+  <style>
+  div {
+  font-size: 18pt;
+}
+table {
+  font-size: 18pt;
+  border-spacing: unset;
+  border-collapse: unset;
+}
+td.invdatalbl {
+  font-weight: bold;
+  margin: 1mm; 
+  padding: 2mm;
+  border-collapse:collapse;;
+  width: 30mm;
+  background-color: #c6c6c6;
+}
+td.invdataval {
+  font-weight: normal; 
+  margin: 1mm; 
+  padding: 2mm;
+}
+.right{
+  text-align: right;
+}
+table#tbl_products {
+  border-spacing: 0;
+  border-collapse: 0;
+  margin-top: 10mm;
+  width: 100%;
+}
+table#tbl_products td {
+  padding: 2mm;
+  border-bottom: 1px solid black;
+}
+
+table#tbl_products th {
+  margin: 1mm; 
+  border: 1px solid #fff;
+  border-bottom: 0px;
+  padding: 2mm;
+  background-color: #c6c6c6;
+}
+
+th.footer {
+  margin: 1mm; 
+  border: 1px solid #fff;
+  background-color: unset;
+  border-bottom: 0px;
+  padding: 2mm;
+  text-align: right;
+}
+  </style>
+</head>
+<body>
+  [% qginv = dksdb.prepare("select * from vw_invoiceoutlist WHERE id= ?") %]
+  [% ginv = qginv.execute(id_invoice) %]
+  [% inv = ginv.get_all() %]
+  <table style="width: 100%;">
+    <tr>
+      <td style="width: 60%;"></td>
+      <td style="width: 40%;font-size: 30pt; font-weight: bold;">Rechnung</td>
+    </tr> 
+    <tr>
+      <td style="vertical-align: top; font-size: 25pt;">
+        [% inv.0.receipient %]<br/>[% inv.0.address %]<br>[% inv.0.zip %] [% inv.0.city %]<br/>[% inv.0.country %]<br/>
+      </td>
+      <td >
+        <table style="border: 1px solid black; width: 100%; font-size: 18pt;">
+          <tr> <td class="invdatalbl">Rechnungs-Nr.</td><td class="invdataval">[% inv.0.reference %]</td></tr>
+          <tr> <td class="invdatalbl">Datum</td><td class="invdataval">[% inv.0.invoicedate %]</td> </tr>
+          <tr> <td class="invdatalbl">Fälligkeit</td><td class="invdataval">[% inv.0.deadlinedate %]</td> </tr>
+          <tr> <td class="invdatalbl">Kundennummer</td><td class="invdataval">[% inv.0.ident %]</td> </tr>
+        </table>
+      </td>
+    </tr>
+    
+  </table>
+  [% qbookings = dksdb.prepare("SELECT id, id_invoice, quantity, unit, description, unitamount, netamount, taxamount, taxpercent, totalamount FROM vw_bookingoutlist where id_invoice= ?;") %]
+
+  <table id="tbl_products" >
+    <thead>
+      <tr>
+      <th>Produkt / Dienstleistung</th>
+      <th style="width: 25mm;" colspan="2">Anz.</th>
+      <th style="width: 25mm;">Einzel-Preis</th>
+      <th style="width: 25mm;">Netto-Summe</th>
+      </tr>
+    </thead>
+    <tbody>
+      [% FOREACH book = qbookings.execute(id_invoice) %]    
+      <tr>
+        <td>[% book.description %]</td>
+        <td class="right" style="width: 10mm;">[% book.quantity %]</td>
+        <td style="width: 15mm;">[% book.unit %]</td>
+        <td class="right">[% book.unitamount %] €</td>
+        <td class="right">[% book.netamount %] €</td>
+      </tr>
+      [% END %]
+          
+    </tbody>
+    <tfoot>
+      <tr>
+        <th colspan="4" class="footer right">Total Netto</td>
+        <td colspan="2" class="right" >[% inv.0.totalnet %] €</td>
+      </tr>
+      <tr>
+          <th colspan="4" class="footer right">MwSt. (17%)</td>
+          <td colspan="2" class="right" style="font-style: italic;">[% inv.0.totalvat %] €</td>
+        </tr>
+        <tr>
+            <th colspan="4" class="footer right">Gesamt zu bezahlen:</td>
+            <td colspan="2" class="right" style="font-weight: bold;">[% inv.0.totalgross %] €</td>
+          </tr>
+    </tfoot>
+  </table>
+  <div style="width: 100%; padding-left: 100mm;margin-top: 10mm;">Nous vous prions de virer le montant ci-dessus au compte<br>
+      <b>LU25 0020 1100 2783 8700 (BILLLULL)</b></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/backoffice/data/reports/pot/staff_workplan.conf b/backoffice/data/reports/pot/staff_workplan.conf
new file mode 100644 (file)
index 0000000..5de8ad8
--- /dev/null
@@ -0,0 +1,12 @@
+PDF_TOP="40mm"
+PDF_BOTTOM="20mm"
+PDF_LEFT="20mm"
+PDF_RIGHT="10mm"
+PDF_SIZE="A4"
+PDF_ORIENTATION="Landscape"
+PDF_ENGINE="Template::Toolkit"
+PDF_ENCODING="UTF-8"
+TEMPLATE_DSN=""
+TEMPLATE_DBUSER=""
+TEMPLATE_DBPASSWORD=""
+REPORT_NAME="POT - Salarié"
\ No newline at end of file
diff --git a/backoffice/data/reports/pot/staff_workplan.footer.tt b/backoffice/data/reports/pot/staff_workplan.footer.tt
new file mode 100644 (file)
index 0000000..0f19953
--- /dev/null
@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="UTF-8">
+<script>
+function subst() {
+    var vars = {};
+    var query_strings_from_url = document.location.search.substring(1).split('&');
+    for (var query_string in query_strings_from_url) {
+        if (query_strings_from_url.hasOwnProperty(query_string)) {
+            var temp_var = query_strings_from_url[query_string].split('=', 2);
+            vars[temp_var[0]] = decodeURI(temp_var[1]);
+        }
+    }
+    var css_selector_classes = ['page', 'frompage', 'topage', 'webpage', 'section', 'subsection', 'date', 'isodate', 'time', 'title', 'doctitle', 'sitepage', 'sitepages'];
+    for (var css_class in css_selector_classes) {
+        if (css_selector_classes.hasOwnProperty(css_class)) {
+            var element = document.getElementsByClassName(css_selector_classes[css_class]);
+            for (var j = 0; j < element.length; ++j) {
+                element[j].textContent = vars[css_selector_classes[css_class]];
+            }
+        }
+    }
+}
+</script></head>
+<body style="border:0; margin: 0;" onload="subst()">
+<table style="width: 100%;" >
+  <tr><td colspan="2" style="text-align: center;"><b>SAFFRAN IT Consulting s.à r.l.</b> ist eine Handelsbezeichnung von<br/> <b>DKS</b>, Société à responsabilité limitée, <b>RC</b> B168572 - <b>TVA:</b> LU 2537 5617 - <b>No. Aut:</b> 10024550 / 0<br/>
+    <b>IBAN:</b> LU25 0020 1100 2783 8700; <b>BIC:</b> BILLLULL</td></tr>
+  <tr>
+    <td></td>
+    <td style="text-align:right">
+      Seite <span class="page"></span>/<span class="topage"></span>
+    </td>
+  </tr>
+</table>
+</body></html>
\ No newline at end of file
diff --git a/backoffice/data/reports/pot/staff_workplan.header.tt b/backoffice/data/reports/pot/staff_workplan.header.tt
new file mode 100644 (file)
index 0000000..8e40350
--- /dev/null
@@ -0,0 +1,20 @@
+<!DOCTYPE html>
+<html><head>
+<meta charset="UTF-8">
+</head><body style="border:0; margin: 0;" o>
+<table style="width: 100%;">
+  <tr>
+    <td style="width: 150mm; margin-top:5mm;"><img src="ttinvoice/sitc.png" style="height: 35mm;"/></td>
+    <td style="width: 60mm;text-align: right;">
+      <div style="text-align: left;width: 60mm; font-size: 12pt;font: sans;">
+          <b>SAFFRAN IT Consulting S.à r.l.</b><br/>
+          4, rue Principale<br/>
+          L-3770 Tétange<br/><br/>
+          Tel: +352 691 504 574<br/>
+          info@saffran.lu / www.saffran.lu<br/>
+      </div>
+    </td>
+    <tr><td style="text-align: left;"></td><td></td></tr>
+  </tr>
+</table>
+</body></html>
diff --git a/backoffice/data/reports/pot/staff_workplan.tt b/backoffice/data/reports/pot/staff_workplan.tt
new file mode 100644 (file)
index 0000000..93f96d0
--- /dev/null
@@ -0,0 +1,126 @@
+[% USE DBI %]
+[% USE dksdb = DBI(dsn, dbuser, dbpassword) %]
+<!DOCTYPE html>
+<html>
+<head>
+  <title>Invoice</title>
+  <style>
+  div {
+  font-size: 18pt;
+}
+table {
+  font-size: 18pt;
+  border-spacing: unset;
+  border-collapse: unset;
+}
+td.invdatalbl {
+  font-weight: bold;
+  margin: 1mm; 
+  padding: 2mm;
+  border-collapse:collapse;;
+  width: 30mm;
+  background-color: #c6c6c6;
+}
+td.invdataval {
+  font-weight: normal; 
+  margin: 1mm; 
+  padding: 2mm;
+}
+.right{
+  text-align: right;
+}
+table#tbl_products {
+  border-spacing: 0;
+  border-collapse: 0;
+  margin-top: 10mm;
+  width: 100%;
+}
+table#tbl_products td {
+  padding: 2mm;
+  border-bottom: 1px solid black;
+}
+
+table#tbl_products th {
+  margin: 1mm; 
+  border: 1px solid #fff;
+  border-bottom: 0px;
+  padding: 2mm;
+  background-color: #c6c6c6;
+}
+
+th.footer {
+  margin: 1mm; 
+  border: 1px solid #fff;
+  background-color: unset;
+  border-bottom: 0px;
+  padding: 2mm;
+  text-align: right;
+}
+  </style>
+</head>
+<body>
+  [% qginv = dksdb.prepare("select * from vw_invoiceoutlist WHERE id= ?") %]
+  [% ginv = qginv.execute(id_invoice) %]
+  [% inv = ginv.get_all() %]
+  <table style="width: 100%;">
+    <tr>
+      <td style="width: 60%;"></td>
+      <td style="width: 40%;font-size: 30pt; font-weight: bold;">Rechnung</td>
+    </tr> 
+    <tr>
+      <td style="vertical-align: top; font-size: 25pt;">
+        [% inv.0.receipient %]<br/>[% inv.0.address %]<br>[% inv.0.zip %] [% inv.0.city %]<br/>[% inv.0.country %]<br/>
+      </td>
+      <td >
+        <table style="border: 1px solid black; width: 100%; font-size: 18pt;">
+          <tr> <td class="invdatalbl">Rechnungs-Nr.</td><td class="invdataval">[% inv.0.reference %]</td></tr>
+          <tr> <td class="invdatalbl">Datum</td><td class="invdataval">[% inv.0.invoicedate %]</td> </tr>
+          <tr> <td class="invdatalbl">Fälligkeit</td><td class="invdataval">[% inv.0.deadlinedate %]</td> </tr>
+          <tr> <td class="invdatalbl">Kundennummer</td><td class="invdataval">[% inv.0.ident %]</td> </tr>
+        </table>
+      </td>
+    </tr>
+    
+  </table>
+  [% qbookings = dksdb.prepare("SELECT id, id_invoice, quantity, unit, description, unitamount, netamount, taxamount, taxpercent, totalamount FROM vw_bookingoutlist where id_invoice= ?;") %]
+
+  <table id="tbl_products" >
+    <thead>
+      <tr>
+      <th>Produkt / Dienstleistung</th>
+      <th style="width: 25mm;" colspan="2">Anz.</th>
+      <th style="width: 25mm;">Einzel-Preis</th>
+      <th style="width: 25mm;">Netto-Summe</th>
+      </tr>
+    </thead>
+    <tbody>
+      [% FOREACH book = qbookings.execute(id_invoice) %]    
+      <tr>
+        <td>[% book.description %]</td>
+        <td class="right" style="width: 10mm;">[% book.quantity %]</td>
+        <td style="width: 15mm;">[% book.unit %]</td>
+        <td class="right">[% book.unitamount %] €</td>
+        <td class="right">[% book.netamount %] €</td>
+      </tr>
+      [% END %]
+          
+    </tbody>
+    <tfoot>
+      <tr>
+        <th colspan="4" class="footer right">Total Netto</td>
+        <td colspan="2" class="right" >[% inv.0.totalnet %] €</td>
+      </tr>
+      <tr>
+          <th colspan="4" class="footer right">MwSt. (17%)</td>
+          <td colspan="2" class="right" style="font-style: italic;">[% inv.0.totalvat %] €</td>
+        </tr>
+        <tr>
+            <th colspan="4" class="footer right">Gesamt zu bezahlen:</td>
+            <td colspan="2" class="right" style="font-weight: bold;">[% inv.0.totalgross %] €</td>
+          </tr>
+    </tfoot>
+  </table>
+  <div style="width: 100%; padding-left: 100mm;margin-top: 10mm;">Nous vous prions de virer le montant ci-dessus au compte<br>
+      <b>LU25 0020 1100 2783 8700 (BILLLULL)</b></div>
+</body>
+</html>
\ No newline at end of file
index 18ad2d4..020a59a 100755 (executable)
@@ -191,9 +191,9 @@ $vars->{params}= $p;
 #END - iFrame - Modules
 
 $template->process($skl,$vars) || die "Template process failed: ", $template->error(), "\n";
-# print "/*".Dumper($vars)."*/";
+#print "/*".Dumper($vars)."*/";
 # if ($vars->{page} =~ /\.tt/){
-#    print '<pre  >'.Dumper($p)."<pre>";
+#    print '<pre  >'.Dumper($vars)."<pre>";
 # } 
 
 
index e944507..5fce5c9 100644 (file)
@@ -78,7 +78,7 @@ document.addEventListener("DOMContentLoaded", function() {
   \r
   choice["company"]["schemata"] = new Choices('#schemata',{\r
     searchEnabled: false,\r
-    itemSelectText: 'x',\r
+    itemSelectText: '',\r
     removeItemButton: false,\r
     choices : []\r
   });\r
@@ -92,12 +92,14 @@ function getschemata(){
 \r
 function fillschematalist(data){\r
   console.log(data);\r
-  fillselectlist(choice["company"]["schemata"],data,'schemata','company');\r
+  fillselectlist(choice["company"]["schemata"],data,'schemaname','company');\r
   \r
   return false;\r
 }\r
 \r
 function fillselectlist(obj,data,vidcol,vvalcol){\r
+  console.log("fillselectlist");\r
+  console.log(data);\r
   var sellist = [];\r
   obj.clearStore();\r
   if (data){\r
index 32c1f50..69efe9f 100644 (file)
@@ -1,7 +1,11 @@
-function saveform(frmid,aftercallback){
+function saveform(frmid,aftercallback,clientschema){
   var flds=getformcontent(frmid,null);
   flds["fn"] ="saveform";
-  flds["schemata"]=schemata;
+  flds["schemata"]=clientschema;
+  if (clientschema == null){
+    flds["schemata"]=schemata;
+  }
+  
   //console.log(flds);
   delete flds["null"]; 
   if (aftercallback){
@@ -14,6 +18,23 @@ function saveform(frmid,aftercallback){
   return false;
 }
 
+function saveformdata(flds,aftercallback,clientschema){
+  flds["fn"] ="saveform";
+  flds["schemata"]=clientschema;
+  if (clientschema == null){
+    flds["schemata"]=schemata;
+  }
+  delete flds["null"];
+  if (aftercallback){
+    req.reqdata("POST","index.cgi",flds,aftercallback);
+    formsaved({});
+  }
+  else {
+    req.reqdata("POST","index.cgi",flds,formsaved);
+  }
+  return false;
+}
+
 function formsaved(data){
   var sb = document.getElementById("snackbar");
   sb.className="show w3-green";
@@ -252,10 +273,15 @@ function fillformbydataclass2(dataclass,choices,data){
             frm[f]._flatpickr.setDate(data[frm[f].id]);
           } else if (frm[f].classList.contains("timefield")){ 
             frm[f]._flatpickr.setDate(data[frm[f].id]);
-          }else if (frm[f].classList.contains("choices__input")){  
+          }else if (frm[f].classList.contains("choices__input")){ 
             if ((data[frm[f].id] != null) && (data[frm[f].id] != '[""]')){
               console.log(frm[f].id);
-              choices[frm[f].id].setValue(JSON.parse(data[frm[f].id])); 
+              if (data[frm[f].id].startsWith('["')){
+                choices[frm[f].id].setValue(JSON.parse(data[frm[f].id]));
+              }
+              else {
+                choices[frm[f].id].setChoiceByValue(data[frm[f].id]);
+              } 
             }
           } else {
             frm[f].value=data[frm[f].id];
index 19f2a33..4e80e02 100644 (file)
@@ -82,7 +82,7 @@ var req = {
          //console.log("Status returned: " + request.status + "resp:" + request.getResponseHeader("Content-Type"));
         if (request.getResponseHeader("Content-Type").indexOf('application/json') == 0){
           if (request.responseText){
-            //console.log(request.responseText);
+            console.log(request.responseText);
             var xparse = JSON.parse(request.responseText);
             ret = xparse.result;
           } else {
index b3d5fb7..21e4b32 100644 (file)
@@ -9,6 +9,7 @@
     </header>
     <div class="w3-container">
       <span id="askdelete">êtes vous sûre de vouloir supprimer la rangé sélectionné?</span>
+        [% fieldhidden("dlgdelschema","delete",'','') %]
         [% fieldhidden("dlgdeltable","delete",'','') %]
         [% fieldhidden("dlgdelrowid","delete",'','') %]
     </div>
 <script>
 var afterdeletecallback = null;
 
-function showdeletedlg(deltable,delid,question,callback){
+function showdeletedlg(deltable,delid,question,callback,delschema){
   if (question){
     document.getElementById('askdelete').innerHTML = question;
   }
   
   document.getElementById('dlgdeltable').value=deltable;
   document.getElementById('dlgdelrowid').value=delid;
+  document.getElementById('dlgdelschema').value=delschema;
   afterdeletecallback = callback;
   document.getElementById('dlgdeleterow').style.display='block';
   return false;
@@ -37,7 +39,7 @@ function deleterow_confirmed(){
   //var deltbl = "ident_"+ document.getElementById('dlgdeltable').value + "_id";
   req.reqdata("POST", "db.cgi", {
               "del2": "1",
-              "schemata": schemata,
+              "schemata": document.getElementById('dlgdelschema').value,
                "id" : document.getElementById('dlgdelrowid').value,
                "table": document.getElementById('dlgdeltable').value
           }, afterdelete);
index ce6ac4e..5998449 100644 (file)
@@ -90,11 +90,11 @@ var companies ={
     var udata = companies.tbl.getSelectedData();
     if (udata[0]) {
       var uid = udata[0].id;
-      showdeletedlg("companies",uid,"Êtes vous sûre de supprimer l'entrprise sélectionnée?",companies.afterdeletecallback);
+      showdeletedlg("companies",uid,"Êtes vous sûre de supprimer l'entrprise sélectionnée?",companies.afterdeletecallback,schemata);
       //module.viewpanel('tbl_' + companies.name);
     }
   },
-  saveform: function(){
+  save: function(){
     var company = document.getElementById("company").value;
     if (company == ''){
       showmessagedlg("Erreur",'<div class="panel w3-red">Le Champ "Entreprise" ne doit pas être vide!</div>');
@@ -107,7 +107,7 @@ var companies ={
     //var wpdata = getformcontent(companies.name);
     //TODO: save form
     //console.log(wpdata);
-    saveform(companies.name);
+    saveform(companies.name,schemata,null);
     if (document.getElementById("id").value == ""){
       console.log("Install new schema now!");
       req.reqdata("POST","index.cgi",{"fn":"installschema","schemaname":document.getElementById("schemata").value},companies.afterschemainstall);
index 44881ad..698f39a 100644 (file)
@@ -41,7 +41,7 @@
               [% END %]
           </div>
           <div class="w3-container w3-right-align">
-            <button class="w3-button w3-blue-grey w3-margin" id="btnsave_companies" onclick="companies.saveform();return false;">sauvegarder</button>
+            <button class="w3-button w3-blue-grey w3-margin" id="btnsave_companies" onclick="companies.save();return false;">sauvegarder</button>
           </div>
         </div>
       </form>
       <h2 id="">Département</h2>
     </header>
     <div class="w3-container">
+      <form id="frm_staffgroups">
       [% fieldhidden("id","staffgroups",'ident','') %] 
       [% fieldeditbox("groupname","staffgroups","Nom du Département",'w3-third','','','') %]
+      </form>
     </div>
     <footer class="w3-container w3-right-align w3-padding-16">
     <button class="w3-button w3-blue-grey w3-margin-right w3-border" onclick="document.getElementById('dlg_staffgroups').style.display='none'; return false;">Annuler</button>  
-    <button class="w3-button w3-margin-right w3-border" onclick="saveform('staffgroups',staffgroups.aftersavedcallback);">Sauvegarder</button>
+    <button class="w3-button w3-margin-right w3-border" onclick="staffgroups.save();">Sauvegarder</button>
     </footer>
   </div>
 </div>
index 56127d8..c3992c8 100644 (file)
@@ -53,21 +53,25 @@ var staffgroups = {
     var udata = staffgroups.tbl.getSelectedData();
     if (udata[0]) {
       var uid = udata[0].id;
-      showdeletedlg("staffgroups",uid,"Êtes vous sûre de supprimer le departement sélectionné?",staffgroups.afterdeletecallback);
+      showdeletedlg("staffgroups",uid,"Êtes vous sûre de supprimer le departement sélectionné?",staffgroups.afterdeletecallback,parent.admin.getcurrentSchemata());
       //module.viewpanel('tbl_' + companies.name);
     }
   },
-  saveform: function(){
+  save: function(){
     //var wpdata = getformcontent(companies.name);
     //TODO: save form
     //console.log(wpdata);
-    saveform(stafffroups.name);
-    staffgroups.gettbldata();
+    saveform(staffgroups.name,staffgroups.aftersavedcallback,parent.admin.getcurrentSchemata());
+    
+    return false;
   },
   afterdeletecallback: function(data){
+
     staffgroups.gettbldata();
   },
   aftersavedcallback: function(){
-
+    staffgroups.gettbldata();
+    document.getElementById('dlg_staffgroups').style.display='none';
+    return false;
   }
 }
\ No newline at end of file
index b8145c6..aa14904 100644 (file)
@@ -1,7 +1,9 @@
-[% appaccess = dksdb.prepare("select ap.icon,ap.app,ap.name,ug.usergroup 
+[% appaccess = dksdb.prepare("select ap.icon,ap.app,ap.name,string_agg(ug.usergroup,',') as usergroup
 from (SELECT users.id,json_array_elements_text(users.id_usergroups)::INT4 AS id_usergroup FROM users) uig 
-join apps ap on (uig.id_usergroup=ap.id_usergroup) 
-join usergroups ug on (uig.id_usergroup=ug.id) where uig.id=? and ap.app != 'dashboard' order by ap.sort; ") %]
+join (SELECT apps.id,apps.icon,apps.app,apps.name,apps.sort,json_array_elements_text(apps.id_usergroups)::INT4 as id_usergroup FROM apps) ap on (uig.id_usergroup=ap.id_usergroup) 
+join usergroups ug on (uig.id_usergroup=ug.id) where uig.id=?
+group by ap.id,ap.icon,ap.name,ap.app,ap.sort
+order by ap.sort; ") %]
 
 <div class="w3-display-container">
   <div class="w3-container">
similarity index 94%
rename from backoffice/tmpl/module/planning/index.tt
rename to backoffice/tmpl/module/periods/index.tt
index c695aaa..09a53ad 100644 (file)
@@ -13,6 +13,8 @@
       src="[% abspath%]img/icons/edit_white.svg" style="height: 24px;" /></button>
                 <button class="w3-bar-item w3-button w3-border  w3-right w3-blue-grey" onclick="reportperiod.add();"><img
       src="[% abspath%]img/icons/plus_white.svg" style="height: 24px;" /></button>
+      <button class="w3-bar-item w3-button w3-border  w3-right" onclick="reportperiod.loadplan();"><img
+      src="[% abspath%]img/icons/poticon.svg" style="height: 24px;" /></button>
             </div>
             <div class="toolbar" id="tbar_tbl_staffworkplan" style="display: none;">
                 <span id="reportperiodtitle"></span>
@@ -87,7 +89,7 @@
                         [% END %]
                     </div>
                     <div class="w3-container w3-right-align">
-                        <button class="w3-button w3-blue-grey w3-margin" id="btnsave_staffworkplan_edit" onclick="staffworkplan.saveform();return false;">sauvegarder</button>
+                        <button class="w3-button w3-blue-grey w3-margin" id="btnsave_staffworkplan_edit" onclick="staffworkplan.save_edit();return false;">sauvegarder</button>
                     </div>
                 </div>
             </form>
                         [% END %]
                     </div>
                     <div class="w3-container w3-right-align">
-                        <button class="w3-button w3-blue-grey w3-margin" id="btnsave_staffworkplan_add" onclick="staffworkplan.saveform();return false;">sauvegarder</button>
+                        <button class="w3-button w3-blue-grey w3-margin" id="btnsave_staffworkplan_add" onclick="staffworkplan.save();return false;">sauvegarder</button>
                     </div>
                 </div>
             </form>
             <div class="w3-container">
                 <form id="frm_reportperiod">
                     [% fieldhidden("id","reportperiod",'ident','') %] 
-                    [% fieldeditbox("periodname","reportperiod","Nom",'w3-third','','','') %] 
+                    <div class="w3-cell-row">
+                    [% fieldeditbox("periodname","reportperiod","Nom",'','','','') %] 
+                    </div>
+                    <div class="w3-cell-row">
+                    [% fieldselectbox("id_staffgroup","reportperiod","Déparetement",'w3-half','','','') %]
+                    </div>
+                    <div class="w3-cell-row">
                     [% fielddatebox("startdate","reportperiod","début",'w3-fifth','','','') %] 
                     [% fielddatebox("enddate","reportperiod","fin",'w3-fifth','','','') %]
+                    </div>
                 </form>
             </div>
             <footer class="w3-container w3-right-align w3-padding-16">
@@ -1,6 +1,7 @@
 var reportperiod ={
   tbl: null,
   name: "reportperiod",
+  choices:{"id_staffgroup":null},
   initform: function(){
     flatpickr("#startdate",{altInput: true,
       altFormat: "d.m.Y",
@@ -26,6 +27,13 @@ var reportperiod ={
       ],
       "locale": "fr",
     });
+    reportperiod.choices["id_staffgroup"] = new Choices('#id_staffgroup',{
+      searchEnabled: false,
+      itemSelectText: '',
+      removeItemButton: false,
+      choices : []
+    });
+    reportperiod.getstaffgroups();
   },
   inittable: function(){
     reportperiod.tbl = new Tabulator("#tbl_" + reportperiod.name, {
@@ -33,21 +41,12 @@ var reportperiod ={
       height: "94vh",
       layout: "fitDataFill",
       selectable: 1,
-      rowContext:function(e, row){
-        //e - the click event object
-        //row - row component
-        //var contextMenu = CtxMenu();
-        //contextMenu.addItem("Editer", edit());
-      // Add our custom function to the menu
-    //cntextMenu.addItem("Hello World", ContextMenuExampleFunction);
-  
-    // Add a seperator
-    //contextMenu.addSeperator();
-        e.preventDefault(); // prevent the browsers default context menu form appearing.
-        },
+      rowContext:function(e, row){e.preventDefault();},
       columns: [{title: "Nom", field: "periodname",headerFilter: "input"}, 
+      {title: "Déparement", field: "groupname",headerFilter: "input"}, 
       { title: "Début",field: "startdate",formatter:"datetime",formatterParams:{inputFormat:"YYYY-MM-DD",outputFormat:"DD.MM.YYYY",invalidPlaceholder:""} },
       { title: "Fin",field: "enddate",formatter:"datetime",formatterParams:{inputFormat:"YYYY-MM-DD",outputFormat:"DD.MM.YYYY",invalidPlaceholder:""} },
+
       ]
   });
   //
@@ -61,27 +60,45 @@ var reportperiod ={
     if (data && data.sqldata) { reportperiod.tbl.setData(data.sqldata);}
   },
   add: function(){
+    //console.log("TEST Add Period!");
+    cleanform(reportperiod.name);
+    module.viewdialog(reportperiod.name,null);
+    return false;
+  },
+  edit: function(){
+    var udata = reportperiod.tbl.getSelectedData();
+    if (udata[0]) {
+      var uid = udata[0].id;
+      req.reqdata("POST","db.cgi",{ "get":  reportperiod.name + "data","schemata":schemata,"filter":"id=" + uid},reportperiod.fillform);
+    }
     console.log("TEST Add Period!");
     //cleanform(reportperiod.name);
     module.viewdialog(reportperiod.name,null);
     return false;
   },
+  fillform: function(data){
+    if (data && data.sqldata){
+      //console.log("Fill Form 2");
+      fillformbydataclass2(reportperiod.name,reportperiod.choices,data.sqldata[0]);
+    }
+  },
   remove: function(){
     var udata = reportperiod.tbl.getSelectedData();
     if (udata[0]) {
-      showdeletedlg(reportperiod.name,udata[0].id,null,reportperiod.afterperiodremove);
+      showdeletedlg(reportperiod.name,udata[0].id,null,reportperiod.afterperiodremove,schemata);
     }
   },
-  edit: function(){
+  loadplan: function(){
     var udata = reportperiod.tbl.getSelectedData();
     if (udata[0]) {
       
       var uid = udata[0].id;
       staffworkplan.datefrom = udata[0].startdate; 
       staffworkplan.dateto = udata[0].enddate;
-      console.log("StaffPeriod:" + staffworkplan.datefrom + "->" +staffworkplan.dateto);
+      staffworkplan.id_staffgroup= udata[0].id_staffgroup;
+      console.log("StaffPeriod:"  + " ID: "+ udata[0].id_staffgroup +"  " + staffworkplan.datefrom + "->" +staffworkplan.dateto);
       staffworkplan.getstaff();
-      document.getElementById("reportperiodtitle").innerHTML="&nbsp;Periode du <strong>" + moment(udata[0].startdate).lang("fr").format('DD.MM.YYYY')  + "</strong> au <strong>" + moment(udata[0].enddate).lang("fr").format('DD.MM.YYYY') + "</strong>";
+      document.getElementById("reportperiodtitle").innerHTML="&nbsp;Periode du <strong>" + moment(udata[0].startdate).lang("fr").format('DD.MM.YYYY')  + "</strong> au <strong>" + moment(udata[0].enddate).lang("fr").format('DD.MM.YYYY') + "</strong> - Département <strong>" + udata[0].groupname + "</strong>";
       staffworkplan.gettbldata();
       module.viewpanel('tbl_' + staffworkplan.name);
       
@@ -91,13 +108,21 @@ var reportperiod ={
     reportperiod.gettbldata();
     document.getElementById('dlg_reportperiod').style.display='none';
   },
-  viewstaffplan: function(){
-    var udata = reportperiod.tbl.getSelectedData();
-    if (udata[0]){
-      staffworkplan.datefrom = udata[0].startdate;
-      staffworkplan.dateto = udata[0].enddate;
-      staffworkplan.gettbldata();
-      module.viewpanel('tbl_staffworkplan');
-    }
-  }
+  // viewstaffplan: function(){
+  //   var udata = reportperiod.tbl.getSelectedData();
+  //   if (udata[0]){
+  //     staffworkplan.datefrom = udata[0].startdate;
+  //     staffworkplan.dateto = udata[0].enddate;
+  //     staffworkplan.gettbldata();
+  //     module.viewpanel('tbl_staffworkplan');
+  //   }
+  // },
+  getstaffgroups: function(){
+    req.reqdata("POST","db.cgi",{"get":"staffgroupslist","schemata":schemata},reportperiod.fillstaffgroups);
+  },
+  fillstaffgroups: function(data){
+    fillselectlist(reportperiod.choices["id_staffgroup"],data.sqldata,'id','groupname');
+    
+  },
+  
 }
\ No newline at end of file
@@ -6,6 +6,7 @@ var staffworkplan ={
   current_workplan: null,
   datefrom: null,
   dateto: null,
+  id_staffgroup: null,
   name: "staffworkplan",
   choices:{"id_staff_add":null,"id_workplan":null,"id_workplan_add":null,"dayvacancy":null},
   dateinputs:{"dates_add":null,"daterange_add":null},
@@ -212,7 +213,7 @@ var staffworkplan ={
       module.viewpanel('tbl_' + staffworkplan.name);
     }
   },
-  saveform_edit: function(){
+  save_edit: function(){
     var datamsg = "";
     var wpdata = getformcontent(staffworkplan.name+ "_edit");
     if (!wpdata["staffworkplan_id_staff"]){
@@ -297,7 +298,7 @@ var staffworkplan ={
     //closedataloaddlg();
     return false;
   },
-  saveform: function(){
+  save: function(){
     var datamsg = "";
     var wpdata = getformcontent(staffworkplan.name+ "_add");
     if (!wpdata["staffworkplan_id_staff_add"]){
@@ -383,9 +384,8 @@ var staffworkplan ={
     return false;
   },
   getstaff: function(){
-    /* datefrom as date!!! select id_staff,staffname from portanova.vw_staffworkplanstafflist
-where ;*/
-    req.reqdata("POST","db.cgi",{"get":"staffworkplanstafflist","fields":"id_staff,staffname","schemata":schemata,"filter":"date('"+staffworkplan.datefrom+"') >= entrydate and (date('"+staffworkplan.datefrom+"') <= leavedate or leavedate is null) and ((date('"+staffworkplan.datefrom+"') between startdate and enddate) or (date('"+staffworkplan.datefrom+"') >= startdate and enddate is null)) group by id_staff,staffname"},staffworkplan.fillstaff);
+    
+    req.reqdata("POST","db.cgi",{"get":"staffworkplanstafflist","fields":"id_staff,staffname","schemata":schemata,"filter":"id_staffgroup="+ staffworkplan.id_staffgroup +" and ( date('"+staffworkplan.datefrom+"') >= entrydate and (date('"+staffworkplan.datefrom+"') <= leavedate or leavedate is null) and ((date('"+staffworkplan.datefrom+"') between startdate and enddate) or (date('"+staffworkplan.datefrom+"') >= startdate and enddate is null))) group by id_staff,staffname"},staffworkplan.fillstaff);
   },
   fillstaff: function(data){
     console.log("STAFFDATA")
@@ -408,7 +408,7 @@ where ;*/
       //console.log(data.sqldata[0]);
       var wpdata = data.sqldata[0];
       delete wpdata["id"];
-      fillformbydataclass("staffworkplan",data.sqldata[0],false);
+      fillformbydataclass2("staffworkplan",data.sqldata[0],false);
       for (var w in weekdays){
         //console.log()
         staffworkplan.checktime(weekdays[w] + "_timestart1");
@@ -432,7 +432,7 @@ where ;*/
         wpdata_add[w+ "_add"] = wpdata[w];
       }
       delete wpdata["id"];
-      fillformbydataclass("staffworkplan_add",wpdata_add,false);
+      fillformbydataclass2("staffworkplan_add",wpdata_add,false);
       for (var w in weekdays){
         //console.log()
         staffworkplan.checktime(weekdays[w] + "_timestart1_add");
index 49941fd..43c1b73 100644 (file)
@@ -2,7 +2,7 @@
 <div class="w3-display-container">
   <div class="w3-top w3-theme-light w3-border-bottom">
     <div class="w3-bar">
-      <button class="w3-bar-item w3-button w3-border  w3-blue-grey w3-hover-text-white" onclick="module.viewpanel('tbl_staff');">Employé(e)s</button>
+      <button class="w3-bar-item w3-button w3-border  w3-blue-grey w3-hover-text-white" onclick="staff.viewtable();">Salariés</button>
       <div class="toolbar" id="tbar_tbl_staff" style="display: none;">
   <button class="w3-bar-item w3-button w3-border  w3-right w3-red" onclick="staff.remove();"><img src="[% abspath%]img/icons/remove_white.svg" style="height: 24px;"/></button>
   <button class="w3-bar-item w3-button w3-border  w3-right w3-blue-grey" onclick="staff.edit();"><img src="[% abspath%]img/icons/edit_white.svg" style="height: 24px;"/></button>
@@ -18,7 +18,7 @@
   <div class="w3-display-container w3-padding-24 panel" id="pnl_frm_staff" style="display: none; margin-top: 20px;" >
     <div class="w3-container  w3-padding-24 w3-card  w3-margin w3-margin-bottom">
       <form id="frm_staff">
-        <h3>Données de base de l'employé(e)</h3>
+        <h3>Données de base du salarié</h3>
         <div class="w3-row-padding"> 
           <div class="w3-container">
             [% fieldhidden('id','staff','ident') %]
               [% fieldeditbox('email','staff','email','w3-third','','','') %]
               <div class="w3-container">
               [% fielddatebox('birthdate','staff',"date de naissance",'w3-third','','') %]
-              [% fielddatebox('entrydate','staff',"date d'entrée",'w3-third','','') %]
-              [% fielddatebox('leavedate','staff',"date de sortie",'w3-third','','') %]
               </div>
             </div>
   
         </div>
         
-            [% formsavebutton('staff','sauvegarder') %]
+            <div class="w3-container w3-right-align">
+                        <button class="w3-button w3-blue-grey w3-margin" id="btnsave_staff" onclick="staff.save();return false;">sauvegarder</button>
+                    </div>
             </div>
         </form>
     </div>
 
-    <div class="w3-container  w3-padding-24 w3-card  w3-margin w3-margin-bottom">
+    <div class="w3-container  w3-padding-24 w3-card  w3-margin w3-margin-bottom" id="section_staffcontract">
         <h3>Données contractuelles</h3>
         <div class="subtoolbar"  >
 <div class="w3-bar">
       
-      <button class="w3-bar-item w3-button w3-border  w3-right w3-red" onclick="staffcontract.remove();"><img src="[% abspath%]img/icons/remove_white.svg" style="height: 24px;"/></button>
+      <button class="w3-bar-item w3-button w3-border  w3-right w3-red" id="btn_delete_staffcontract" onclick="staffcontract.remove();"><img src="[% abspath%]img/icons/remove_white.svg" style="height: 24px;"/></button>
       <button class="w3-bar-item w3-button w3-border  w3-right w3-blue-grey" onclick="staffcontract.edit();"><img src="[% abspath%]img/icons/edit_white.svg" style="height: 24px;"/></button>
-      <button class="w3-bar-item w3-button w3-border  w3-right w3-blue-grey" onclick="staffcontract.add();"><img src="[% abspath%]img/icons/plus_white.svg" style="height: 24px;"/></button> 
+      <button class="w3-bar-item w3-button w3-border  w3-right w3-blue-grey"  onclick="staffcontract.add();"><img src="[% abspath%]img/icons/plus_white.svg" style="height: 24px;"/></button> 
       </div>
       </div>
         <div id="tbl_staffcontract" >
@@ -85,7 +85,7 @@
     </div>
     <footer class="w3-container w3-right-align w3-padding-16">
     <button class="w3-button w3-theme-light w3-margin-right w3-border" onclick="document.getElementById('dlg_staffcontract').style.display='none'; return false;">Annuler</button>
-    <button class="w3-button w3-blue-grey w3-margin-right w3-border" onclick="staffcontract.saveform();">sauvegarder</button>  
+    <button class="w3-button w3-blue-grey w3-margin-right w3-border" onclick="staffcontract.save();">sauvegarder</button>  
     </footer>
   </div>
 </div>
index 4742f4e..4976f17 100644 (file)
@@ -13,18 +13,18 @@ var staff ={
       dateFormat: "Y-m-d",
       "locale": "fr",
     });
-    flatpickr("#entrydate",{altInput: true,
-      altFormat: "d.m.Y",
-      dateFormat: "Y-m-d",
-      "locale": "fr",
-      weekNumbers: true,
-    });
-    flatpickr("#leavedate",{altInput: true,
-      altFormat: "d.m.Y",
-      dateFormat: "Y-m-d",
-      "locale": "fr",
-      weekNumbers: true,
-    });
+    // flatpickr("#entrydate",{altInput: true,
+    //   altFormat: "d.m.Y",
+    //   dateFormat: "Y-m-d",
+    //   "locale": "fr",
+    //   weekNumbers: true,
+    // });
+    // flatpickr("#leavedate",{altInput: true,
+    //   altFormat: "d.m.Y",
+    //   dateFormat: "Y-m-d",
+    //   "locale": "fr",
+    //   weekNumbers: true,
+    // });
   },
   inittable: function(){
     staff.initform();
@@ -83,6 +83,8 @@ var staff ={
   
   add: function(){
     cleanform2("staff",staff.choices);
+    staffcontract.tbl.clearData();
+    document.getElementById("section_staffcontract").style.display = 'none';
     module.viewpanel("frm_" + staff.name);
     //module.viewdialog(staff.name,null);
     //document.getElementById("company").addEventListener('blur', function(event){staff.checkschema(event,this.id);},true);
@@ -91,6 +93,7 @@ var staff ={
   edit: function(){
     //console.log("force remove event");
     //document.getElementById("company").removeEventListener('blur',function(){},true);
+    document.getElementById("section_staffcontract").style.display = 'block';
     var udata = staff.tbl.getSelectedData();
     if (udata[0]) {
       staff.current_id = udata[0].id;
@@ -111,11 +114,31 @@ var staff ={
     var udata = staff.tbl.getSelectedData();
     if (udata[0]) {
       var uid = udata[0].id;
-      showdeletedlg("staff",uid,"Êtes vous sûre de supprimer l'employé(e) sélectionnée?",staff.afterdeletecallback);
+      showdeletedlg("staff",uid,"Êtes vous sûre de supprimer l'employé(e) sélectionnée?",staff.afterdeletecallback,schemata);
       //module.viewpanel('tbl_' + staff.name);
     }
   },
   afterdeletecallback: function(data){
     staff.gettbldata();
+  },
+  viewtable: function(){
+    staff.gettbldata();
+    module.viewpanel('tbl_staff');
+    return false;
+  },
+  save: function(){
+    var fdata = getformcontent(staff.name);
+    fdata["ident"] = "id";
+    saveformdata(fdata,staff.aftersavecallback,schemata);
+    return false;
+  },
+  aftersavecallback: function(data){
+    console.log(data);
+    if (data && data.id){
+      staff.current_id=data.id;
+      document.getElementById("section_staffcontract").style.display = 'block';
+    }
+    
+    return false;
   }
 }
index 825be3d..77e4b6b 100644 (file)
@@ -20,24 +20,24 @@ var staffcontract = {
       dateFormat: "Y-m-d",
       "locale": "fr",
       weekNumbers: true,
-      "disable": [
-        function(date) {
-            // return true to disable
-            return (date.getDay() !== 1);
-        }
-      ],
+      // "disable": [
+      //   function(date) {
+      //       // return true to disable
+      //       return (date.getDay() !== 1);
+      //   }
+      // ],
     });
     flatpickr("#enddate",{altInput: true,
       altFormat: "d.m.Y",
       dateFormat: "Y-m-d",
       "locale": "fr",
       weekNumbers: true,
-      "disable": [
-        function(date) {
-            // return true to disable
-            return (date.getDay() !== 0);
-        }
-      ],
+      // "disable": [
+      //   function(date) {
+      //       // return true to disable
+      //       return (date.getDay() !== 0);
+      //   }
+      // ],
     });
   },
   inittable: function(){
@@ -93,11 +93,19 @@ var staffcontract = {
     req.reqdata("POST", "db.cgi", { "get": "staffcontractlist","schemata":schemata,"filter":"id_staff='"+ staff.current_id +"'"}, staffcontract.loadtbldata);
   },
   loadtbldata: function(data){
-    if (data && data.sqldata) { staffcontract.tbl.setData(data.sqldata);}
+    if (data && data.sqldata) { 
+      if (data.sqldata.size <= 1){
+        document.getElementById("btn_delete_staffcontract").style.display= 'none';
+      }else {
+        document.getElementById("btn_delete_staffcontract").style.display= 'block';
+      }
+      staffcontract.tbl.setData(data.sqldata);
+    }
   },
   add: function(){
     cleanform2("staffcontract",staffcontract.choices);
     module.viewdialog(staffcontract.name);
+    document.getElementById("id_staff").value=staff.current_id;
     //module.viewdialog(users.name,null);
     //document.getElementById("company").addEventListener('blur', function(event){users.checkschema(event,this.id);},true);
     //module.viewpanel('frm_' + users.name);
@@ -124,14 +132,16 @@ var staffcontract = {
     var udata = staffcontract.tbl.getSelectedData();
     if (udata[0]) {
       var uid = udata[0].id;
-      showdeletedlg(staffcontract.name,uid,"Êtes vous sûre de supprimer les données sélectionnées?",staffcontract.afterdeletecallback);
+      showdeletedlg(staffcontract.name,uid,"Êtes vous sûre de supprimer les données sélectionnées?",staffcontract.afterdeletecallback,schemata);
       //module.viewpanel('tbl_' + users.name);
     }
   },
-  saveform: function(){
+  save: function(){
     var flds=getformcontent('staffcontract',null);
     flds["fn"] ="saveform";
     flds["schemata"]=schemata;
+    flds["id_staff"]=staff.current_id;
+    flds["ident"] ="id";
     flds["ident_staffcontract_id"] = flds["ident_staffcontract_id_staffcontract"];
     delete flds["ident_staffcontract_id_staffcontract"];
     console.log(flds);
index 760b22a..8031e5c 100644 (file)
     <div class="w3-container">
     <div id="usermsg" ></div>
     <form id="frm_users">
+      [% ro = 'readonly' %]
+      [% IF session.usergroup == 'admin' %]
+      [% ro = '' %]
+      [% END %]
          [% fieldhidden('id','users','ident') %]
          [% fieldeditbox("username","users","Login / E-Mail",'w3-twothird','','') %]
-         [% fieldcheckbox("blocked","users","compte blocké",'w3-third','','1') %]
+         
+         [% fieldcheckbox("blocked","users","compte blocké",'w3-third',ro,'1') %]
+         
           [% fieldeditbox('surname','users','Nom','w3-half','') %]
           [% fieldeditbox('prename','users','Prénom','w3-half','') %]
           [% fieldeditbox('job','users','Position','w3-half','') %]
           [% fieldeditbox('phone','users','Téléphone','w3-half','') %]
-          [% fieldselectbox('id_company','users','Entreprise','','','','') %]
-          [% fieldmultiselectbox("id_usergroups","users","Accès Groupes",'','','') %]
-          [% fieldmultiselectbox("schemaaccess","users","Accès Schemata",'','','') %]
+          
+          [% fieldselectbox('id_company','users','Entreprise','',ro,'','') %]
+          [% fieldselectbox("id_usergroup","users","Accès Groupe",'',ro,'') %]
+          [% fieldmultiselectbox("schemaaccess","users","Accès Entreprise",'',ro,'') %]
+         
       </form>
     </div>
     <footer class="w3-container w3-right-align w3-padding-16">
index fccdf0c..e921f35 100644 (file)
@@ -4,18 +4,18 @@ var users ={
   tbl: null,
   current_user: "[% session.id %]",
   name: "users",
-  choices:{"id_company":null,"id_usergroups":null,"schemaaccess":null},
+  choices:{"schemaaccess":null},//"id_company":null,"id_usergroup":null,
   initform: function(){
     users.choices["id_company"] = new Choices('#id_company',{
       searchEnabled: false,
       itemSelectText: '',
-      removeItemButton: true,
+      removeItemButton: false,
       choices : []
     });
-    users.choices["id_usergroups"] = new Choices('#id_usergroups',{
+    users.choices["id_usergroup"] = new Choices('#id_usergroup',{
       searchEnabled: false,
       itemSelectText: '',
-      removeItemButton: true,
+      removeItemButton: false,
       choices : []
     });
     users.choices["schemaaccess"] = new Choices('#schemaaccess',{
@@ -44,7 +44,7 @@ var users ={
     {title:"Entreprise", field:"company",headerFilter:"input"},  
     {title:"Nom", field:"surname",headerFilter:"input"},
     {title:"Prénom", field:"prename",headerFilter:"input"},
-    {title:"Accès",field:"usergroups",headerFilter:"input"},
+    {title:"Accès",field:"groupname",headerFilter:"input"},
     {title:"Position",field:"job"},
     {title:"Téléphone",field:"phone"},
     {title:"E-mail",field:"username"},
@@ -54,7 +54,12 @@ var users ={
     users.gettbldata();
   },
   gettbldata: function(){
-    req.reqdata("POST", "db.cgi", { "get":  users.name + "list","schemata":schemata}, users.loadtbldata);
+    console.log("[% session.usergroup %]");
+    [% IF session.usergroup == 'admin' %]
+      req.reqdata("POST", "db.cgi", { "get":  users.name + "list","schemata":schemata}, users.loadtbldata);
+    [% ELSE %]
+      req.reqdata("POST", "db.cgi", { "get":  users.name + "list","schemata":schemata,"filter":"id_company=(select id from "+ schemata+".users where id=[% session.id %])"}, users.loadtbldata);
+    [% END %]
   },
   loadtbldata: function(data){
     if (data && data.sqldata) { users.tbl.setData(data.sqldata);}
@@ -77,7 +82,7 @@ var users ={
     }
   },
   fillform: function(data){
-    //console.log("Fill Form 1");
+    console.log(data);
     if (data && data.sqldata){
       //console.log("Fill Form 2");
       fillformbydataclass2(users.name,users.choices,data.sqldata[0]);
@@ -87,7 +92,7 @@ var users ={
     var udata = users.tbl.getSelectedData();
     if (udata[0]) {
       var uid = udata[0].id;
-      showdeletedlg("users",uid,"Êtes vous sûre de supprimer l'utilisateur sélectionnée?",users.afterdeletecallback);
+      showdeletedlg("users",uid,"Êtes vous sûre de supprimer l'utilisateur sélectionnée?",users.afterdeletecallback,schemata);
       //module.viewpanel('tbl_' + users.name);
     }
   },
@@ -98,16 +103,16 @@ var users ={
       document.getElementById("usermsg").innerHTML= '<div class="panel w3-red">Entreprise ne doit pas être vide!</div>';
       return false;
     }
-    var usergroups =  document.getElementById("id_usergroups").selectedOptions;
+    var usergroups =  document.getElementById("id_usergroup").selectedOptions;
     console.log(usergroups);
     if (usergroups.length == 0){
-      document.getElementById("usermsg").innerHTML= '<div class="panel w3-red">Accès groupe ne doit pas être vide!</div>';
+      document.getElementById("usermsg").innerHTML= '<div class="panel w3-red">Accès Groupe ne doit pas être vide!</div>';
       return false;
     }
     var schemaaccess =  document.getElementById("schemaaccess").selectedOptions;
     console.log(schemaaccess);
     if (schemaaccess.length == 0){
-      document.getElementById("usermsg").innerHTML= '<div class="panel w3-red">Accès schemata ne doit pas être vide!</div>';
+      document.getElementById("usermsg").innerHTML= '<div class="panel w3-red">Accès Entreprise ne doit pas être vide!</div>';
       return false;
     }
     users.checkemail();
@@ -139,19 +144,21 @@ var users ={
     req.reqdata("POST","db.cgi",{"get":"companieslist","schemata":schemata},users.fillcompanies);
   },
   fillcompanies: function(data){
+    console.log("fill companies");
+    console.log(data.sqldata);
     fillselectlist(users.choices["id_company"],data.sqldata,'id','company');
   },
   getusergroups: function(){
     req.reqdata("POST","db.cgi",{"get":"usergroupslist","schemata":schemata},users.fillusergroups);
   },
   fillusergroups: function(data){
-    fillselectlist(users.choices["id_usergroups"],data.sqldata,'id','groupname');
+    fillselectlist(users.choices["id_usergroup"],data.sqldata,'id','groupname');
   },
   getschemata: function(){
     req.reqdata("POST","db.cgi",{"get":"schemata","schemata":schemata},users.fillschemata);
   },
   fillschemata: function(data){
-    fillselectlist(users.choices["schemaaccess"],data.sqldata,'schemaname','schemaname');
+    fillselectlist(users.choices["schemaaccess"],data.sqldata,'schemaname','company');
   },
   checkemail: function(){
     var usernamex = document.getElementsByName("users_username");
@@ -177,7 +184,7 @@ var users ={
     if (data && data.sqldata.length > 0){
       document.getElementById("usermsg").innerHTML= '<div class="panel w3-red">Il existe déjà uncompte avec cette addresse E-Mail!</div>';
     } else {
-      users.savedata();
+      users.save();
     }
     return false;
   },
@@ -185,7 +192,7 @@ var users ={
           var re = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
           return re.test(String(email).toLowerCase());
   },
-  savedata: function(){
+  save: function(){
       saveform("users",users.userformsaved);
   },
   userformsaved: function (data){
index 28a3481..abc8abd 100644 (file)
 var schemata = null;
-var tbl_workplan = null;
+//var tbl_workplan = null;
 
 
 function initpage(){
   schemata = parent.admin.getcurrentSchemata();
   console.log("Current Schema:" + schemata);
-  inittable_workplan();
-
-  flatpickr(".timefield",{
-    //altInput: true,
-    //altFormat: "H:i",
-    dateFormat: "H:i",
-    //allowInput: true,
-    enableTime: true,
-    noCalendar: true,
-    time_24hr: true,
-    defaultHour: "0",
-    defaultMinute: "0",
-    "locale": "fr",
-    
-  });
+  workplans.inittable();
   
 }
 
-function inittable_workplan(){
-  tbl_workplan = new Tabulator("#tbl_workplans", {
-    headerFilterPlaceholder: "filter...",
-    height: "94vh",
-    layout: "fitDataFill",
-    selectable: 1,
-    rowContext:function(e, row){
-      //e - the click event object
-      //row - row component
-      //var contextMenu = CtxMenu();
-      //contextMenu.addItem("Editer", edit());
-    // Add our custom function to the menu
-       //contextMenu.addItem("Hello World", ContextMenuExampleFunction);
-
-       // Add a seperator
-       //contextMenu.addSeperator();
-      e.preventDefault(); // prevent the browsers default context menu form appearing.
-      },
-    columns: [{title: "Nom", field: "workplan",headerFilter: "input"}, 
-    { title: "Total<br/>Semaine",field: "weektotal",formatter: "html" },
-    { title: "Lundi",field: "dspmontimes",formatter: "html" },
-    { title: "Mardi",field: "dsptuetimes",formatter: "html" },
-    { title: "Mercredi",field: "dspwedtimes",formatter: "html" },
-    { title: "Jeudi",field: "dspthutimes",formatter: "html" },
-    { title: "Vendredi",field: "dspfritimes",formatter: "html" },
-    { title: "Samedi",field: "dspsattimes",formatter: "html" }, 
-    { title: "Dimanche",field: "dspsuntimes",formatter: "html" }   
-    ]
-});
-gettbldata_workplan();
-}
-
-
-
-function gettbldata_workplan() {
-  req.reqdata("POST", "db.cgi", {
-      "get":  "workplans","schemata":schemata
-  }, loadtbldata_workplan);
-
-}
-
-function loadtbldata_workplan(data) {
-
-  if (data && data.sqldata) {
-      tbl_workplan.setData(data.sqldata);
-  }
-}
-
-function edit() {
-  var udata = tbl_workplan.getSelectedData();
-  if (udata[0]) {
-      var uid = udata[0].id;
-      getworkplandata(uid);
-      document.getElementById("pnl_table").style.display = 'none';
-      document.getElementById("pnl_workplan").style.display = 'block';
-  }
-
-}
-
-function add() {
-  cleanform('worplan');
-  viewform();
-}
-
-function remove() {
-  var udata = tbl_workplan.getSelectedData();
-  if (udata[0]) {
-    showdeletedlg("workplans",udata[0].id,null,gettbldata_workplan);
-  }
-}
-
-
-function viewtable() {
-  gettbldata_workplan();
-  document.getElementById("pnl_table").style.display = 'block';
-  document.getElementById("pnl_workplan").style.display = 'none';
-}
-
-function viewform(){
-    document.getElementById("pnl_table").style.display = 'none';
-    document.getElementById("pnl_workplan").style.display = 'block';
-}
-
-function getworkplandata(id){
-  cleanform('worplan');
-  req.reqdata("POST", "db.cgi", {
-    "get":  "workplansdata","schemata":schemata
-}, loadworkplandata);
+// function inittable_workplan(){
+//   tbl_workplan = new Tabulator("#tbl_workplans", {
+//     headerFilterPlaceholder: "filter...",
+//     height: "94vh",
+//     layout: "fitDataFill",
+//     selectable: 1,
+//     rowContext:function(e, row){
+//       //e - the click event object
+//       //row - row component
+//       //var contextMenu = CtxMenu();
+//       //contextMenu.addItem("Editer", edit());
+//     // Add our custom function to the menu
+//     //contextMenu.addItem("Hello World", ContextMenuExampleFunction);
+
+//     // Add a seperator
+//     //contextMenu.addSeperator();
+//       e.preventDefault(); // prevent the browsers default context menu form appearing.
+//       },
+//     columns: [{title: "Nom", field: "workplan",headerFilter: "input"}, 
+//     { title: "Total<br/>Semaine",field: "weektotal",formatter: "html" },
+//     { title: "Lundi",field: "dspmontimes",formatter: "html" },
+//     { title: "Mardi",field: "dsptuetimes",formatter: "html" },
+//     { title: "Mercredi",field: "dspwedtimes",formatter: "html" },
+//     { title: "Jeudi",field: "dspthutimes",formatter: "html" },
+//     { title: "Vendredi",field: "dspfritimes",formatter: "html" },
+//     { title: "Samedi",field: "dspsattimes",formatter: "html" }, 
+//     { title: "Dimanche",field: "dspsuntimes",formatter: "html" }   
+//     ]
+// });
+// gettbldata_workplan();
+// }
+
+
+
+// function gettbldata_workplan() {
+//   req.reqdata("POST", "db.cgi", {
+//       "get":  "workplans","schemata":schemata
+//   }, loadtbldata_workplan);
+
+// }
+
+// function loadtbldata_workplan(data) {
+
+//   if (data && data.sqldata) {
+//       tbl_workplan.setData(data.sqldata);
+//   }
+// }
+
+// function edit() {
+//   var udata = tbl_workplan.getSelectedData();
+//   if (udata[0]) {
+//       var uid = udata[0].id;
+//       getworkplandata(uid);
+//       document.getElementById("pnl_table").style.display = 'none';
+//       document.getElementById("pnl_workplan").style.display = 'block';
+//   }
+
+// }
+
+// function add() {
+//   cleanform('worplan');
+//   viewform();
+// }
+
+// function remove() {
+//   var udata = tbl_workplan.getSelectedData();
+//   if (udata[0]) {
+//     showdeletedlg("workplans",udata[0].id,null,gettbldata_workplan,schemata);
+//   }
+// }
+
+
+// function viewtable() {
+//   gettbldata_workplan();
+//   document.getElementById("pnl_table").style.display = 'block';
+//   document.getElementById("pnl_workplan").style.display = 'none';
+// }
+
+// function viewform(){
+//     document.getElementById("pnl_table").style.display = 'none';
+//     document.getElementById("pnl_workplan").style.display = 'block';
+// }
+
+// function getworkplandata(id){
+//   cleanform('worplan');
+//   req.reqdata("POST", "db.cgi", {
+//     "get":  "workplansdata","schemata":schemata
+// }, loadworkplandata);
   
-}
-
-function loadworkplandata(data){
-  if (data && data.sqldata) {
-    console.log("fill Data");
-    console.log(data.sqldata[0]);
-    fillformbydataclass("workplans",data.sqldata[0],false);
-  }
-  viewform();
-}
+// }
+
+// function loadworkplandata(data){
+//   if (data && data.sqldata) {
+//     console.log("fill Data");
+//     console.log(data.sqldata[0]);
+//     fillformbydataclass2("workplans",data.sqldata[0],false);
+//   }
+//   viewform();
+// }
 
 
index 13ccfc9..e5913f7 100644 (file)
@@ -6,21 +6,23 @@
 <div class="w3-display-container">
   <div class="w3-top w3-theme-light w3-border-bottom">
     <div class="w3-bar">
-      <button class="w3-bar-item w3-button w3-border  w3-blue-grey w3-hover-text-white" onclick="viewtable();">Plans de travail</button>
-    <!--<button class="w3-bar-item w3-button w3-border  w3-right w3-orange" onclick="xlsxexport(); return false;"><img src="[% abspath%]img/icons/excel_white.svg" style="height: 24px;"/></button>
-    <button class="w3-bar-item w3-button w3-border  w3-right w3-orange" onclick="pdfexport(); return false;"><img src="[% abspath%]img/icons/pdf_white.svg" style="height: 24px;"/></button>-->
-    
-    <button class="w3-bar-item w3-button w3-border  w3-right w3-red" onclick="remove();"><img src="[% abspath%]img/icons/remove_white.svg" style="height: 24px;"/></button>
-    <button class="w3-bar-item w3-button w3-border  w3-right w3-blue-grey" onclick="edit();"><img src="[% abspath%]img/icons/edit_white.svg" style="height: 24px;"/></button>
-    <button class="w3-bar-item w3-button w3-border  w3-right w3-blue-grey" onclick="add();"><img src="[% abspath%]img/icons/plus_white.svg" style="height: 24px;"/></button> 
+      <button class="w3-bar-item w3-button w3-border  w3-blue-grey w3-hover-text-white" onclick="module.viewpanel('tbl_workplans');">Plans de travail</button>
+      <div class="toolbar" id="tbar_tbl_workplans">
+    <button class="w3-bar-item w3-button w3-border  w3-right w3-red" onclick="worplans.remove();"><img src="[% abspath%]img/icons/remove_white.svg" style="height: 24px;"/></button>
+    <button class="w3-bar-item w3-button w3-border  w3-right w3-blue-grey" onclick="workplans.edit();"><img src="[% abspath%]img/icons/edit_white.svg" style="height: 24px;"/></button>
+    <button class="w3-bar-item w3-button w3-border  w3-right w3-blue-grey" onclick="workplans.add();"><img src="[% abspath%]img/icons/plus_white.svg" style="height: 24px;"/></button> 
+    </div>
+    <div class="toolbar" id="tbar_frm_workplans" style="display: none;">
+
     </div>
   </div>
-  <div class="w3-display-container" id="pnl_table" style="margin-top: 45px;">
+  </div>
+  <div class="w3-display-container panel" id="pnl_tbl_workplans" style="margin-top: 45px;">
     <div id="tbl_workplans"></div>
   </div>
-  <div class="w3-display-container w3-padding-24" id="pnl_workplan" style=" margin-top: 20px;display: none;" >
+  <div class="w3-display-container w3-padding-24 panel" id="pnl_frm_workplans" style="display: none;" >
     <div class="w3-container  w3-padding-24 w3-card  w3-margin w3-margin-bottom">
-      <form id="frm_workplan">
+      <form id="frm_workplans">
         <h3>Plan de travail<small>(modèle)</small></h3>
         <div class="w3-row-padding"> 
           <div class="w3-container">
               [% fieldtimebox("${wday}_timestart2",'workplans','début 2','w3-fifth','','') %]
               [% fieldtimebox("${wday}_timeend2",'workplans','fin 2','w3-fifth','','') %]
               [% fieldtimebox("${wday}_timepause",'workplans','pause','w3-fifth','','') %]
-              [% fieldtimebox("${wday}_interruption",'display','coupure','w3-fifth','readonly','') %]
-              [% fieldtimebox("${wday}_total",'display','total','w3-fifth','readonly','') %]
+              [% fieldtimebox("${wday}_interruption",'workplans','coupure','w3-fifth','readonly','') %]
+              [% fieldtimebox("${wday}_total",'workplans','total','w3-fifth','readonly','') %]
             </div>
             [% END %]
         </div>
         
-            [% formsavebutton('workplan','sauvegarder') %]
-            </div>
+            <div class="w3-container w3-right-align">
+                        <button class="w3-button w3-blue-grey w3-margin" id="btnsave_fworkplan" onclick="workplans.save();return false;">sauvegarder</button>
+                    </div>
         </form>
     </div>
     
@@ -54,3 +57,4 @@
   
 </div>
 [% INCLUDE block/dlgdeleterow.tt %]
+<script src="workplans.js"></script>
diff --git a/backoffice/tmpl/module/workplans/workplans.js b/backoffice/tmpl/module/workplans/workplans.js
new file mode 100644 (file)
index 0000000..78ea434
--- /dev/null
@@ -0,0 +1,130 @@
+var workplans ={
+  name:"workplans",
+  choices:{},
+  tbl: null,
+  initform: function(){
+    flatpickr(".timefield",{
+      dateFormat: "H:i",
+      enableTime: true,
+      noCalendar: true,
+      time_24hr: true,
+      defaultHour: "0",
+      defaultMinute: "0",
+      "locale": "fr",
+    });
+    var tfields = document.getElementsByClassName("timefield");
+    for (var i=0;i<tfields.length;i++){
+      tfields[i].addEventListener("change",function(){workplans.checktime(this.id);});
+    }
+  },
+  inittable: function(){
+    workplans.tbl = new Tabulator("#tbl_" + workplans.name, {
+      headerFilterPlaceholder: "filter...",
+      height: "94vh",
+      layout: "fitDataFill",
+      selectable: 1,
+      rowContext:function(e, row){e.preventDefault(); },
+      columns: [{title: "Nom", field: "workplan",headerFilter: "input"}, 
+      { title: "Total<br/>Semaine",field: "weektotal",formatter: "html" },
+      { title: "Lundi",field: "dspmontimes",formatter: "html" },
+      { title: "Mardi",field: "dsptuetimes",formatter: "html" },
+      { title: "Mercredi",field: "dspwedtimes",formatter: "html" },
+      { title: "Jeudi",field: "dspthutimes",formatter: "html" },
+      { title: "Vendredi",field: "dspfritimes",formatter: "html" },
+      { title: "Samedi",field: "dspsattimes",formatter: "html" }, 
+      { title: "Dimanche",field: "dspsuntimes",formatter: "html" }   
+      ]
+  });
+   workplans.gettbldata();
+   workplans.initform();
+  },
+  gettbldata: function(){
+    req.reqdata("POST", "db.cgi", {"get": workplans.name ,"schemata":schemata}, workplans.loadtbldata);
+  },
+  loadtbldata: function(data){
+    if (data && data.sqldata) {
+      workplans.tbl.setData(data.sqldata);
+    }
+  },
+  edit: function() {
+    cleanform(workplans.name);
+    var udata = workplans.tbl.getSelectedData();
+    if (udata[0]) {
+        var uid = udata[0].id;
+        req.reqdata("POST", "db.cgi", {
+          "get": workplans.name +"data","filter":"id=" + uid,"schemata":schemata
+      }, workplans.fillform);
+        module.viewpanel("frm_" +  workplans.name);
+    }
+  
+  },
+  add: function() {
+    cleanform('workplans');
+    module.viewpanel('frm_' + workplans.name);
+  },
+  remove: function() {
+    var udata = workplans.tbl.getSelectedData();
+    if (udata[0]) {
+      showdeletedlg(workplans.name,udata[0].id,null,gettbldata_workplan,schemata);
+    }
+  },
+  fillform: function(data){
+    if (data && data.sqldata) {
+      console.log("fill Data");
+      console.log(data.sqldata[0]);
+      fillformbydataclass2(workplans.name,{},data.sqldata[0]);
+    }
+  },
+  save: function(){
+    var wpdata = getformcontent(workplans.name);
+    var wpdatanew = {};
+    for (var w in wpdata){
+      if ((!w.endsWith("total")) && (!w.endsWith("interruption"))){
+        wpdatanew[w] = wpdata[w];
+      }
+    }
+    saveformdata(wpdatanew,null,schemata);
+    return false;
+  },
+  checktime: function(id){
+    
+    var pp = id.split("_");
+
+    var wday=pp[0];
+    var strappend='';
+    if (pp.length > 2){
+      strappend = "_" + pp[2];
+    }
+    console.log("timefield: " + wday +"=>" + id + " changed " + strappend);
+    var mt1 = 0;
+    var mt2 = 0;
+    var mtp = 0;
+    var irupt = 0;
+    if ((document.getElementById(wday + "_timeend1" + strappend).value != "") && (document.getElementById(wday + "_timestart1" + strappend).value != "")){
+      mt1 = timecalc.TimeToMinutes(document.getElementById(wday + "_timeend1" + strappend).value)-timecalc.TimeToMinutes(document.getElementById(wday + "_timestart1" + strappend).value);
+    }
+    if ((document.getElementById(wday + "_timeend2" + strappend).value != "") && (document.getElementById(wday + "_timestart2" + strappend).value != "")){
+      mt2 = timecalc.TimeToMinutes(document.getElementById(wday + "_timeend2" + strappend).value)-timecalc.TimeToMinutes(document.getElementById(wday + "_timestart2" + strappend).value);
+    }
+    if (document.getElementById(wday + "_timepause" + strappend).value != ""){
+      mtp = timecalc.TimeToMinutes(document.getElementById(wday + "_timepause" + strappend).value);
+    }
+    if ((document.getElementById(wday + "_timeend1" + strappend).value != "") && (document.getElementById(wday + "_timestart2" + strappend).value != "")){
+      irupt = timecalc.TimeToMinutes(document.getElementById(wday + "_timestart2" + strappend).value)-timecalc.TimeToMinutes(document.getElementById(wday + "_timeend1" + strappend).value);
+      document.getElementById(wday + "_interruption" + strappend).value= timecalc.MinutesToTime(irupt);
+    }else {
+      document.getElementById(wday + "_interruption" + strappend).value="";
+    }
+    document.getElementById(wday + "_total" + strappend).value= timecalc.MinutesToTime(mt1+mt2-mtp);
+    var totaltester = /\d+:\d\d/;
+    var valcheck= document.getElementById(wday + "_total" + strappend).value;
+    if (valcheck && valcheck != ''){
+      if ((valcheck == '00:00') || (!totaltester.test(valcheck))) {
+        document.getElementById(wday + "_total" + strappend).value ="";
+      }
+    }
+     
+    
+  },
+  
+}
\ No newline at end of file
index b303c76..4de108e 100644 (file)
@@ -1,15 +1,12 @@
 [% PROCESS macro/fields.tt %]
 [% USE dksdb = DBI(dsn, dbuser, dbpassword) %] 
-[% appgaccess = dksdb.prepare("select ap.icon,ap.app,ap.name,ug.usergroup 
+[% appgaccess = dksdb.prepare("select ap.icon,ap.app,ap.name,string_agg(ug.usergroup,',') as usergroup
 from (SELECT users.id,json_array_elements_text(users.id_usergroups)::INT4 AS id_usergroup FROM users) uig 
-join apps ap on (uig.id_usergroup=ap.id_usergroup) 
-join usergroups ug on (uig.id_usergroup=ug.id) where uig.id=? 
-order by ap.sort;") %]
-[% appsaccess = dksdb.prepare("select ap.icon,ap.app,ap.name,ug.usergroup 
-from (SELECT users.id,json_array_elements_text(users.id_usergroups)::INT4 AS id_usergroup FROM users) uig 
-join apps ap on (uig.id_usergroup=ap.id_usergroup) 
-join usergroups ug on (uig.id_usergroup=ug.id) where uig.id=? and ap.menutype = 'schema'
+join (SELECT apps.id,apps.icon,apps.app,apps.name,apps.sort,json_array_elements_text(apps.id_usergroups)::INT4 as id_usergroup FROM apps) ap on (uig.id_usergroup=ap.id_usergroup) 
+join usergroups ug on (uig.id_usergroup=ug.id) where uig.id=?
+group by ap.id,ap.icon,ap.name,ap.app,ap.sort
 order by ap.sort;") %]
+
 <!DOCTYPE html>
 <html lang="en">
 <head>