# }
if ($p->{fn} eq "saveform"){
- # $html->{p} = $p;
+ $html->{p} = $p;
$html->{result}->{ident} = $p->{ident};
delete $p->{ident};
delete $p->{fn};
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};
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);
#}
}
- $html->{result}->{id} = $retid->{0};
+ $html->{result} = $retid->{0};
#$p->{table},#$p->{field},$p->{value},$p->{id},$p->{type}
}
if($p->{fn} eq "deleterow"){
}
}
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);
}
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',
--- /dev/null
+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
--- /dev/null
+#!/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
--- /dev/null
+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
--- /dev/null
+<!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
--- /dev/null
+<!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>
--- /dev/null
+[% 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
--- /dev/null
+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
--- /dev/null
+<!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
--- /dev/null
+<!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>
--- /dev/null
+[% 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
--- /dev/null
+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
--- /dev/null
+<!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
--- /dev/null
+<!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>
--- /dev/null
+[% 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
#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>";
# }
\r
choice["company"]["schemata"] = new Choices('#schemata',{\r
searchEnabled: false,\r
- itemSelectText: 'x',\r
+ itemSelectText: '',\r
removeItemButton: false,\r
choices : []\r
});\r
\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
-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){
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";
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];
//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 {
</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;
//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);
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>');
//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);
[% 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>
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
-[% 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">
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>
[% 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">
var reportperiod ={
tbl: null,
name: "reportperiod",
+ choices:{"id_staffgroup":null},
initform: function(){
flatpickr("#startdate",{altInput: true,
altFormat: "d.m.Y",
],
"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, {
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:""} },
+
]
});
//
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=" 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=" 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);
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
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},
module.viewpanel('tbl_' + staffworkplan.name);
}
},
- saveform_edit: function(){
+ save_edit: function(){
var datamsg = "";
var wpdata = getformcontent(staffworkplan.name+ "_edit");
if (!wpdata["staffworkplan_id_staff"]){
//closedataloaddlg();
return false;
},
- saveform: function(){
+ save: function(){
var datamsg = "";
var wpdata = getformcontent(staffworkplan.name+ "_add");
if (!wpdata["staffworkplan_id_staff_add"]){
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")
//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");
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");
<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>
<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" >
</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>
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();
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);
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;
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;
}
}
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(){
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);
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);
<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">
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',{
{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"},
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);}
}
},
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]);
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);
}
},
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();
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");
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;
},
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){
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();
+// }
<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>
</div>
[% INCLUDE block/dlgdeleterow.tt %]
+<script src="workplans.js"></script>
--- /dev/null
+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
[% 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>