Don't quite understand your talk of loops etc. but an observation:
Your code is summarised as
if duration < FulldayAllowance
Do A
Else
If duration < halfdayAllowance
Do B
Else
Do C
Assuming FulldayAllowance to be 8 and half day to be 6, that gives us
if duration < 8
Do A
Else
If duration < 6
Do B
Else
Do C
So - if duration is 1 it should Do A (because 1 is less than 8)
If duration is 7.9999 it will still to A because 7.9999 us less than 8
If duration is 8 or higher it will do C
B cannot happen
This is probably not what you want;
So what you (probably) want to do is swap the tests for Full and Half day around, so it tests less than 6 first, then if it's not less than 6 test less than 8, if not less than 8 it does the 'default'