mirror of
https://github.com/Dolibarr/dolibarr.git
synced 2025-12-06 17:48:25 +01:00
In some cases, calculation of nbextradays in total is wrong, because the extra hours accumulated by the current task minutes are not considered.
318 lines
11 KiB
JavaScript
318 lines
11 KiB
JavaScript
/* Copyright (C) 2014 delcroip <delcroip@gmail.com>
|
|
* Copyright (C) 2015-2017 Laurent Destailleur <eldy@users.sourceforge.net>
|
|
* Copyright (C) 2021-2024 Josep Lluís Amador <joseplluis@lliuretic.cat>
|
|
*
|
|
* This program is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
|
|
/* Parse en input data for time entry into timesheet */
|
|
function regexEvent(objet,evt,type)
|
|
{
|
|
console.log('regexEvent type='+type);
|
|
switch(type)
|
|
{
|
|
case 'days':
|
|
var regex= /^[0-9]{1}([.,]{1}[0-9]{1})?$/;
|
|
|
|
if(regex.test(objet.value) )
|
|
{
|
|
var tmp=objet.value.replace(',','.');
|
|
if(tmp<=1.5){
|
|
var tmpint=parseInt(tmp);
|
|
if(tmp-tmpint>=0.5){
|
|
objet.value= tmpint+0.5;
|
|
}else{
|
|
objet.value= tmpint;
|
|
}
|
|
}else{
|
|
objet.value= '1.5';
|
|
}
|
|
}else{
|
|
objet.value= '0';
|
|
}
|
|
break;
|
|
case 'hours':
|
|
var regex= /^[0-9]{1,2}:[0-9]{2}$/;
|
|
var regex2=/^[0-9]{1,2}$/;
|
|
var regex3= /^[0-9]{1}([.,]{1}[0-9]{1,2})?$/;
|
|
if(!regex.test(objet.value))
|
|
{
|
|
if(regex2.test(objet.value))
|
|
objet.value=objet.value+':00';
|
|
else if(regex3.test(objet.value)) {
|
|
var tmp=parseFloat(objet.value.replace(',','.'));
|
|
var rnd=Math.trunc(tmp);
|
|
objet.value=rnd+':'+ Math.round(60*(tmp-rnd));
|
|
} else
|
|
objet.value='';
|
|
}
|
|
/* alert(jQuery("#"+id).val()); */
|
|
break;
|
|
case 'timeChar':
|
|
//var regex= /^[0-9:]{1}$/;
|
|
//alert(event.charCode);
|
|
var charCode = (evt.which) ? evt.which : evt.keyCode;
|
|
|
|
if(((charCode >= 48) && (charCode <= 57)) || //num
|
|
(charCode===46) || (charCode===8)||// comma & periode
|
|
(charCode === 58) || (charCode==44) )// : & all charcode
|
|
{
|
|
// ((charCode>=96) && (charCode<=105)) || //numpad
|
|
return true;
|
|
|
|
} else {
|
|
return false;
|
|
}
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
function pad(n) {
|
|
return (n < 10) ? ("0" + n) : n;
|
|
}
|
|
|
|
|
|
|
|
/* function from http://www.timlabonne.com/2013/07/parsing-a-time-string-with-javascript/ */
|
|
/* timeStr must be a duration with format XX:YY (AM/PM not supported) */
|
|
/* return: nbofextradays (0, 1, ...) */
|
|
function parseTime(timeStr, dt)
|
|
{
|
|
if (!dt) {
|
|
dt = new Date();
|
|
}
|
|
|
|
//var time = timeStr.match(/(\d+)(?::(\d\d))?\s*(p?)/i);
|
|
var time = timeStr.match(/(\d+)(?::(\d\d))?/i);
|
|
if (!time) {
|
|
return -1;
|
|
}
|
|
var hours = parseInt(time[1], 10);
|
|
dt.setHours(hours);
|
|
dt.setMinutes(parseInt(time[2], 10) || 0);
|
|
dt.setSeconds(0, 0);
|
|
//console.log("hours="+hours+" => return nbofextradays="+Math.floor(hours / 24)+" hours="+dt.getHours());
|
|
return Math.floor(hours / 24);
|
|
}
|
|
|
|
/* Update total. days = column nb starting from 0 */
|
|
function updateTotal(days,mode)
|
|
{
|
|
console.log('updateTotal days='+days+' mode='+mode);
|
|
if (mode=="hours")
|
|
{
|
|
var total = new Date(0);
|
|
total.setHours(0);
|
|
total.setMinutes(0);
|
|
var nbline = document.getElementById('numberOfLines').value;
|
|
var startline = 0;
|
|
if (document.getElementById('numberOfFirstLine')) {
|
|
startline = parseInt(document.getElementById('numberOfFirstLine').value);
|
|
}
|
|
var nbextradays = 0;
|
|
for (var i=-1; i < nbline; i++)
|
|
{
|
|
/* get value into timespent cell */
|
|
|
|
var id='timespent['+i+']['+days+']';
|
|
var taskTime = new Date(0);
|
|
var element = document.getElementById(id);
|
|
if (element)
|
|
{
|
|
/* alert(element.value);*/
|
|
if (element.value)
|
|
{
|
|
result=parseTime(element.value,taskTime);
|
|
}
|
|
else
|
|
{
|
|
result=parseTime(element.innerHTML,taskTime);
|
|
}
|
|
if (result >= 0)
|
|
{
|
|
nbextrahour = Math.floor((total.getMinutes()+taskTime.getMinutes()) / 60);
|
|
nbextradays = nbextradays + Math.floor((total.getHours()+taskTime.getHours() + nbextrahour + result*24) / 24);
|
|
//console.log("i="+i+" result="+result);
|
|
total.setHours(total.getHours()+taskTime.getHours());
|
|
total.setMinutes(total.getMinutes()+taskTime.getMinutes());
|
|
//console.log("i="+i+" nbextradays cumul="+nbextradays+" h="+total.getHours()+" "+taskTime.getHours());
|
|
}
|
|
}
|
|
|
|
/* get value into timeadded cell */
|
|
|
|
var id='timeadded['+i+']['+days+']';
|
|
var taskTime= new Date(0);
|
|
var element=document.getElementById(id);
|
|
if(element)
|
|
{
|
|
/* alert(element.value);*/
|
|
if (element.value)
|
|
{
|
|
result=parseTime(element.value,taskTime);
|
|
}
|
|
else
|
|
{
|
|
result=parseTime(element.innerHTML,taskTime);
|
|
}
|
|
if (result >= 0)
|
|
{
|
|
nbextrahour = Math.floor((total.getMinutes()+taskTime.getMinutes()) / 60);
|
|
nbextradays = nbextradays + Math.floor((total.getHours()+taskTime.getHours() + nbextrahour + result*24) / 24);
|
|
//console.log("i="+i+" result="+result);
|
|
total.setHours(total.getHours()+taskTime.getHours());
|
|
total.setMinutes(total.getMinutes()+taskTime.getMinutes());
|
|
//console.log("i="+i+" nbextradays cumul="+nbextradays+" h="+total.getHours()+" "+taskTime.getHours());
|
|
}
|
|
}
|
|
}
|
|
|
|
// Add data on the perday view
|
|
jQuery('.inputhour').each(function( index ) {
|
|
if (this.value)
|
|
{
|
|
var taskTime= new Date(0);
|
|
/*console.log(total.getHours())
|
|
console.log(this.value)
|
|
alert(element.value);*/
|
|
if (this.value)
|
|
{
|
|
console.log(this.value+':00')
|
|
result=parseTime(this.value+':00',taskTime);
|
|
}
|
|
else
|
|
{
|
|
result=parseTime(this.innerHTML+':00',taskTime);
|
|
}
|
|
if (result >= 0)
|
|
{
|
|
total.setHours(total.getHours()+taskTime.getHours());
|
|
}
|
|
console.log(total.getHours())
|
|
}
|
|
});
|
|
// Add data on the perday view
|
|
jQuery('.inputminute').each(function( index ) {
|
|
if (this.value)
|
|
{
|
|
var taskTime= new Date(0);
|
|
/* console.log(total.getHours())
|
|
console.log(this.value)
|
|
alert(element.value);*/
|
|
if (this.value)
|
|
{
|
|
console.log('00:'+this.value)
|
|
result=parseTime('00:'+"00".substring(0, 2 - this.value.length) + this.value,taskTime);
|
|
}
|
|
else
|
|
{
|
|
result=parseTime('00:'+"00".substring(0, 2 - this.innerHTML) + this.innerHTML,taskTime);
|
|
}
|
|
if (result >= 0)
|
|
{
|
|
total.setMinutes(total.getMinutes()+taskTime.getMinutes());
|
|
}
|
|
console.log(total.getMinutes())
|
|
}
|
|
});
|
|
|
|
var stringdays = days;
|
|
if (startline >= 1 && startline <= 9 && stringdays < 10) {
|
|
stringdays = '0'+stringdays;
|
|
}
|
|
|
|
/* Output total in top of column */
|
|
|
|
if (total.getHours() || total.getMinutes()) jQuery('.totalDay'+stringdays).addClass("bold");
|
|
else jQuery('.totalDay'+stringdays).removeClass("bold");
|
|
var texttoshow = pad(nbextradays * 24 + total.getHours())+':'+pad(total.getMinutes());
|
|
jQuery('.totalDay'+stringdays).text(texttoshow);
|
|
|
|
/* Output total of all total */
|
|
|
|
var totalhour = 0;
|
|
var totalmin = 0;
|
|
for (var i=0; i<7; i++)
|
|
{
|
|
stringdays = (i + startline);
|
|
if (startline >= 1 && startline <= 9 && stringdays < 10) {
|
|
stringdays = '0'+stringdays;
|
|
}
|
|
|
|
var taskTime= new Date(0);
|
|
result=parseTime(jQuery('.totalDay'+stringdays).text(),taskTime);
|
|
if (result >= 0)
|
|
{
|
|
totalhour = totalhour + taskTime.getHours() + result*24;
|
|
totalmin = totalmin + taskTime.getMinutes();
|
|
}
|
|
}
|
|
morehours = Math.floor(totalmin / 60);
|
|
totalmin = totalmin % 60;
|
|
jQuery('.totalDayAll').text(pad(morehours + totalhour)+':'+pad(totalmin));
|
|
}
|
|
else
|
|
{
|
|
var total =0;
|
|
var nbline = document.getElementById('numberOfLines').value;
|
|
for (var i=-1; i<nbline; i++)
|
|
{
|
|
var id='timespent['+i+']['+days+']';
|
|
var taskTime= new Date(0);
|
|
var element=document.getElementById(id);
|
|
if(element)
|
|
{
|
|
if (element.value)
|
|
{
|
|
total+=parseInt(element.value);
|
|
|
|
}
|
|
else
|
|
{
|
|
total+=parseInt(element.innerHTML);
|
|
}
|
|
}
|
|
|
|
var id='timeadded['+i+']['+days+']';
|
|
var taskTime= new Date(0);
|
|
var element=document.getElementById(id);
|
|
if(element)
|
|
{
|
|
if (element.value)
|
|
{
|
|
total+=parseInt(element.value);
|
|
|
|
}
|
|
else
|
|
{
|
|
total+=parseInt(element.innerHTML);
|
|
}
|
|
}
|
|
}
|
|
|
|
var stringdays = days;
|
|
if (startline >= 1 && startline <= 9 && stringdays < 10) {
|
|
stringdays = '0'+stringdays;
|
|
console.log(stringdays);
|
|
}
|
|
|
|
if (total) jQuery('.totalDay'+stringdays).addClass("bold");
|
|
else jQuery('.totalDay'+stringdays).removeClass("bold");
|
|
jQuery('.totalDay'+stringdays).text(total);
|
|
}
|
|
}
|