We divided the process in "filter selected" <> "data sources" <> "data objects" <> "the reporting logic" <> "view decorators"
With that architecture the Business logic that correspond of simple queries to the "data objects" asking things like "does this activity have grades?" if so, has it been graded on the expected date?
And after this Business Logic execution, we generate rich reports that include not only the numeric data but also give more information like painting the cell red if it the grade was graded several days after the expected date and so on.