• I would be looking to further separate the entities:

    Work done (agent, Project, activity type) is separate from the work value (agent, activity type, rate, rate_start, rate_end)

    If the rate for an activity can depend on the project type (e.g. commerical, public sector, charity) or project status (e.g. better rate for overtime, lower rate if project is in rework overruns) then I would also be looking to separate the rate card from the activity type

    Project (project ID, Project Type)

    work done (agent, projectID, activity type)

    RateCard (project Type, Activity type, Rate Code)

    work value (agent, projectID, ratecard)

    Rate (ratecard, rate, rate_start, rate_end)

    This makes the joins even more complicated but provides greater flexibility, even if you don't need it just yet.