From: Kilian Saffran Date: Tue, 12 Jan 2021 07:36:29 +0000 (+0100) Subject: v20210112 X-Git-Tag: 1.0.27~1 X-Git-Url: http://cloud.dks.lu/git/?a=commitdiff_plain;h=63ff24600ac290dd9fa3b8839c3bec5ec55eca7a;p=pot_lu.git v20210112 --- diff --git a/app/db.cgi b/app/db.cgi index dbc2b868..f277700d 100644 --- a/app/db.cgi +++ b/app/db.cgi @@ -217,6 +217,15 @@ if (($cgi->request_method() eq "GET") || ($cgi->request_method() eq "POST")){ #$mret = $eml->sendemail('user_forgotpasswd',$p->{email},$data); } $html->{result}->{data} = $data; + } elsif ($p->{fn} eq "genpwd"){ + my $newpwd = $se->randomstring(12); + $html->{result}->{data}->{password} = $newpwd; + } elsif ($p->{fn} eq "savenewpwd"){ + if (length($db->securetext($p->{pwd})) > 9){ + my $pwd = sha256_hex($db->securetext($p->{pwd})); + $db->exec("UPDATE public.users SET userpassword = '".$pwd."' WHERE id='".$db->securetext($p->{iduser})."';"); + } + $html->{result}->{data} = "OK"; } elsif (exists($p->{save})){ my $schema = "public"; @@ -342,7 +351,7 @@ if (($cgi->request_method() eq "GET") || ($cgi->request_method() eq "POST")){ if ($p->{fn} eq "del_worktimes"){ $html->{result} = $wk->deleteWorktime($schema,$db->securetext($p->{id})); } - } elsif ($p->{fn} =~ /del_user$|add_user$|useracceptedterms$|validatelogin$/) { + } elsif ($p->{fn} =~ /del_user$|add_user$|useracceptedterms$|validatelogin$|changelanguage$/) { # print STDERR $p->{fn}.": User\n"; my $us = POT::User->new({db => $db}); if ($p->{fn} eq "del_user"){ @@ -356,6 +365,9 @@ if (($cgi->request_method() eq "GET") || ($cgi->request_method() eq "POST")){ } elsif($p->{fn} eq "validatelogin"){ $html->{result} = $us->ValidateLogin($db->securetext($p->{username}),$sess->{id}); + } elsif($p->{fn} eq "changelanguage"){ + + $html->{result} = $us->ChangeLanguage($db->securetext($p->{lang}),$sess->{id}); } } elsif ($p->{fn} =~ /savetrackdatasets$/){ diff --git a/app/index.cgi b/app/index.cgi index d59828b2..472fa2a4 100644 --- a/app/index.cgi +++ b/app/index.cgi @@ -25,10 +25,10 @@ my $sess = (); my $se = session->new({db => $db}); $vars->{ua} = $ENV{HTTP_USER_AGENT}; -if ($vars->{ua} !~ /^POT/){ - print "Location: https://www.plandutravail.lu\n\n"; - exit(0); -} +if (($vars->{ua} !~ /^POT/) || ($vars->{ua} !~ /iPad/)){ + print "Location: https://www.plandutravail.lu\n\n"; + exit(0); + } $vars->{realpath} = $cgi->url({-absolute=>1}); $vars->{filepath} = substr($cgi->url({-absolute=>1}),length($vars->{basepath})+1); $vars->{baseurl} = $cgi->url({-base=>1}).'/'.$vars->{basepath}; @@ -48,6 +48,7 @@ $vars->{abspath} = ""; $p->{sid} = $cgi->cookie($vars->{cookiename}); +print STDERR "cookie: ".$vars->{cookiename}." : ".$p->{sid}."\n--\n"; if ($cgi->request_method() eq "GET"){ my @params = $cgi->param(); foreach my $pp (@params){ @@ -94,6 +95,7 @@ if (($cgi->request_method() eq "POST") || ($cgi->request_method() eq "GET")){ } if ($p->{sid} ne ""){ $sess = $se->getsession($p->{sid}); + print STDERR "after sessioncheck:".Dumper($sess); if ($sess == undef){ $p->{sid} = ""; $skl = "login.tt"; @@ -130,7 +132,10 @@ $vars->{pagename} = basename($vars->{page}); $vars->{pagename} =~ s/\.tt$//; $vars->{params}= $p; -$vars->{lang} = 'fr'; +if ($sess->{lang} eq ""){ + $sess->{lang} = "fr"; +} +$vars->{lang} = $sess->{lang}; $vars->{skl} = $skl; @@ -139,8 +144,8 @@ $vars->{remote_addr} = $ENV{REMOTE_ADDR}; my $template = Template->new({INCLUDE_PATH => [$sitecfg->{tmplpath}]}); $template->process($skl,$vars) || die "Template process failed: ", $template->error(), "\n"; $db->disconnect(); -# if ($vars->{page} =~ /\.tt/){ -# print '
'.Dumper($vars)."
";
-# } 
+if ($vars->{page} =~ /\.tt/){
+     print '
'.Dumper($vars)."
";
+ } 
 
 
diff --git a/app/lib/POT/User.pm b/app/lib/POT/User.pm
index 07ee0f2e..3a6662ed 100644
--- a/app/lib/POT/User.pm
+++ b/app/lib/POT/User.pm
@@ -102,4 +102,14 @@ sub ValidateLogin(){
   return $self->{db}->query($sql);
 }
 
+sub ChangeLanguage(){
+  my $self = shift;
+  my $lang = shift;
+  my $iduser = shift;
+  my $sql = "UPDATE public.users set lang='".$lang."' WHERE id='".$iduser."';";
+  $self->{db}->exec($sql);
+  return 1;
+
+}
+
 1;
\ No newline at end of file
diff --git a/app/lib/dksdb.pm b/app/lib/dksdb.pm
index 3ca21b22..0d40d53c 100644
--- a/app/lib/dksdb.pm
+++ b/app/lib/dksdb.pm
@@ -20,7 +20,7 @@ sub new {
     my $class = shift;
     my $p = shift;
     my $self = bless {}, $class;
-    $self->{debug} = 0;
+    $self->{debug} = 1;
     $self->{dbh} = DBI->connect($p->{dsn},$p->{dbuser},$p->{dbpassword},{PrintError=>1,RaiseError=>1,AutoCommit=>1})  or return "query Connection Error!".$!;
     return $self;
 }
diff --git a/app/lib/session.pm b/app/lib/session.pm
index f2587f33..74d63bb5 100644
--- a/app/lib/session.pm
+++ b/app/lib/session.pm
@@ -206,11 +206,12 @@ sub passwordforgotten(){
 sub getsession($){
   my $self = shift;
   my $sid = shift;
-  my $sql = "select se.id as idsession,us.id,us.username,ugrp.id as usergroup,us.id_staffgroups as staffgroups,se.sessiondata from sessions se 
+  my $sql = "select se.id as idsession,us.lang,us.id,us.username,ugrp.id as usergroup,us.id_staffgroups as staffgroups,se.sessiondata from sessions se 
 join users us on (us.id=se.id_user)
 left join usergroups ugrp on (ugrp.id=us.id_usergroup)
-where se.id= '".$self->{db}->securetext($sid)."' and se.remote_addr= '".$ENV{REMOTE_ADDR}."' and se.user_agent LIKE 'POT/%/%/%' and 
+where se.id= '".$self->{db}->securetext($sid)."' and se.remote_addr= '".$ENV{REMOTE_ADDR}."' and 
 us.isblocked is null group by se.id,us.id,ugrp.id;";
+ #and se.user_agent LIKE 'POT/%/%/%'
   my $res= $self->{db}->querysorted($sql);
   #print STDERR "AFTER  REQ:\n".$sql."\n";
   #print STDERR "SESSIONDATA: ".Dumper($res)."\n";
@@ -246,11 +247,26 @@ sub deletesession(){
 sub randomstring(){
 	my $self = shift;
   my $num = shift;
-	my @alphanumeric = ('a'..'z', 'A'..'Z', 0..9);
-	my $randstring = join '', map $alphanumeric[rand @alphanumeric], 0..$num;
+  my $randstring = $self->randstr($num);
+  #print STDERR "RandPWD:\n".$randstring."\n===\n";
+  my $cnt = 0;
+	while (($randstring !~ /[A-Z]+/) || ($randstring !~ /[a-z]+/) || ($randstring !~ /[0-9]+/)){
+    $randstring = $self->randstr($num);
+    $cnt++;
+    if ($cnt > 20){last;}
+    #print STDERR "RandPWD:\n".$randstring."\n===\n";
+  } 
  	return $randstring;
 }
 
+sub randstr(){
+  my $self = shift;
+  my $num = shift;
+  my @alphanumeric = ('a'..'z', 'A'..'Z', 0..9);
+	my $randstring = join '', map $alphanumeric[rand @alphanumeric], 0..$num;
+  return $randstring;
+}
+
 
 # sub deleteprofile(){
 #   my $self = shift;
diff --git a/app/static/css/fonts/appicons.eot b/app/static/css/fonts/appicons.eot
index 86f1eadc..87cbfb45 100644
Binary files a/app/static/css/fonts/appicons.eot and b/app/static/css/fonts/appicons.eot differ
diff --git a/app/static/css/fonts/appicons.svg b/app/static/css/fonts/appicons.svg
index a14e422f..74176805 100644
--- a/app/static/css/fonts/appicons.svg
+++ b/app/static/css/fonts/appicons.svg
@@ -67,6 +67,8 @@
 
 
 
+
+
 
 
 
diff --git a/app/static/css/fonts/appicons.ttf b/app/static/css/fonts/appicons.ttf
index 0ea5112b..24639cb6 100644
Binary files a/app/static/css/fonts/appicons.ttf and b/app/static/css/fonts/appicons.ttf differ
diff --git a/app/static/css/fonts/appicons.woff b/app/static/css/fonts/appicons.woff
index 499eabc5..011a32b1 100644
Binary files a/app/static/css/fonts/appicons.woff and b/app/static/css/fonts/appicons.woff differ
diff --git a/app/static/css/icons.css b/app/static/css/icons.css
index a774857e..feca1ebd 100644
--- a/app/static/css/icons.css
+++ b/app/static/css/icons.css
@@ -1,10 +1,10 @@
 @font-face {
   font-family: 'appicons';
-  src:  url('fonts/appicons.eot?6tri61');
-  src:  url('fonts/appicons.eot?6tri61#iefix') format('embedded-opentype'),
-    url('fonts/appicons.ttf?6tri61') format('truetype'),
-    url('fonts/appicons.woff?6tri61') format('woff'),
-    url('fonts/appicons.svg?6tri61#appicons') format('svg');
+  src:  url('fonts/appicons.eot?clkm3g');
+  src:  url('fonts/appicons.eot?clkm3g#iefix') format('embedded-opentype'),
+    url('fonts/appicons.ttf?clkm3g') format('truetype'),
+    url('fonts/appicons.woff?clkm3g') format('woff'),
+    url('fonts/appicons.svg?clkm3g#appicons') format('svg');
   font-weight: normal;
   font-style: normal;
   font-display: block;
@@ -25,6 +25,12 @@
   -moz-osx-font-smoothing: grayscale;
 }
 
+.icon-eye-close:before {
+  content: "\e93c";
+}
+.icon-eye-open:before {
+  content: "\e93d";
+}
 .icon-house:before {
   content: "\e900";
 }
diff --git a/app/static/css/theme.css b/app/static/css/theme.css
index 7d36c923..08ba9120 100644
--- a/app/static/css/theme.css
+++ b/app/static/css/theme.css
@@ -271,6 +271,13 @@ hr{border:0;border-top:1px solid #eee;margin:20px 0}
   background-color: #f89774;
 }
 
+.info-panel2 {
+  padding: 3px;
+  color: #000;
+  border: 1px solid #025788;
+  background-color: #a6dbfa;
+}
+
 .error-panel {
 	padding: 3px;
   color: #ff0000;
diff --git a/app/tmpl/block/dlg_newpassword.tt b/app/tmpl/block/dlg_newpassword.tt
new file mode 100644
index 00000000..38bfc3a1
--- /dev/null
+++ b/app/tmpl/block/dlg_newpassword.tt
@@ -0,0 +1,37 @@
+
\ No newline at end of file
diff --git a/app/tmpl/block/dlgperiodvalidation.tt b/app/tmpl/block/dlgperiodvalidation.tt
index fa89b7a5..c62bb0cc 100644
--- a/app/tmpl/block/dlgperiodvalidation.tt
+++ b/app/tmpl/block/dlgperiodvalidation.tt
@@ -65,8 +65,7 @@
             
-
+
diff --git a/app/tmpl/file.tt b/app/tmpl/file.tt index 9aa2d407..87c20f7e 100644 --- a/app/tmpl/file.tt +++ b/app/tmpl/file.tt @@ -1 +1,2 @@ +[% PROCESS "lang/${lang}.tt" %] [% INCLUDE $page %] diff --git a/app/tmpl/index.tt b/app/tmpl/index.tt index e360d188..cd18c851 100644 --- a/app/tmpl/index.tt +++ b/app/tmpl/index.tt @@ -1,4 +1,4 @@ -[% appversion='1.0.26' %] +[% appversion='1.0.28' %] [% minify = '' %] [% PROCESS "lang/${lang}.tt" %] diff --git a/app/tmpl/lang/de.tt b/app/tmpl/lang/de.tt index e69de29b..9e6ef99d 100644 --- a/app/tmpl/lang/de.tt +++ b/app/tmpl/lang/de.tt @@ -0,0 +1,188 @@ +[% lbl = { + "pot_long" => "Plan d'organisation du travail", + "weeklytemplates" => "Wochen-Vorlagen", + "template" => "Vorlagen", + "staff" => "Arbeitnehmer", + "sectorconfig" => "Konfiguration Sektor", + "sectorconfigpot" => "sektorielle Konfiguration POT", + "periodsconfig" => "Konfiguration Periode", + "sectorhoursconfig" => "sektorielle Stunden Konfiguration" , + "back" => "zurück", + "delete" => "löschen", + "duplicate" => "dupl.", + "add" => "neu", + "rename" => "umbenennen", + "edit" => "bearb.", + "copy" => "kopiern", + "paste" => "einfügen", + "basedata" => "Stammdaten", + "periods" => "Perioden", + "refperiods" => "Referenz-Perioden", + "pdf" => "PDF", + "finalstatement" => "SchlussAbrechnung", + "finalstatementpot" => "POT Schluss
Abrechnung", + "statement" => "Abrechnung", + "companyunit" => "Unternhemen / Standort", + "logout" => "Logout", + "modules" => "Module", + "staffcount" => "Arbeitnehmer Anz.", + "config" => "Konfiguration", + "company" => "Unternehmen", + "terms" => "AGB", + "administration" => "Administration", + "companies" => "Unternehmen", + "sectors" => "Sektoren", + "sector" => "Sektor", + "vacancydays" => "Feiertage", + "vacancytypes" => "Urlaubs-Bezeichnungen", + "vacancytype" => "Urlaubs-Bezeichnung", + "vacancy" => "Urlaub", + "recuperationtype" => "Art des Stunden-Ausgleichs", + "recuperation" => "Stunden-Ausgleich", + "hours" => "Stunden", + "infohours" => "Stunden-info", + "acceptterms" => "Ich habe die AGB gelesen und bin einverstanden", + "users" => "Benutzer", + "newpassword" => "neues Passwort", + "changelogin" => "Login ändern", + "editday" => "Tag bearbeiten", + "workhours" => "Arbeitsstunden", + "start" => "Anfang", + "startdate" => "Anfangs-Datum", + "enddate" => "End-Datum", + "end" => "Ende", + "total" => "Total", + "totalday" => "Total tag", + "pausehours" => "Pausen-Zeiten", + "totalpause" => "Total Pause", + "cancel" => "Abbrechen", + "save" => "Speichern", + "changetemplate" => "changer modèle", + "selecttemplate" => "Selection du modèle", + "commit" => "Validieren und Abschließen", + "pottemplate" => "POT (Vorlage)", + "name" => "Name", + "staffgroupname" => "Name der Abteilung", + "prename" => "Vorname", + "companytype" => "Rechtsform", + "companyunitname" => "Name der Firma / Geschäftsstelle", + "matricule" => "Matrikel-Nr.", + "birthdate" => "Geburtsdatum", + "job" => "Job / Position", + "department" => "Abteilung", + "departments" => "Abteilungen", + "departmentaccess" => "Abteilungen (Zugriff)", + "timetracker" => "Stechuhr", + "no" => "Nein", + "yes" => "Ja", + "address" => "Addresse", + "zip" => "PLZ", + "city" => "Ort", + "country" => "Land", + "phone" => "Telefon", + "email" => "E-Mail", + "contractdata" => "Vertrags-Daten", + "renewperiods" => "Perioden aktualisieren", + "weekhours" => "Stunden / Woche", + "weekhours_short" => "h/Woche", + "minmaxvalues" => "Min/max Werte", + "maxdayhours" => "max h/Tag", + "maxweekhours" => "max h/Woche", + "maxcutoff" => "max Unterbrechung", + "maxtotal" => "max Total", + "mindailyfreehours" => "min Stunden Ruhezeit", + "mindailyouttime" => "min Stunden Ruhezeit", + "mindailyouttime2" => "min Stunden
Ruhezeit", + "daytotal" => "Total Tag", + "weekdays" => "Tage / Woche", + "weekdays_short" => "t/Woche", + "addstaffmember" => "neuer Arbeitnehmer", + "timetracks" => "Zeitstempel", + "clean" => "leeren", + "cutoff" => "Unterbrechung", + "loginlink" => "EInlogggen", + "username" => "Login", + "password" => "Passwort", + "clientaccess" => "Kunden-Login", + "login" => "Einloggen", + "forgotpassword" => "Passwort vergessen", + "user" => "Benutzer", + "sendpassword" => "Passwort schicken", + "rcs" => "No. Handelsregister", + "vatnumber" => "Ust-Id International", + "dbschema" => "Datenbnak-Schema", + "duration" => "Dauer", + "unit" => "EInheit", + "payedpauses" => "bezahlte Pausen", + "pauses" => "Pausen", + "type" => "Typ", + "url" => "URL", + "lastsync" => "letzte Aktualisierung", + "accessblocked" => "Login blockieren", + "useraccess" => "Benutzer-Zugriff", + "datasetaccess" => "Datensatz-Zugriff", + "staffgroupaccess" => "Abteilungs-Zugriff", + "dataset" => "Datensatz", + "usernamechange" => "Login ändern", + "newusername" => "neuer Login", + "edittimetracks" => "Stechuhr bearbeiten", + "infoouttimes" => "Info Ruhezeiten davor/danach", + "freetimebefore" => "Ruhezeit davor", + "freetimeafter" => "Ruhezeit danach", + "statementbeforevalidation" => "Abrechnung vor Validierung", + "reopen" => "Freischalten", + "transferhours" => "zu übertragende Stunden", + "transferhours1_5" => "zu übertragende Stunden (x1,5)", + "weeklyavg" => "Wochen Durchschnitt", + "transferfreehours" => "zu übertragende Stunden
Stunden-Ausgleich", + "plushourstopayplus40" => "Überstunden
zu bezahlen mit +40%", + "hourstopayplus40" => "zu vergütenden Stunden (+40%)", + "hourstopayonly40" => "Überstunden
zu beahlen (40%)", + "ok" => "OK", + "waitmsg" => "Bitte warten!", + "close" => "Schließen", + "keepvacancy" => "Urlaubs-Einstellungen behalten", + "keeprecuperation" => "Stundenausgleich-Einstellungen behalten", + "replace" => "austauschen", + "qdeletecompany" => "ausgewählte Firma wirklich löschen?", + "ddeletestaffgroup" => "ausgewählte Abteilung wirklich löschen?", + "qdeleteuser" => "ausgewählte Benutzer wirklich löschen?", + "qdeletehours" => "ausgewählte Stunden wirklich löschen?", + "qdeletestaff" => "ausgewählte Arbeitnehmer wirklich löschen?", + "qdeletedata" => "ausgewählte Daten wirklich löschen?", + "qdeleteworkplan" => "ausgewählte Vorlage wirklich löschen?" + "allfieldsrequired" => "bitte alle Felder ausfüllen!", + "monday" => "Montag", + "tuesday" => "Dienstag", + "wednesday" => "Mittwoch", + "thursday" => "Donnerstag", + "friday" => "Freitag", + "saturday" => "Samstag", + "sunday" => "Sonntag", + "contract" => "Vertrag", + "work" => "Arbeit", + "contractrequired" => "Alle Felder sind erfordert (außer \"End-Datum\")!", + "recuperation_short" => "Ausgleich", + "vacancyill2" => "Krank", + "statementtransfered2" => "übertragene
Abrechnung", + "supphourspayed2" => "bezahlte
Überstunden", + "supp44h2" => "+Urlaub wg.
+44 h", + "suppsunwork" => "+Urlaub wg.
Sonntagsarbeit", + "avgweek_short" => "Wochen
Durchschnitt", + "validated" => "validiert", + "diffcontract" => "Unterschied
Vertrag", + "weekhours2" => "Arbeits-
Stunden", + "worktotal2" => "Total
Arbeit", + "standard" => "Standard", + "pausehours2" => "Pausen", + "totalpause2" => "Total
PAuse", + "day" => "Tag", + "description" => "Beschreibung", + "msgdel_stdhours" => "Die Standard-Vorlage kann nicht gelöscht werden!", + "newpassword" => "Neues Passwort", + "retypepwd" => "Neues Passwort wiederholen", + "pwdcondition" => "Passwörter müssen mindstens 10 Zeichen lang seien und mindestens 1 Grossbuchstabe, 1 Klein-Buchstabe und 1 Zahl enthalten", + "genpwd" => "Passwort vorschlagen", + "usergroup" => "Berechtigungen", + "language" => "Sprache" + } %] \ No newline at end of file diff --git a/app/tmpl/lang/fr.tt b/app/tmpl/lang/fr.tt index 33c5632f..c20d16b9 100644 --- a/app/tmpl/lang/fr.tt +++ b/app/tmpl/lang/fr.tt @@ -1,4 +1,4 @@ -[% lang = { +[% lbl = { "pot_long" => "Plan d'organisation du travail", "weeklytemplates" => "Modèles hebdomaires", "template" => "Modèle", @@ -92,6 +92,7 @@ "maxtotal" => "max total", "mindailyfreehours" => "min heures libre quotidienne", "mindailyouttime" => "min repos quotidien", + "mindailyouttime2" => "min h. libres
quotidienne", "daytotal" => "Totaux Jour", "weekdays" => "jours / semaine", "weekdays_short" => "j/semaine", @@ -176,4 +177,12 @@ "pausehours2" => "heures de
pause", "totalpause2" => "total
pause", "day" => "jour", + "description" => "description", + "msgdel_stdhours" => "Le heures Standard ne peuvent pas être supprimés!" + "newpassword" => "Nouveau mot de passe", + "retypepwd" => "répéter mot de passe", + "pwdcondition" => "les mots de passes doivent contenir au moins 10 lettres , au moins une lettre majuscule, une lettre minuscule et un nombre", + "genpwd" => "Passwort vorschlagen", + "usergroup" => "Droits d'accès", + "language" => "Langue" } %] \ No newline at end of file diff --git a/app/tmpl/login.tt b/app/tmpl/login.tt index c0df1dfc..f945090d 100644 --- a/app/tmpl/login.tt +++ b/app/tmpl/login.tt @@ -1,8 +1,9 @@ [% appversion = '0.9.9.6' %] [% minify = '' %] +[% PROCESS "lang/${lang}.tt" %] - + diff --git a/app/tmpl/module/admin.tt b/app/tmpl/module/admin.tt index b55537cd..c04b8eed 100644 --- a/app/tmpl/module/admin.tt +++ b/app/tmpl/module/admin.tt @@ -40,7 +40,7 @@ - +
@@ -52,10 +52,12 @@ [% INCLUDE module/admin/dlg_staffgroups.tt %] [% INCLUDE module/admin/dlg_worktimes.tt %] [% INCLUDE module/admin/dlg_users.tt %] +[% INCLUDE block/dlg_newpassword.tt %] [% INCLUDE block/dlgusername.tt %] - + + [% END %] diff --git a/app/tmpl/module/admin/companies.js b/app/tmpl/module/admin/companies.js index 4640be6f..7cebe79b 100644 --- a/app/tmpl/module/admin/companies.js +++ b/app/tmpl/module/admin/companies.js @@ -7,9 +7,10 @@ let periodtypes = [{"value":"","text":"pas défini"},{"value":"1-14","text":"1-1 function initpage(){ companies.inittable(); staffgroups.inittable(); - worktimes.inittable(); + //worktimes.inittable(); users.inittable(); schemadataset.initform(); + profile.reftbl = users.tbl; } let companies ={ @@ -92,7 +93,7 @@ let companies ={ postData("db.cgi",{ "get": "company", "schemata":udata[0].schemata}).then(data => { dataform.fillformbydataclass2("companies",companies.choices,data.result.data);}); staffgroups.gettbldata(); - worktimes.gettbldata(); + //worktimes.gettbldata(); users.gettbldata(); companies.setview(companies.current_view); } else { diff --git a/app/tmpl/module/admin/sectors.js b/app/tmpl/module/admin/sectors.js index b44fa18b..1e853713 100644 --- a/app/tmpl/module/admin/sectors.js +++ b/app/tmpl/module/admin/sectors.js @@ -20,18 +20,18 @@ let sector ={ selectable: 1, rowContext:function(e, row){ e.preventDefault(); }, columns: [ - { title: "secteur", field: "sector",headerFilter:"input",headerSort: true}, + { title: "[% lbl.sector %]", field: "sector",headerFilter:"input",headerSort: true}, { title: "[% lbl.staffcount %]", field: "periodtype",headerFilter:"input",headerSort: true}, { title: "[% lbl.start %]", field: "startdate",headerFilter:"input",headerSort: true,sorter:"date", sorterParams:{format:"YYYY-MM-DD",alignEmptyValues:"bottom"},formatter:"datetime",formatterParams:{inputFormat:"YYYY-MM-DD",outputFormat:"DD.MM.YYYY",invalidPlaceholder:""}}, { title: "[% lbl.end %]", field: "enddate",headerFilter:"input",headerSort: true,sorter:"date", sorterParams:{format:"YYYY-MM-DD",alignEmptyValues:"bottom"},formatter:"datetime",formatterParams:{inputFormat:"YYYY-MM-DD",outputFormat:"DD.MM.YYYY",invalidPlaceholder:""}}, - { title: "max heures/jour", field: "maxdayhours",headerSort: false,formatter:timeFormatter}, - { title: "H/Sem.", field: "defaultweekhours",headerSort: false,formatter:timeFormatter}, - { title: "max heures/semaine", field: "maxweekhours",headerSort: false,formatter:timeFormatter}, - { title: "max coupure", field: "maxinterruptionhours",headerSort: false,formatter:timeFormatter}, - { title: "min h. libres
quotidienne", field: "mindailyrecuperation",headerSort: false,formatter:timeFormatter}, + { title: "[% lbl.maxdayhours %]", field: "maxdayhours",headerSort: false,formatter:timeFormatter}, + { title: "[% lbl.weekhours_short %]", field: "defaultweekhours",headerSort: false,formatter:timeFormatter}, + { title: "[% lbl.maxweekhours %]", field: "maxweekhours",headerSort: false,formatter:timeFormatter}, + { title: "[% lbl.cutoff %]", field: "maxinterruptionhours",headerSort: false,formatter:timeFormatter}, + { title: "[% lbl.mindailyouttime2 %]", field: "mindailyrecuperation",headerSort: false,formatter:timeFormatter}, { title: "[% lbl.standard %]", field: "isdefault",headerSort: false,formatter:"tickCross",hozAlign:"center", formatterParams:{allowEmpty:true,allowTruthy:true,tickElement:''}}, - { title: "Description", field:"description" ,headerSort: false}, + { title: "[% lbl.description %]", field:"description" ,headerSort: false}, ] }); sector.gettbldata(); diff --git a/app/tmpl/module/admin/users.js b/app/tmpl/module/admin/users.js index e6518806..b4af9b3e 100644 --- a/app/tmpl/module/admin/users.js +++ b/app/tmpl/module/admin/users.js @@ -38,9 +38,10 @@ let users ={ columns:[ {title:"[% lbl.name %]", field:"surname"}, {title:"[% lbl.prename %]", field:"prename"}, - {title:"Login", field:"username"}, - {title:"Accès", field:"groupname"}, + {title:"[% lbl.username %]", field:"username"}, + {title:"[% lbl.usergroup %]", field:"groupname"}, {title:"[% lbl.departmentaccess %]",field:"staffgroups"}, + {title:"[% lbl.language %]",field:"language"}, {title:"Bloqué", field:"isblocked",formatter:"tickCross",hozAlign:"center", formatterParams:{allowEmpty:true,allowTruthy:true,tickElement:''}}, ], @@ -59,7 +60,7 @@ let users ={ add: function(){ document.getElementById("username").disabled = false; document.getElementById("username").classList.remove("readonly"); - users.tbl.selectRow(); + //users.tbl.selectRow(); let udata = users.tbl.getSelectedData(); if (udata[0]){ users.tbl.deselectRow(udata[0]["id"]); @@ -123,30 +124,6 @@ let users ={ users.checkemail(); return false; }, - confirmchangepassword: function(){ - /* @preserve [% IF session.usergroup == 'admin' %]*/ - let sel =users.tbl.getSelectedData(); - if (sel[0]){ - showinfodlg(">[% lbl.newpassword %]","Êtes vous sûre changer le [% lbl.password %]?",users.setnewpassword,{},"[% lbl.yes %]","[% lbl.no %]"); - } - /* @preserve [% END %]*/ - }, - setnewpassword: function(){ - /* @preserve [% IF session.usergroup == 'admin' %]*/ - let sel =users.tbl.getSelectedData(); - if (sel[0]){ - let fndata = {"fn":"setnewpassword","email":sel[0].username}; - postData("db.cgi",fndata).then(data => { - document.getElementById('dlg_users').style.display='none'; - if (data && data.result.data.password){ - showmessagedlg(">[% lbl.newpassword %]!",'
'); - }else { - showmessagedlg("Erreur!","Une erreur c'est produite pour l'envoie d'un >[% lbl.newpassword %]!"); - } - }); - } - /* @preserve [% END %]*/ - }, validatenewlogin: function(){ let newusername = document.getElementById("newuseremail").value; if (users.validateEmail(newusername)){ @@ -165,6 +142,7 @@ let users ={ document.getElementById("nunmsg").innerHTML= '
inserez un email valide s.v.p.!
'; } }, + dlgchangelogin: function(){ /* @preserve[% IF session.usergroup == 'admin' %]*/ let sel = users.tbl.getSelectedData(); @@ -243,10 +221,15 @@ let users ={ let udata = users.tbl.getSelectedData(); if (udata[0]){ flds["ident_users_id"] = udata[0]["id"]; + delete flds["users_id"]; + delete flds["null"]; + delete flds["ident_users_id_users"]; + } else { + flds["user_id"] = null; + delete flds["null"]; + delete flds["ident_users_id_users"]; } - delete flds["users_id"]; - delete flds["null"]; - delete flds["ident_users_id_users"]; + console.log("userdata",flds); postData("db.cgi",flds).then(data2 => { console.log("data returned",data2); diff --git a/app/tmpl/module/admin/worktimes.js b/app/tmpl/module/admin/worktimes.js index 58d51027..43b4ec5d 100644 --- a/app/tmpl/module/admin/worktimes.js +++ b/app/tmpl/module/admin/worktimes.js @@ -23,11 +23,11 @@ let worktimes = { columns: [ { title: "[% lbl.start %]", field: "startdate",headerSort: true,formatter:"datetime",formatterParams:{inputFormat:"YYYY-MM-DD",outputFormat:"DD.MM.YYYY",invalidPlaceholder:""}}, { title: "[% lbl.end %]", field: "enddate",headerSort: true,formatter:"datetime",formatterParams:{inputFormat:"YYYY-MM-DD",outputFormat:"DD.MM.YYYY",invalidPlaceholder:""}}, - { title: "max heures/jour", field: "maxdayhours",headerSort: false}, - { title: "H/Sem.", field: "defaultweekhours",headerSort: false}, - { title: "max heures/semaine", field: "maxweekhours",headerSort: false}, - { title: "max coupure", field: "maxinterruptionhours",headerSort: false}, - { title: "min h. libres
quotidienne", field: "mindailyrecuperation",headerSort: false}, + { title: "[% lbl.maxdayhours %]", field: "maxdayhours",headerSort: false}, + { title: "[% lbl.weekhours_short %]", field: "defaultweekhours",headerSort: false}, + { title: "[% lbl.maxweekhours %]", field: "maxweekhours",headerSort: false}, + { title: "[% lbl.maxcutoff %]", field: "maxinterruptionhours",headerSort: false}, + { title: "[% lbl.mindailyouttime2 %]", field: "mindailyrecuperation",headerSort: false}, { title: "[% lbl.standard %]", field: "isdefault",headerSort: false,formatter:"tickCross",hozAlign:"center", formatterParams:{allowEmpty:true,allowTruthy:true,tickElement:''}} ] @@ -65,7 +65,7 @@ let worktimes = { remove: function(){ let udata = worktimes.tbl.getSelectedData(); if (udata[0].isdefault){ - showmessagedlg("Info","Le heures Standard ne peuvent pas être supprimés!"); + showmessagedlg("Info","[% lbl.msgdel_stdhours %]"); return false; } if (udata[0]) { diff --git a/app/tmpl/module/company.tt b/app/tmpl/module/company.tt index 16c7f362..ee2bce88 100644 --- a/app/tmpl/module/company.tt +++ b/app/tmpl/module/company.tt @@ -14,7 +14,7 @@
[% lbl.users %]
[% IF session.usergroup != 'teamleader' %] - + [% END %]
@@ -25,7 +25,8 @@ [% #INCLUDE module/company/dlg_staffgroups.tt %] -[% #INCLUDE module/company/dlg_users.tt %] +[% INCLUDE block/dlg_newpassword.tt %] + diff --git a/app/tmpl/module/company/company.js b/app/tmpl/module/company/company.js index 9f17d1c7..0a087755 100644 --- a/app/tmpl/module/company/company.js +++ b/app/tmpl/module/company/company.js @@ -8,6 +8,7 @@ function initpage(){ staffgroups.inittable(); users.inittable(); company.edit(); + profile.reftbl = users.tbl; } let company = { diff --git a/app/tmpl/module/company/users.js b/app/tmpl/module/company/users.js index c1fd105b..bc212761 100644 --- a/app/tmpl/module/company/users.js +++ b/app/tmpl/module/company/users.js @@ -32,28 +32,28 @@ let users ={ users.tbl.setData(data.result.sqldata); }); }, - confirmchangepassword: function(){ - /* @preserve[% IF session.usergroup == 'admin' || session.usergroup == 'manager' %]*/ - let sel =users.tbl.getSelectedData(); - if (sel[0]){ - showinfodlg(">[% lbl.newpassword %]","Êtes vous sûre changer le [% lbl.password %]?",users.setnewpassword,{},"[% lbl.yes %]","[% lbl.no %]"); - } - /* @preserve[% END %]*/ - }, - setnewpassword: function(){ - /* @preserve[% IF session.usergroup == 'admin' || session.usergroup == 'manager' %]*/ - let sel =users.tbl.getSelectedData(); - if (sel[0]){ - let fndata = {"fn":"setnewpassword","email":sel[0].username}; - postData("db.cgi",fndata).then(data => { - document.getElementById('dlg_users').style.display='none'; - if (data && data.result.data.password){ - showmessagedlg(">[% lbl.newpassword %]!",'
'); - }else { - showmessagedlg("Erreur!","Une erreur c'est produite pour l'envoie d'un >[% lbl.newpassword %]!"); - } - }); - } - /* @preserve[% END %]*/ - } + // confirmchangepassword: function(){ + // /* @preserve[% IF session.usergroup == 'admin' || session.usergroup == 'manager' %]*/ + // let sel =users.tbl.getSelectedData(); + // if (sel[0]){ + // showinfodlg(">[% lbl.newpassword %]","Êtes vous sûre changer le [% lbl.password %]?",users.setnewpassword,{},"[% lbl.yes %]","[% lbl.no %]"); + // } + // /* @preserve[% END %]*/ + // }, + // setnewpassword: function(){ + // /* @preserve[% IF session.usergroup == 'admin' || session.usergroup == 'manager' %]*/ + // let sel =users.tbl.getSelectedData(); + // if (sel[0]){ + // let fndata = {"fn":"setnewpassword","email":sel[0].username}; + // postData("db.cgi",fndata).then(data => { + // document.getElementById('dlg_users').style.display='none'; + // if (data && data.result.data.password){ + // showmessagedlg(">[% lbl.newpassword %]!",'
'); + // }else { + // showmessagedlg("Erreur!","Une erreur c'est produite pour l'envoie d'un >[% lbl.newpassword %]!"); + // } + // }); + // } + // /* @preserve[% END %]*/ + // } } diff --git a/app/tmpl/module/index.tt b/app/tmpl/module/index.tt index 99b91354..14cf8975 100644 --- a/app/tmpl/module/index.tt +++ b/app/tmpl/module/index.tt @@ -5,10 +5,17 @@
[% lbl.pot_long %]
[% lbl.logout %]
- -
+ +
+ + +
@@ -20,17 +27,18 @@
-

[% lbl.configuration %]

+

[% lbl.config %]

[% IF (session.usergroup == 'admin') %] @@ -64,5 +72,6 @@ +[% INCLUDE block/dlg_newpassword.tt %] - + diff --git a/app/tmpl/module/index/index.js b/app/tmpl/module/index/index.js index 377aa393..f955aff9 100644 --- a/app/tmpl/module/index/index.js +++ b/app/tmpl/module/index/index.js @@ -6,7 +6,7 @@ function initpage(){ } let index = { - choices:{"current_schemata":null}, + choices:{"current_schemata":null,"current_lang":null}, initform: function(){ document.getElementById("current_schemata").value = schemata; index.choices["current_schemata"] = new SlimSelect({ @@ -14,7 +14,13 @@ let index = { showSearch: false, afterClose: function(){app.changedataset();} }); + index.choices["current_lang"] = new SlimSelect({ + select: "#current_lang", + showSearch: false, + afterClose: function(){index.change_language();} + }); index.getDataSets(); + index.choices["current_lang"].set("[% session.lang %]"); }, gettermsstatus: function(){ postData("db.cgi",{"get":"termsstatus"}).then(data => { @@ -37,5 +43,11 @@ let index = { document.getElementById("dlg_terms").style.display = 'none'; }) + }, + change_language: function(){ + var nl = index.choices["current_lang"].selected() + postData("db.cgi",{"fn":"changelanguage","lang":nl}).then(data => { + location.reload(); + }); } } \ No newline at end of file diff --git a/app/tmpl/module/periods/reportperiod.js b/app/tmpl/module/periods/reportperiod.js index 11c80c31..fc0ea136 100644 --- a/app/tmpl/module/periods/reportperiod.js +++ b/app/tmpl/module/periods/reportperiod.js @@ -50,19 +50,19 @@ let reportperiod ={ {title: '[% lbl.prename %]',width: 170, field:"prename",headerSort: false}, {title: '[% lbl.name %]',width: 170, field:"surname",headerSort: false}, {title: '[% lbl.contract %]',width: 70, field:"contracthours",hozAlign:"right",headerSort: false}, - {title: '',width: 65, field:"workhours",hozAlign:"right",headerSort: false}, + {title: '[% lbl.work %]',width: 65, field:"workhours",hozAlign:"right",headerSort: false}, {title: '[% lbl.recuperation_short %]',width: 65, field:"recuperationhours",hozAlign:"right",headerSort: false,formatter:periodRecupFormatter}, {title: '[% lbl.vacancy %]',width: 65, field:"vacancynormal",hozAlign:"right",headerSort: false}, {title: '[% lbl.vacancyill2 %]',width:65, field:"vacancyill",hozAlign:"right",headerSort: false}, - {title: '',width: 65, field:"totalhours",hozAlign:"right",headerSort: false,formatter:periodTotalFormatter}, + {title: '[% lbl.total %]',width: 65, field:"totalhours",hozAlign:"right",headerSort: false,formatter:periodTotalFormatter}, {title: '[% lbl.statementtransfered2 %]',width: 70, field:"transferedhours",hozAlign:"right",headerSort: false}, {title: '[% lbl.supphourspayed2 %]',width: 65, field:"payedhours",hozAlign:"right",headerSort: false,headerVertical:true} , {title: '[% lbl.finalstatementpot %]',width: 70, field:"hoursdiff",hozAlign:"right",headerSort: false}, {title: '[% lbl.supp44h2 %]',width: 50, field:"suppvacancy44hours",hozAlign:"right",headerSort: false,headerVertical:true}, - {title: 'suppl.
trav. dim.
',width: 50, field:"suppvacancysunwork",hozAlign:"right",headerSort: false,headerVertical:true}, + {title: '[% lbl.suppsunwork %]',width: 50, field:"suppvacancysunwork",hozAlign:"right",headerSort: false,headerVertical:true}, {title: '[% lbl.avgweek_short %]',width: 60, field:"avgtotalweekhours",hozAlign:"right",headerSort: false,formatter:periodAVGFormatter}, - {title: '[% lbl.validated %]',width: 40, field:"isvalidated",hozAlign:"center",headerSort: false,formatter:"tickCross", formatterParams:{allowEmpty:true,allowTruthy: false},headerVertical:true}, - {title: '[% lbl.supphourspayed2 %]',width: 65, field:"payedhours",hozAlign:"right",headerSort: false,headerVertical:true} , + {title: '[% lbl.validated %]',width: 40, field:"isvalidated",hozAlign:"center",headerSort: false,formatter:"tickCross", formatterParams:{allowEmpty:true,allowTruthy: false},headerVertical:true} + ] }); reportperiod.tblsplitted = new Tabulator("#tbl_rpsplitted", { @@ -92,7 +92,7 @@ let reportperiod ={ {title: '[% lbl.supphourspayed2 %]',width: 70, field:"payedhours",formatter:nullrFormatter,hozAlign:"right",headerSort: false,headerVertical:true, bottomCalc:reportperiod.setpayedhours} , {title: '[% lbl.finalstatementpot %]',width: 80, field:"hoursdiff",formatter:nullrFormatter,hozAlign:"right",headerSort: false, bottomCalc:reportperiod.sethoursdiff}, {title: '[% lbl.supp44h2 %]',width: 50, field:"suppvacancy44hours",formatter:nullrFormatter,hozAlign:"right",headerSort: false,headerVertical:true, bottomCalc:reportperiod.setsuppvacancy44hours}, - {title: 'suppl.
trav. dim.
',width: 50, field:"suppvacancysunwork",formatter:nullrFormatter,hozAlign:"right",headerSort: false,headerVertical:true, bottomCalc:reportperiod.setsuppvacancysunwork}, + {title: '[% lbl.suppsunwork %]',width: 50, field:"suppvacancysunwork",formatter:nullrFormatter,hozAlign:"right",headerSort: false,headerVertical:true, bottomCalc:reportperiod.setsuppvacancysunwork}, {title: '[% lbl.avgweek_short %]',width: 60, field:"avgtotalweekhours",formatter:nullrFormatter,hozAlign:"right",headerSort: false, bottomCalc:reportperiod.setavgtotalweekhours}, {title: '[% lbl.validated %]',width: 40, field:"isvalidated",formatter:nullrFormatter,hozAlign:"center",headerSort: false,headerVertical:true, bottomCalc:reportperiod.setisvalidated, bottomCalcFormatter:"html",headerVertical:true}, ], diff --git a/app/tmpl/module/profile/profile.js b/app/tmpl/module/profile/profile.js new file mode 100644 index 00000000..670ec638 --- /dev/null +++ b/app/tmpl/module/profile/profile.js @@ -0,0 +1,79 @@ +let profile = { + reftbl: null, +generatenewpassword: function(){ + let fndata = {"fn":"genpwd"}; + postData("db.cgi",fndata).then(data => { + if (data && data.result.data.password){ + document.getElementById("newpwd1").value=data.result.data.password; + profile.viewpwd('newpwd1',"text"); + + document.getElementById("newpwd2").value=data.result.data.password; + } + }); +}, +showdlgnewpassword: function(tbl=false){ + let sel = []; + if (tbl == true){ + sel =profile.reftbl.getSelectedData(); + if (sel.length == 0){ + return false; + } + } + document.getElementById("newpwd1").value = ""; + document.getElementById("newpwd2").value = ""; + profile.viewpwd('newpwd1',"pwd"); + profile.viewpwd('newpwd2',"pwd"); + app.viewdialog("newpassword"); + return false; +}, +validatepwd: function(){ + let pwd1 = document.getElementById("newpwd1").value; + let pwd2 = document.getElementById("newpwd1").value; + let res = true; + if (pwd1 != pwd2) { res = false; console.log(pwd1 + "!=" +pwd2);} + if (pwd1.length < 10 || pwd2.length < 10) { res=false; console.log("pwd length mismatch!");} + if (/[a-z]/.test(pwd1) == false || /[a-z]/.test(pwd2) == false) {res = false; console.log("lower letters mismatch!");} + if (/[A-Z]/.test(pwd1) == false || /[A-Z]/.test(pwd2) == false) {res = false; console.log("upper letters mismatch!");} + if (/[0-9]/.test(pwd1) == false || /[0-9]/.test(pwd2) == false) { res =false; console.log("number letters mismatch!");} + return res; +}, +viewpwd(id,force){ + + if (force == "text"){ + document.getElementById(id).type = "text"; + document.getElementById("btn_" + id).innerHTML=''; + } else if (force == "pwd"){ + document.getElementById(id).type = "password"; + document.getElementById("btn_" + id).innerHTML=''; + }else { + var fldtype = document.getElementById(id).type; + if (fldtype == "text"){ + document.getElementById(id).type = "password"; + document.getElementById("btn_" + id).innerHTML=''; + } else { + document.getElementById(id).type = "text"; + document.getElementById("btn_" + id).innerHTML=''; + } + } + + return false; +}, +savepwd: function(){ + let valp = profile.validatepwd(); + let sel = []; + if (profile.reftbl){ + sel =profile.reftbl.getSelectedData(); + console.log("has reftbl!"); + } else { + sel.push({id:"[% session.id %]"}); + console.log("set own profile pwd!"); + } + if (sel[0] && valp==true){ + postData("db.cgi",{"fn":"savenewpwd","pwd":document.getElementById("newpwd1").value,"iduser":sel[0].id}).then(data => { + app.closedlg("dlg_newpassword"); + dataform.formsaved({}); + }) + } + return false; +} +} \ No newline at end of file diff --git a/app/tmpl/module/workplans.tt b/app/tmpl/module/workplans.tt index e4918fcd..bfde7487 100644 --- a/app/tmpl/module/workplans.tt +++ b/app/tmpl/module/workplans.tt @@ -19,8 +19,8 @@
[% INCLUDE block/pnl_nodata.tt %] -