This is actually quite easy to do.
If you want for example to aggregate the positions by date you can do it like this (really only one line per task should work the same way but instead of date you should pick the line id):
In your OpenERP addons folder search for the hr_timesheet_invoice addon. Open its hr_timesheet_invoice.py.
Search for:
cr.execute("""SELECT product_id, user_id, to_invoice, sum(amount), sum(unit_amount), product_uom_id
Replace it with:
cr.execute("""SELECT product_id, user_id, to_invoice, sum(amount), sum(unit_amount), product_uom_id, date
Search for:
GROUP BY product_id, user_id, to_invoice, product_uom_id""", (account.id, tuple(ids), journal_type))
Replace it with:
GROUP BY product_id, user_id, to_invoice, product_uom_id, date""", (account.id, tuple(ids), journal_type))
Search for:
for product_id, user_id, factor_id, total_price, qty, uom in cr.fetchall():
Replace it with:
for product_id, user_id, factor_id, total_price, qty, uom, date in cr.fetchall():
Search for:
cr.execute("SELECT * FROM account_analytic_line WHERE account_id = %s and id IN %s AND product_id=%s and to_invoice=%s ORDER BY account_analytic_line.date", (account.id, tuple(ids), product_id, factor_id))
Replace it with:
cr.execute("SELECT * FROM account_analytic_line WHERE account_id = %s and id IN %s AND product_id=%s and to_invoice=%s and date=%s ORDER BY account_analytic_line.date", (account.id, tuple(ids), product_id, factor_id, date))
That should work also I haven't it tested it very long.
To do it properly I guess you should create a custom module with the modified hr_timesheet_invoice.py which overwrites the original rather than directly modifing the original itself (as it will get overwritten at the next update) but I'm very new to OpenERP and haven't looked into the module structure yet... I guess I'll delay it until I have to update my version.