I am customizing the attendance model and made a wizard that displays a table with an overview of worktime, begin, end and overtime.
Fields worktime, begin, end and overtime are all fields.Float()
I am using widget='float_time' to display them in the form view of the model.
I wanted to create a report of that overview that is displayed as qweb-html and can be printed if necessary.
I created an xml template and used
It seemed to work because the end field was printed like 18:21.
I compared the form view and the qweb view and discovered that the values are different.
Some values are just one minute below or above the form view value (ok the rounding seems to work differently) but others are completely nonsense.
Especially the field overtime differs a lot.
Form view: -06:40 qweb: -07:19
the correct value that I calculated by hand is -06:40 meaning a float value of -6.66666
Question 1) Where is the calculation difference ? What function is used by the form view and what function is used by the qweb view ?
I only found /web/static/src/js/fields/field_utils.js where there is a formatFloatTime() and a parseFloatTime() function.
Question 2) Why are the qweb values sometimes completely wrong?
Yes, I made sure that the field values are completely identical. I even displayed the float values in the qweb report and could validate that they are correct. It is "only" a formatting issue.
test
I finally found the answer and if somebody comes across this ...here you are ...
There are indeed two places where conversion is made:
#####################################################
Form view: Javascript method in /web/static/src/js/fields/field_utils.js
#####################################################
function formatFloatTime(value) {
var pattern = '%02d:%02d';
if (value < 0) {
value = Math.abs(value);
pattern = '-' + pattern;
}
var hour = Math.floor(value);
var min = Math.round((value % 1) * 60);
if (min === 60){
min = 0;
hour = hour + 1;
}
return _.str.sprintf(pattern, hour, min);
###########################
QWeb view:
In module base/ir/ir_qweb/fields.py
###########################
class FloatTimeConverter(models.AbstractModel):
""" ``float_time`` converter, to display integral or fractional values as
human-readable time spans (e.g. 1.5 as "01:30").
Can be used on any numerical field.
"""
_name = 'ir.qweb.field.float_time'
_inherit = 'ir.qweb.field'
@api.model
def value_to_html(self, value, options):
hours, minutes = divmod(value * 60, 60)
return '%02d:%02d' % (hours, minutes)
It seems that Math.round and Math.floor behaves differently compared to python divmod function. At least I had huge differences.