v20200907
authorkilian <ksaffran@dks.lu>
Tue, 8 Sep 2020 12:02:14 +0000 (14:02 +0200)
committerkilian <ksaffran@dks.lu>
Tue, 8 Sep 2020 12:02:14 +0000 (14:02 +0200)
12 files changed:
website/app/lib/POT/Period.pm
website/app/lib/POT/Report.pm
website/app/lib/POT/Workplan.pm
website/app/lib/dksdb.pm
website/app/lib/session.pm
website/app/static/js/timecalc.js
website/app/tmpl/index.tt
website/app/tmpl/module/index.tt
website/app/tmpl/module/periods/reportperiod.js
website/app/tmpl/module/periods/staffperiodweeks.js
website/app/tmpl/module/staff/pnl_basedata.tt
website/app/tmpl/module/staff/staffperiods.js

index 65f773d..ede6f86 100644 (file)
@@ -78,11 +78,12 @@ sub getStaffPeriods(){
     COALESCE(st.surname || ' '::text, ''::text) || COALESCE(st.prename, ''::text) AS staffname,
     st.id_staffgroup, sgr.groupname,
     to_char(srp.payedhours, 'HH24:MI'::text) AS payedhours,
-    to_char(srp.transferedhourscalc, 'HH24:MI'::text) AS transferedhourscalc,
-    to_char(srp.transferedhours, 'HH24:MI'::text) AS transferedhours,
+    case when left(to_char(srp.transferedhourscalc, 'HH24:MI'),1) = '-' then '-' || replace(to_char(srp.transferedhourscalc, 'HH24:MI'),'-','') else to_char(srp.transferedhourscalc, 'HH24:MI') end  as transferedhourscalc,
+    case when left(to_char(srp.transferedhours, 'HH24:MI'),1) = '-' then '-' || replace(to_char(srp.transferedhours, 'HH24:MI'),'-','') else to_char(srp.transferedhours, 'HH24:MI') end  as transferedhours,
     case when suppvacancysunwork is not null and suppvacancysunwork > 0 then '+' || suppvacancysunwork  else  null end as suppvacancysunwork,
     case when suppvacancy44hours is not null and suppvacancy44hours > 0 then '+' || suppvacancy44hours  else null end as suppvacancy44hours
-    ,itmcontracthours,maxdays
+    ,itmcontracthours,maxdays,
+    to_char(srp.avgtotalweekhours, 'HH24:MI'::text) AS avgtotalweekhours
    FROM ".$schema.".staffreportperiod srp
      LEFT JOIN ".$schema.".staff st ON srp.id_staff = st.id
      LEFT JOIN ".$schema.".reportperiod rp ON srp.id_reportperiod = rp.id
@@ -380,9 +381,25 @@ select weekstart,".((exists($prevprddata->{status44hcount}) && $prevprddata->{st
                                   ORDER BY sr.id_staff, sr.daydate) xx_1) yy order by yy.daydate,weekstart
                                  ) aa group by aa.weekstart order by weekstart
                                  ) bb)cc;";
-
+  
 
   my $status44count = $self->{db}->query($sql44);
+
+  my $sqlavghours = "select id_staff,avg(avgtotalhours) as avgtotalhours from (  
+     select ws.weekstart, ws.id_staff,
+  AVG(ws.totalhours) over (order by ws.weekstart) as avgtotalhours
+  from (
+  SELECT weekstart, id_staff,
+sum(CASE WHEN srpd.dayhours IS NULL THEN '00:00:00'::interval ELSE srpd.dayhours::interval END) AS totalhours
+                   FROM (select *,date(date_trunc('week', daydate)) AS weekstart,
+                    date(date_trunc('week', daydate) + interval '6 days') AS weekend,
+                    date_part('week', daydate) AS calweek,
+                    date_part('isoyear', daydate) AS calyear from ".$schema.".staffreportperioddays
+                    --where id_staff= '".$id_staff."' and daydate between date(date_trunc('week',date('".$prd->{startdate}."'))) and date(date_trunc('week',date('".$prd->{enddate}."')) + interval '6 days')
+                    where id_staff= '".$id_staff."' and daydate between date('".$prd->{startdate}."') and date('".$prd->{enddate}."')
+                    ) srpd GROUP BY srpd.weekstart,srpd.id_staff
+                  ORDER BY weekstart) ws) wsavg group by id_staff;";
+  my $whavg = $self->{db}->query($sqlavghours);
   #print STDERR "SQLSun:".$sqlsun."\n";
   my $sql = "select id from ".$schema.".staffreportperioddays where id_staff='".$id_staff."' and daydate between date(date_trunc('week',date('".$prd->{startdate}."'))) and date(date_trunc('week',date('".$prd->{enddate}."')) + interval '6 days')";
   $self->updatePeriodDaySums($schema,$sql);
@@ -390,6 +407,8 @@ select weekstart,".((exists($prevprddata->{status44hcount}) && $prevprddata->{st
   --contracthours=csp.contracthours,
   workhours=csp.workhours,
   vacancyhours=csp.vacancyhours,
+  vacancyill=csp.vacancyill,
+  vacancynormal=csp.vacancynormal,
   totalhours=csp.totalhours,
   recuperationhours=csp.recuperationhours,";
   #if ((defined($statussuncount) && $staffprdprev->{prevperiod} ne '')){
@@ -398,15 +417,18 @@ select weekstart,".((exists($prevprddata->{status44hcount}) && $prevprddata->{st
   $sql .= "suppvacancy44hours=".(($status44count->{plusdays} gt "0")?$status44count->{plusdays}:'null').",";
   $sql .= "status44hcount=".(($status44count->{weeksrest} eq "")?'null':$status44count->{weeksrest}).",";
   $sql .= "last44date=".(($status44count->{maxdate} eq "")?'null':"date('".$status44count->{maxdate}."')").",";
+  $sql .= "avgtotalweekhours='".$whavg->{avgtotalhours}."'::interval,";
   $sql .= "hoursdiff=csp.diffhours
-  FROM(
-  select contracthours,workhours,vacancyhours,totalhours,recuperationhours, totalhours-contracthours-payedhours+transferedhourscalc as diffhours,id from (
+  FROM (
+  select contracthours,workhours,vacancyhours,totalhours,recuperationhours, totalhours-contracthours-payedhours+transferedhourscalc as diffhours,id,vacancyill,vacancynormal from (
   select dp.id,
   sum(pd.workhours) as workhours,
   sum(pd.dayhours) as totalhours,
   sum(coalesce(pd.vacancyhours,'00:00:00'::time)) as vacancyhours,
+  sum(case when pd.id_vacancytype = 'ill' and pd.vacancyhours > '00:00:00'::time then coalesce(pd.vacancyhours,'00:00:00'::time) else '00:00:00'::time end) as vacancyill,
+  sum(case when pd.id_vacancytype != 'ill' and pd.vacancyhours > '00:00:00'::time then coalesce(pd.vacancyhours,'00:00:00'::time) else '00:00:00'::time end) as vacancynormal,
   sum(coalesce(pd.recuperationhours,'00:00:00'::time)) as recuperationhours, 
-  sum(coalesce(pd.contracthours,'00:00:00'::time)) as contracthours,
+  coalesce(dp.contracthours,'00:00:00'::interval) as contracthours,
   coalesce(dp.payedhours,'00:00:00'::interval) as payedhours,
   coalesce(dp.transferedhourscalc,'00:00:00'::interval) as transferedhourscalc
   from ".$schema.".staffreportperioddays pd 
@@ -467,13 +489,20 @@ where sc.id_staff='".$id_staff."' order by startdate,enddate;";
   #    and startdate < date('".$prddata->{enddate}."')  and enddate is null or enddate > date('".$prddata->{startdate}."');";
 
   my $defdays = $self->{db}->querysorted($contractsql);
-  
+  my $firstday=$defdays->{0}->{startdate};
+  my $kl = keys(%{$defdays})-1;
+  my $lastday=$defdays->{$kl}->{enddate};
+  my $sql = "select date(date_trunc('week',date('".$firstday."'))) as firstday , date(date_trunc('week',date('".$lastday."')) + interval '6 days') as lastday";
+  my $dlim = $self->{db}->query($sql);
+  $defdays->{0}->{startdate} = $dlim->{firstday};
+  $defdays->{$kl}->{enddate} = $dlim->{lastday};
   #if ($defdays->{0}->{startdate} eq $prddata->{startdate} && $prddata->{startdate} ne $prddata->{startdatealt}){
   #   $defdays->{0}->{startdate} = $prddata->{startdatealt};
   # }
   # if (($defdays->{0}->{startdate} lt $prddata->{startdate}) && ($defdays->{0}->{startdatealt} lt $prddata->{startdate})){
   #   $defdays->{0}->{startdate} = $defdays->{0}->{startdatealt};
   # }
+  print STDERR Dumper($defdays);
   my @delete = ();
 #  print STDERR Dumper($defdays);
   # my $cpsql = "select payedpauses from public.companies where schemata='".$schema."'";
@@ -502,16 +531,16 @@ do update set wdcontracthours = '".$cth->{ wdcontracthours}."';";
     # if (($defdays->{0}->{startdate} lt $prddata->{startdate}) && ($defdays->{0}->{startdate}  lt $prddata->{startdatealt})){
     #   $prddata->{startdate} = $prddata->{startdatealt};
     # }
-    my $delsql = "DELETE FROM ".$schema.".staffreportperioddays where id_staff='".$id_staff."' and (daydate > date('".$prddata->{enddate}."') or daydate < date('".$prddata->{startdate}."')) 
+    my $delsql = "DELETE FROM ".$schema.".staffreportperioddays where id_staff='".$id_staff."' and (daydate > date('".$dlim->{lastday}."') or daydate < date('".$dlim->{firstday}."')) 
     OR (id_staff='".$id_staff."' AND ".join(" AND ",@delete).");";
-    #print STDERR "DEL1:".$delsql."\n======\n";
+    print STDERR "DEL1:".$delsql."\n======\n";
     $self->{db}->exec($delsql);
     
   }
   my $delstaffreportssql = "delete from ".$schema.".staffreportperiod sp where id_staff='".$id_staff."' and id_reportperiod not in (
 select rp.id from ".$schema.".reportperiod rp left join ".$schema.".staffreportperioddays pd on (pd.daydate between rp.startdate and rp.enddate)
 where pd.id_staff='".$id_staff."' group by rp.id);";
-  #print STDERR "DEL2:".$delstaffreportssql."\n======\n";
+  print STDERR "DEL2:".$delstaffreportssql."\n======\n";
   $self->{db}->exec($delstaffreportssql);
   #$self->{db}->exec($delsql);
   
index a06f9ea..21145f4 100644 (file)
@@ -122,7 +122,19 @@ function subst() {
 <table style=\"width: 100%;\" >
   <tr><td colspan=\"2\" style=\"text-align: right;font-size: 8pt;\"><span class=\"date\"></span>&nbsp;<span class=\"time\"></span></td></tr>
   <tr>
-    <td></td>
+    <td style=\"text-align:left;font-size: 6pt;\">";
+    print FT "<div>Congé:  ";
+    my $vleg = $self->{db}->querysorted("SELECT vacancyname,legend FROM ".$schema.".vacancytypes WHERE isworktime=true order by legend;");
+    foreach my $v (sort {$a <=> $b} keys(%{$vleg})){
+      print FT $vleg->{$v}->{legend}.") ".$vleg->{$v}->{vacancyname}." ";
+    }
+    print FT "</div>";
+    print FT '<div>Récupération:  ';
+    my $rleg = $self->{db}->querysorted("SELECT vacancyname,legend FROM ".$schema.".vacancytypes WHERE isworktime<>true order by legend;");
+    foreach my $r (sort {$a <=> $b} keys(%{$rleg})){
+      print FT $rleg->{$r}->{legend}.") ".$rleg->{$r}->{vacancyname}." ";
+    }
+  print FT "</div></td>
     <td style=\"text-align:right;font-size: 8pt;\">
       Page <span class=\"page\"></span>/<span class=\"topage\"></span>
     </td>
@@ -140,6 +152,8 @@ sub printContent(){
   my $data = shift;
   my $id_stafflist = "";
   my $stafflist = ();
+  $self->{legend}->{vacancy} = $self->{db}->querybykey("id","SELECT id,legend FROM ".$schema.".vacancytypes WHERE isworktime=true order by legend;");
+  $self->{legend}->{recup} = $self->{db}->querybykey("id","SELECT id,legend FROM ".$schema.".vacancytypes WHERE isworktime<>true order by legend;");
   open(CT,">".$outfile);
   print CT "
 <!DOCTYPE html>
@@ -184,11 +198,14 @@ if (exists($data->{staff_exclude})){
   to_char(srp.contracthours, 'HH24:MI'::text) AS contracthours,
     to_char(srp.workhours, 'HH24:MI'::text) AS workhours,
     to_char(srp.vacancyhours, 'HH24:MI'::text) AS vacancyhours,
+    to_char(srp.vacancyill, 'HH24:MI'::text) AS vacancyill,
+    to_char(srp.vacancynormal, 'HH24:MI'::text) AS vacancynormal,
     to_char(srp.recuperationhours, 'HH24:MI'::text) AS recuperationhours,
-    to_char(srp.hoursdiff, 'HH24:MI'::text) as hoursdiff,
+    case when left(to_char(srp.hoursdiff, 'HH24:MI'),1) = '-' then '-' || replace(to_char(srp.hoursdiff, 'HH24:MI'),'-','') else to_char(srp.hoursdiff, 'HH24:MI') end  as hoursdiff,
     to_char(srp.totalhours, 'HH24:MI'::text) AS totalhours,
     to_char(srp.payedhours, 'HH24:MI'::text) AS payedhours,
-    to_char(srp.transferedhourscalc, 'HH24:MI'::text) AS transferedhourscalc,
+    to_char(srp.avgtotalweekhours, 'HH24:MI'::text) AS avgtotalweekhours,
+    case when left(to_char(srp.transferedhourscalc, 'HH24:MI'),1) = '-' then '-' || replace(to_char(srp.transferedhourscalc, 'HH24:MI'),'-','') else to_char(srp.transferedhourscalc, 'HH24:MI') end  as transferedhourscalc,
     '+' || suppvacancysunwork as suppvacancysunwork,
     '+' || suppvacancy44hours as suppvacancy44hours
    from ".$schema.".staffreportperiod srp 
@@ -217,11 +234,14 @@ order by rp.startdate,rp.enddate,st.surname,st.prename;";
   to_char(srp.contracthours, 'HH24:MI'::text) AS contracthours,
     to_char(srp.workhours, 'HH24:MI'::text) AS workhours,
     to_char(srp.vacancyhours, 'HH24:MI'::text) AS vacancyhours,
+    to_char(srp.vacancyill, 'HH24:MI'::text) AS vacancyill,
+    to_char(srp.vacancynormal, 'HH24:MI'::text) AS vacancynormal,
     to_char(srp.recuperationhours, 'HH24:MI'::text) AS recuperationhours,
-    to_char(srp.hoursdiff, 'HH24:MI'::text) as hoursdiff,
+    case when left(to_char(srp.hoursdiff, 'HH24:MI'),1) = '-' then '-' || replace(to_char(srp.hoursdiff, 'HH24:MI'),'-','') else to_char(srp.hoursdiff, 'HH24:MI') end  as hoursdiff,
     to_char(srp.totalhours, 'HH24:MI'::text) AS totalhours,
     to_char(srp.payedhours, 'HH24:MI'::text) AS payedhours,
-    to_char(srp.transferedhourscalc, 'HH24:MI'::text) AS transferedhourscalc,
+    to_char(srp.avgtotalweekhours, 'HH24:MI'::text) AS avgtotalweekhours,
+    case when left(to_char(srp.transferedhourscalc, 'HH24:MI'),1) = '-' then '-' || replace(to_char(srp.transferedhourscalc, 'HH24:MI'),'-','') else to_char(srp.transferedhourscalc, 'HH24:MI') end  as transferedhourscalc,
     '+' || suppvacancysunwork as suppvacancysunwork,
     '+' || suppvacancy44hours as suppvacancy44hours
    from ".$schema.".staffreportperiod srp 
@@ -251,16 +271,16 @@ sub ReportPage(){
   my $weeksums = $self->getPeriodWeekSums($schema,$data->{id_staff},$data->{startdate},$data->{enddate});
   my $tblheader = "<table>
     <thead>
-      <tr ><th colspan=\"5\" style=\"border-right: 0px;font-size: 10pt;\">".$data->{dspstartdate}." - ".$data->{dspenddate}."</th><th colspan=\"4\" style=\"border-left: 0px;text-align: right;font-size: 10pt;\">".$data->{surname}." ".$data->{prename}."</th></tr>
-      <tr><th>Semaine</th>
-      <th>Lundi</th>
-      <th>Mardi</th>
-      <th>Mecredi</th>
-      <th>Jeudi</th>
-      <th>Vendredi</th>
-      <th>Samedi</th>
-      <th>Dimanche</th>
-      <th>Totaux</th></tr>
+      <tr ><th colspan=\"5\" style=\"border-right: 0px;font-size: 10pt;\">".$data->{dspstartdate}." - ".$data->{dspenddate}."</th><th colspan=\"4\" style=\"border-left: 0px;font-size: 10pt;\">".$data->{surname}." ".$data->{prename}."</th></tr>
+      <tr><th style=\"background-color: #e6e6e6;\">Semaine</th>
+      <th style=\"background-color: #e6e6e6;\">Lundi</th>
+      <th style=\"background-color: #e6e6e6;\">Mardi</th>
+      <th style=\"background-color: #e6e6e6;\">Mecredi</th>
+      <th style=\"background-color: #e6e6e6;\">Jeudi</th>
+      <th style=\"background-color: #e6e6e6;\">Vendredi</th>
+      <th style=\"background-color: #e6e6e6;\">Samedi</th>
+      <th style=\"background-color: #e6e6e6;\">Dimanche</th>
+      <th style=\"background-color: #e6e6e6;\">Totaux</th></tr>
     </thead>
     <tbody>";
     my $txtpage = $tblheader;
@@ -282,15 +302,15 @@ sub ReportPage(){
           $cntr++;
           my @dspwd = split(',',$perioddata->{$pw}->{dspweekdates});
           
-    $txtpage .="<tr><th rowspan=\"2\">".$perioddata->{$pw}->{dspweekshort}."</th>
-          <th style=\"width: 44mm;\">".$dspwd[0]."</th>
-          <th style=\"width: 44mm;\">".$dspwd[1]."</th>
-          <th style=\"width: 44mm;\">".$dspwd[2]."</th>
-          <th style=\"width: 44mm;\">".$dspwd[3]."</th>
-          <th style=\"width: 44mm;\">".$dspwd[4]."</th>
-          <th style=\"width: 44mm;\">".$dspwd[5]."</th>
-          <th style=\"width: 44mm;\">".$dspwd[6]."</th>
-          <th></th></tr><tr>
+    $txtpage .="<tr><th rowspan=\"2\" style=\"background-color: #e6e6e6;\">".$perioddata->{$pw}->{dspweekshort}."</th>
+          <th style=\"width: 44mm;background-color: #e6e6e6;\">".$dspwd[0]."</th>
+          <th style=\"width: 44mm;background-color: #e6e6e6;\">".$dspwd[1]."</th>
+          <th style=\"width: 44mm;background-color: #e6e6e6;\">".$dspwd[2]."</th>
+          <th style=\"width: 44mm;background-color: #e6e6e6;\">".$dspwd[3]."</th>
+          <th style=\"width: 44mm;background-color: #e6e6e6;\">".$dspwd[4]."</th>
+          <th style=\"width: 44mm;background-color: #e6e6e6;\">".$dspwd[5]."</th>
+          <th style=\"width: 44mm;background-color: #e6e6e6;\">".$dspwd[6]."</th>
+          <th style=\"background-color: #e6e6e6;\">&nbsp;</th></tr><tr>
         ";
         $wdk = 1; 
         }
@@ -298,7 +318,7 @@ sub ReportPage(){
           while (($perioddata->{$pw}->{daydate} ne $wd[$wdk]) && $wdk le "7"){
             if ($wdk == 0){$wdk++; next; }
             if (($perioddata->{$pw}->{daydate} gt $data->{startdate}) || ($perioddata->{$pw}->{daydate} lt $data->{enddate})){
-              $txtpage .="<td style=\"max-height: 15px!important;height: 15mm;\">&nbsp;</td>";
+              $txtpage .="<td style=\"max-height: 15px!important;height: 15mm;background-color: #d6d6d6;\">&nbsp;</td>";
             } 
             
             $wdk++; 
@@ -328,12 +348,12 @@ sub ReportPage(){
             </tr>
             <tr>  
               <td class=\"datavalues\"  style=\"height: 5mm;border-bottom: 0.5px solid #969696;border-right: 0;\">
-                ".(($perioddata->{$pw}->{vacancyhours})?"<div style=\"font-style: italic;\">".$perioddata->{$pw}->{vacancyhours}."</div>":"&nbsp;")."
+                ".(($perioddata->{$pw}->{vacancyhours})?"<div style=\"font-style: italic;\">".$perioddata->{$pw}->{vacancyhours}." <sup>".$self->{legend}->{vacancy}->{$perioddata->{$pw}->{id_vacancytype}}->{legend}.")</sup></div>":"&nbsp;")."
               </td>
             </tr>
             <tr>  
               <td class=\"datavalues\"  style=\"height: 5mm;border-right: 0;\">
-                ".(($perioddata->{$pw}->{recuperationhours})?"<div style=\"text-decoration: underline;\">".$perioddata->{$pw}->{recuperationhours}."</div>":"&nbsp;")."
+                ".(($perioddata->{$pw}->{recuperationhours})?"<div style=\"text-decoration: italic;\">".$perioddata->{$pw}->{recuperationhours}." <sup>".$self->{legend}->{recup}->{$perioddata->{$pw}->{id_recuperationtype}}->{legend}.")</sup></div>":"&nbsp;")."
               </td>
             </tr>
             </table>
@@ -359,16 +379,7 @@ sub ReportPage(){
               <div style=\"font-weight: bold;border-bottom: 0.5px solid #969696;\">".$weeksums->{$ws}->{totalhours}."</div>
               </td>
             </tr>
-            <tr>
-              <td class=\"datavalues\"  style=\"height: 5mm;\">
-              <div style=\"font-weight: bold;text-decoration: underline;border-bottom: 0.5px solid #969696;\">".(($weeksums->{$ws}->{recperationhours} eq "00:00")?"":$weeksums->{$ws}->{recperationhours})."</div>
-              </td>
-            </tr>
-            <tr>
-              <td class=\"datavalues\"  style=\"height: 5mm;\">
-            <div style=\"font-weight: bold;font-style: italic;border-bottom: 0.5px solid #969696;\">".(($weeksums->{$ws}->{vacancyhours} eq "00:00")?"":$weeksums->{$ws}->{vacancyhours})."</div>
-            </td>
-            </tr></table>
+            </table>
             ";
             #<div style=\"font-weight: bold;text-decoration: underline;text-decoration-style: double;border-bottom: 0.5px solid #969696;\">".(($weeksums->{$ws}->{diffhours} eq "00:00")?"":$weeksums->{$ws}->{diffhours})."</div>
           }
@@ -381,7 +392,7 @@ sub ReportPage(){
       #print STDERR "WDK: ".$wdk."\n";
       if ($wdk gt "0"){
        while ($wdk le "7"){
-          $txtpage .="<td style=\"height: 15mm;\">&nbsp;</td>";
+          $txtpage .="<td style=\"height: 15mm;background-color: #d6d6d6;\">&nbsp;</td>";
          $wdk++;
       }
       if ($wdk gt "7"){
@@ -396,17 +407,18 @@ sub ReportPage(){
               <div style=\"font-weight: bold;border-bottom: 0.5px solid #969696;\">".$weeksums->{$ws}->{totalhours}."</div>
               </td>
             </tr>
-            <tr>
-              <td class=\"datavalues\"  style=\"height: 5mm;\">
-              <div style=\"font-weight: bold;text-decoration: underline;border-bottom: 0.5px solid #969696;\">".(($weeksums->{$ws}->{recperationhours} eq "00:00")?"":$weeksums->{$ws}->{recperationhours})."</div>
-              </td>
-            </tr>
-            <tr>
-              <td class=\"datavalues\"  style=\"height: 5mm;\">
-            <div style=\"font-weight: bold;font-style: italic;border-bottom: 0.5px solid #969696;\">".(($weeksums->{$ws}->{vacancyhours} eq "00:00")?"":$weeksums->{$ws}->{vacancyhours})."</div>
-            </td>
-            </tr></table>
+            </table>
             ";
+            # <tr>
+            #   <td class=\"datavalues\"  style=\"height: 5mm;\">
+            #   <div style=\"font-weight: bold;text-decoration: underline;border-bottom: 0.5px solid #969696;\">".(($weeksums->{$ws}->{recperationhours} eq "00:00")?"":$weeksums->{$ws}->{recperationhours})."</div>
+            #   </td>
+            # </tr>
+            # <tr>
+            #   <td class=\"datavalues\"  style=\"height: 5mm;\">
+            # <div style=\"font-weight: bold;font-style: italic;border-bottom: 0.5px solid #969696;\">".(($weeksums->{$ws}->{vacancyhours} eq "00:00")?"":$weeksums->{$ws}->{vacancyhours})."</div>
+            # </td>
+            # </tr>
             #<div style=\"font-weight: bold;text-decoration: underline;text-decoration-style: double;border-bottom: 0.5px solid #969696;\">".(($weeksums->{$ws}->{diffhours} eq "00:00")?"":$weeksums->{$ws}->{diffhours})."</div>
           }
           $txtpage .= "</td></tr></table>
@@ -421,28 +433,24 @@ sub ReportPage(){
   # my $spt = $data->{sums};
   $txtpage .= "<table>
     <thead>
-    <tr><th colspan=\"20\">Totaux heures pour la p&eacuteriode: ".$data->{dspstartdate}." - ".$data->{dspenddate}."</th></tr>
+    <tr><th colspan=\"20\">R&eacute;sum&eacute;e p&eacute;riode de r&eacute;f&eacute;rence: ".$data->{dspstartdate}." - ".$data->{dspenddate}."</th></tr>
     <tr>
-      <td style=\"text-align: right;\">contrat:</td>
-      <th style=\"width: 15mm;\">".$data->{contracthours}."</th>
-      <td style=\"text-align: right;\">travail:</td>
-      <th style=\"width: 15mm;\">".$data->{workhours}."</th>
-      <td style=\"text-align: right;\">cong&eacute;s:</td>
-      <th style=\"width: 15mm;\">".$data->{vacancyhours}."</th>
-      <td style=\"text-align: right;\">r&eacute;cup&eacute;r&eacute;es:</td>
-      <th style=\"width: 15mm;\">".$data->{recuperationhours}."</th>
-      <td style=\"text-align: right;\">total:</td>
+      <td style=\"text-align: right;background-color: #e6e6e6;\">heures contractuelles:<br/>heures travaill&eacute;es:</td>
+      <th style=\"width: 15mm;\">".$data->{contracthours}."<br/>".$data->{workhours}."</th>
+      <td style=\"text-align: right;background-color: #e6e6e6;\">cong&eacute; maladie:<br>cong&eacute;:</td>
+      <th style=\"width: 15mm;\">".(($data->{vacancyill} ne '')?$data->{vacancyill} :"00:00")."<br>".(($data->{vacancynormal} ne '')?$data->{vacancynormal} :"00:00")."</th>
+      <td style=\"text-align: right;background-color: #e6e6e6;\">heures<br/>r&eacute;cup&eacute;r&eacute;es:</td>
+      <th style=\"width: 15mm;\">".$data->{recuperationhours}."<br/>&nbsp;</th>
+      <td style=\"text-align: right;background-color: #e6e6e6;\">dur&eacute;e travail<br/>r&eacute;el prest&eacute;e:</td>
       <th style=\"width: 15mm;\">".$data->{totalhours}."</th>
-      <td style=\"text-align: right;\">d&eacute;compte<br/>report&eacute;:</td>
-      <th style=\"width: 15mm;\">".$data->{transferedhourscalc}."</th>
-      <td style=\"text-align: right;\">heures<br/>pay&eacute;es:</td>
-      <th style=\"width: 15mm;\">".$data->{payedhours}."</th>
-      <td style=\"text-align: right;\">d&eacute;compte<br/>fin POT:</td>
+      <td style=\"text-align: right;background-color: #e6e6e6;\">moyenne dur&eacute;e<br/>travail r&eacute;el:</td>
+      <th style=\"width: 15mm;\">".$data->{avgtotalweekhours}."</th>
+      <td style=\"text-align: right;background-color: #e6e6e6;\">d&eacute;compte report&eacute;:<br/>heures pay&eacute;es:</td>
+      <th style=\"width: 15mm;\">".(($data->{transferedhourscalc} ne '')?$data->{transferedhourscalc}:"00:00")."<br/>".(($data->{payedhours} ne '')?$data->{payedhours}:"00:00")."</th>
+      <td style=\"text-align: right;background-color: #e6e6e6;\">d&eacute;compte<br/>fin POT:</td>
       <th style=\"width: 15mm;\">".$data->{hoursdiff}."</th>
-      <td style=\"text-align: right;\">cong&eacute; suppl<br/>+44h:</td>
-      <th style=\"width: 15mm;\">".$data->{suppvacancy44hours}."</th>
-      <td style=\"text-align: right;\">cong&eacute; suppl.<br/>dimache travaill&eacute;:</td>
-      <th style=\"width: 15mm;\">".$data->{suppvacancysunwork}."</th>
+      <td style=\"text-align: right;background-color: #e6e6e6;\">cong&eacute; suppl. +44h:<br/>cong&eacute; suppl. dimache travaill&eacute;:</td>
+      <th style=\"width: 15mm;\">".(($data->{suppvacancy44hours} ne '')?$data->{suppvacancy44hours}:"&nbsp;")."<br/>".(($data->{suppvacancysunwork} ne '')?$data->{suppvacancysunwork}:"&nbsp;")."</th>
     </tr>
     </thead>
   </table>";
index 8131691..d7c3cfe 100644 (file)
@@ -87,6 +87,7 @@ sub getWorkplanDays(){
   my $self = shift;
   my $schema = shift;
   my $id_workplan= shift;
+  my $payedpause = $self->{db}->query("select payedpauses from public.companies where schemata='".$schema."';");
   my $sql ="SELECT wp.workplan,
     to_char(wp.weekhours, 'HH24:MI'::text) AS weekhours,
     wpd.id,wpd.id_workplan,wpd.weekday,
@@ -94,14 +95,25 @@ sub getWorkplanDays(){
     to_char(wpd.end1::interval, 'HH24:MI'::text) AS end1,
     to_char(wpd.start2::interval, 'HH24:MI'::text) AS start2,
     to_char(wpd.end2::interval, 'HH24:MI'::text) AS end2,
-    to_char(wpd.pause::interval, 'HH24:MI'::text) AS pause,
-    to_char(
+    to_char(wpd.pause::interval, 'HH24:MI'::text) AS pause,";
+    if ($payedpause->{payedpauses} eq "1"){
+      $sql .= "to_char(
         CASE WHEN wpd.end1 < wpd.start1 THEN wpd.end1::interval + '24:00:00'::interval ELSE wpd.end1::interval
         END - wpd.start1::interval + COALESCE(
         CASE WHEN wpd.end2 < wpd.start2 THEN wpd.end2::interval + '24:00:00'::interval
             ELSE wpd.end2::interval
-        END - wpd.start2::interval, '00:00:00'::interval) - COALESCE(wpd.pause::interval, '00:00:00'::interval), 'HH24:MI'::text) AS dayhours,
-    NULL::bigint AS staffcount, wpd.weeknum,
+        END - wpd.start2::interval, '00:00:00'::interval), 'HH24:MI'::text) AS dayhours,";
+    } else {
+      $sql .= "to_char(
+        CASE WHEN wpd.end1 < wpd.start1 THEN wpd.end1::interval + '24:00:00'::interval ELSE wpd.end1::interval
+        END - wpd.start1::interval + COALESCE(
+        CASE WHEN wpd.end2 < wpd.start2 THEN wpd.end2::interval + '24:00:00'::interval
+            ELSE wpd.end2::interval
+        END - wpd.start2::interval, '00:00:00'::interval) - COALESCE(wpd.pause::interval, '00:00:00'::interval), 'HH24:MI'::text) AS dayhours,";
+    }
+    
+    
+    $sql .="NULL::bigint AS staffcount, wpd.weeknum,
         CASE WHEN wpd.start2 IS NOT NULL AND wpd.end1 IS NOT NULL THEN to_char(wpd.start2::interval - wpd.end1::interval, 'HH24:MI'::text) ELSE NULL::text END AS interruption,
     to_char(wpd.pausestart1::interval, 'HH24:MI'::text) AS pausestart1,
     to_char(wpd.pauseend1::interval, 'HH24:MI'::text) AS pauseend1,
index fe3281f..a7f79a0 100644 (file)
@@ -20,7 +20,7 @@ sub new {
     my $class = shift;
     my $p = shift;
     my $self = bless {}, $class;
-    $self->{debug} = 1;
+    $self->{debug} = 0;
     $self->{dbh} = DBI->connect($p->{dsn},$p->{dbuser},$p->{dbpassword},{PrintError=>1,RaiseError=>1,AutoCommit=>1})  or return "query Connection Error!".$!;
     return $self;
 }
index f08af64..225a8b0 100644 (file)
@@ -212,8 +212,8 @@ 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= '".$ENV{HTTP_USER_AGENT}."' and 
 us.isblocked is null group by se.id,us.id,ugrp.id;";
   my $res= $self->{db}->querysorted($sql);
-  print STDERR "SESSION:".$sql."\n";
-  print STDERR Dumper($res)."\n";
+  #print STDERR "SESSION:".$sql."\n";
+  #print STDERR Dumper($res)."\n";
   my $ret = undef;
   # open FILE,">>tmp/sql.log";
   # print FILE "GET DB Session\n";
index 489f487..4b67b44 100644 (file)
@@ -59,7 +59,10 @@ let timecalc = {
     return "";
   },
   StringToInterval: function(strin){
-    
+    let minus = "";
+    if (strin.startsWith('-')){
+      minus = '-';
+    }
     if (strin.indexOf(":") > 0){
       let spl = strin.split(":");
       hours = spl[0].replace(/\D/g,'');
@@ -70,11 +73,11 @@ let timecalc = {
       if (minutes > "59"){
         minutes = "0";
       }
-      return hours + ":" + timecalc.lpad(minutes,2,'0');
+      return minus + hours + ":" + timecalc.lpad(minutes,2,'0');
     } 
     if (strin == ""){ return "";}
     strin = strin.replace(/\D/g,'');
-    return strin + ":00";
+    return minus + strin + ":00";
     
   },
   MinutesToInterval: function(minutes){
@@ -117,7 +120,9 @@ let timecalc = {
   // },
   copyInterval(obj,idobjout,factor){
     if (factor){
+      
       let mval = timecalc.IntervalToMinutes(obj.value) * factor;
+      console.log("minutes:" + mval);
       document.getElementById(idobjout).value = timecalc.MinutesToInterval(mval);
     }else {
       document.getElementById(idobjout).value=obj.value;
index 0746283..a0cde6f 100644 (file)
@@ -1,4 +1,4 @@
-[% appversion = '0.9.2.2' %]
+[% appversion = '0.9.2.3' %]
 
 <!DOCTYPE html>
 <html lang="fr">
index 3be30e5..ade953c 100644 (file)
@@ -2,7 +2,7 @@
       
   <div class="bar border-bottom toolbar" id="toolbar">
       <div class="bar-item"><img style="height: 40px;" src="[% abspath %][% staticpath %]img/potlogowhite.svg"> </div>
-      <div class="bar-item PageHeadTitle hide-small">POT - Plan d'orgatisation du travail</div>
+      <div class="bar-item PageHeadTitle hide-small">Plan d'organisation du travail</div>
       <a class="bar-item toolbarbtn  right" href="index.html?logout=1"><span class="icon icon-logout" style="font-size: 22px;"></span>Logout</a> 
       <div class="bar-item right">
         <select class="select data_session " id="current_schemata" data-column="current_schemata" data-selected="[% session.sessiondata.schemata %]" data-table="session" data-id="" value="portanova" name="session_current_schemata"  >
index cdc9451..a9f938d 100644 (file)
@@ -62,7 +62,8 @@ let reportperiod ={
         {title: "congé suppl.<br/>+44 h", field:"suppvacancy44hours",headerSort: false},
         {title: "congé suppl.<br/>trav dim.", field:"suppvacancysunwork",headerSort: false},
         //{title: "ITM Contract", field:"itmcontracthours",headerSort: false},
-        {title: "jours<br/>ouvrables", field:"maxdays",headerSort: false}
+        {title: "jours<br/>ouvrables", field:"maxdays",headerSort: false},
+        {title: "moy.<br/>hebd.", field:"avgtotalweekhours",headerSort: false}
           ]
     });
     reportperiod.gettbldatafilter();
index 9416c33..3358090 100644 (file)
@@ -10,6 +10,7 @@ let staffperiodweeks = {
   copy_id: null,
   weekdata:null,
   daylimits:null,
+  selectedid: null,
   vacancytypes:{},
   recuperationtypes:{},
   choices:{"id_vacancytype":null,"id_recuperationtype":null,"id_workplan":null},
@@ -88,7 +89,7 @@ let staffperiodweeks = {
         { title: "Récup",field: "recuperationhours",hozAlign:"center",headerSort: false,formatter:recupformatter,bottomCalc:staffperiodweeks.setweekrecuperationhours},
         { title: "Total",field: "dayhours",hozAlign:"center",headerSort: false,formatter:totalFormatter,bottomCalc:staffperiodweeks.setweektotalhours,bottomCalcFormatter:"html"},
         { title: "diff<br/>contrat",field:"diffhours",hozAlign:"center",formatter:nullFormatter,headerSort:false,bottomCalc:staffperiodweeks.setweekdiffhours},
-        { title: "moyenne<br/> hebdomaire",field: "avgweekhours",hozAlign:"center",headerSort: false,formatter:nullFormatter,bottomCalc:staffperiodweeks.setavgweekhours},
+        { title: "moy.<br/>hebd.",field: "avgweekhours",hozAlign:"center",headerSort: false,formatter:nullFormatter,bottomCalc:staffperiodweeks.setavgweekhours},
         { title: "heures libres<br/>après trav",field: "freehoursafter",hozAlign:"center",formatter:freetimeFormatter,headerSort: false},
         { title: "pointages",field:"trackedtime",hozAlign:"center",formatter:timetrackFormatter,headerSort: false}
       ]
@@ -130,13 +131,23 @@ let staffperiodweeks = {
       //console.log({ "get":  "perioddays","schemata":schemata,"id_staff":selrp[0].id_staff,"date_start":weekmonstart,"date_end":weeksunend});
       postData("db.cgi",{ "get":  "perioddays","schemata":schemata,"id_staff":selrp[0].id_staff,"date_start":weekmonstart,"date_end":weeksunend}).then(data => {
         //console.log("perioddays",data);
-        if (data && data.result.sqldata) { staffperiodweeks.tbl.setData(data.result.sqldata);}
+        if (data && data.result.sqldata) { 
+          staffperiodweeks.tbl.setData(data.result.sqldata).then(dd => {
+            //console.log("selected",staffperiodweeks.selectedrow);
+            if (staffperiodweeks.selectedid){
+              staffperiodweeks.tbl.selectRow(staffperiodweeks.selectedid);
+              staffperiodweeks.tbl.scrollToRow(staffperiodweeks.selectedid, "center", false);
+            }
+          });
+          
+        }
       });
     })
     
     
   },
   loadplan: function(parenttbl){
+    staffperiodweeks.selectedrow = null;
     staffperiodweeks.parenttbl = parenttbl;
     let selrp = staffperiodweeks.parenttbl.getSelectedData();
     //console.log("weekplan",selrp);
@@ -189,8 +200,9 @@ let staffperiodweeks = {
     dataform.cleanform2("staffreportperioddays",staffperiodweeks.choices);
    let cday = staffperiodweeks.tbl.getSelectedData();
     staffperiodweeks.dayrefdata =null;
-
+    
     if (cday[0]){
+      staffperiodweeks.selectedid = cday[0].id;
       staffperiodweeks.disablesave = false;
       document.getElementById("staffreportperioddays_errmsg").innerHTML = '';
       staffperiodweeks.currentday = cday[0];
@@ -471,6 +483,7 @@ let staffperiodweeks = {
     let sel = staffperiodweeks.tbl.getSelectedData();
     let selrp = staffperiodweeks.parenttbl.getSelectedData();
     if (sel.length > 0){
+      staffperiodweeks.selectedid = sel[0].id;
       asel = [];
       for (s=0;s<sel.length;s++){
         asel.push(sel[s].id);
@@ -484,6 +497,7 @@ let staffperiodweeks = {
     //console.log("clean row");
     //console.log(sel);
     if (sel.length > 0){
+      staffperiodweeks.selectedid = sel[0].id;
       asel = [];
       for (s=0;s<sel.length;s++){
         asel.push(sel[s].id);
@@ -504,6 +518,8 @@ let staffperiodweeks = {
   replacedays: function(){
     let sel = staffperiodweeks.tbl.getSelectedData();
     let selrp = staffperiodweeks.parenttbl.getSelectedData();
+    if (sel.length > 0){
+      staffperiodweeks.selectedid = sel[0].id;
     let id_workplan = staffperiodweeks.choices["id_workplan"].selected();
     let keepvac = document.getElementById("keepvacancy").checked;
     let keeprec = document.getElementById("keeprecuperation").checked;
@@ -518,6 +534,7 @@ let staffperiodweeks = {
       document.getElementById('dlg_replacestaffdayworkplan').style.display='none';
       staffperiodweeks.gettbldata();
     }).catch(e => { console.log("ERROR replaceids",e);});
+    }
   },
   savetimetracker: function(){
     let sel = staffperiodweeks.tbl.getSelectedData();
@@ -550,6 +567,7 @@ let staffperiodweeks = {
     let sel = staffperiodweeks.tbl.getSelectedData();
     let selrp = staffperiodweeks.parenttbl.getSelectedData();
     if (sel.length > 0 && sel[0].daydate < staffperiodweeks.today){
+      staffperiodweeks.selectedid = sel[0].id;
       postData("db.cgi",{"get":"gettrackday","schemata":schemata,"id_staff":sel[0].id_staff,"daydate":sel[0].daydate}).then(data => {
         staffperiodweeks.tbltimetracker.setData(data.result.sqldata);
         console.log("data to load",data.result.sqldata);
index e0683fe..5886549 100644 (file)
       <button class="bar-item toolbarbtn right" id="btn_delete_staffcontract" onclick="staffcontract.remove(); return false;"><span class="icon icon-remove text-red" style="font-size: 16px;"></span>supprimer</button>
       <button class="bar-item toolbarbtn  right" onclick="staffcontract.edit(); return false;"><span class="icon icon-edit" style="font-size: 16px;"><br/>éditer</button>
       <button class="bar-item toolbarbtn right"  onclick="staffcontract.add(); return false;"><span class="icon icon-plus" style="font-size: 16px;"><br/>ajouter</button> 
-      <button class="bar-item toolbarbtn right"  onclick="staffcontract.updateStaffContractDays(); return false;"><span class="icon icon-week" style="font-size: 16px;"><br/>valider</button> 
+      <button class="bar-item toolbarbtn right"  onclick="staffcontract.updateStaffContractDays(); return false;"><span class="icon icon-week" style="font-size: 16px;"><br/>actualiser périodes</button> 
       </div>
      
         <div id="tbl_staffcontract" ></div>
index 6964cbd..0cdd166 100644 (file)
@@ -29,7 +29,8 @@ let staffperiods = {
         {title: "décompte<br/>fin POT", field:"hoursdiff",headerSort: false,bottomCalc:staffperiods.periodrestsum},
         {title: "congé suppl.<br/>+44 h", field:"suppvacancy44hours",headerSort: false},
         {title: "congé suppl.<br/>trav dim.", field:"suppvacancysunwork",headerSort: false},
-        {title: "jours<br/>ouvrables", field:"maxdays",headerSort: false}
+        {title: "jours<br/>ouvrables", field:"maxdays",headerSort: false},
+        {title: "moy.<br/>hebd.", field:"avgtotalweekhours",headerSort: false}
           ]
     });
   },