Subcontracting in Project Operations Lite – Part II

Tested on Project Operations on Dataverse version

In part I we looked at the basic concepts of subcontracting and how subcontracts are created. In this post, we’ll look at contract worker resource management so that we’ll learn how contract workers are booked to a project as subcontractors. The entire booking process isn’t very different from how user-based bookable resources are managed in Dynamics 365 Project Operations.

Subcontracting generic resources

Let’s start by looking at a project that we want to use subcontractors on. Remember that on the date of this blog post, only quantity-based subcontracting is possible. As covered in part I, it means that a quantity purchased on a subcontract line can be used on any project. When it comes to managing resources, generic resources can be added to a project either directly from the Team tab or by assigning a generic resource to a project task.

When a generic resource is being added, pay attention to the following:

  • When using vendor resources, Worker Type needs to be Contract Worker.
  • The subcontract used must have a status of Draft or Confirmed.
  • Only subcontract lines for time can be selected.
  • The Role of the generic resource must match the Role defined on the related subcontract line.
  • Based on my tests, adding a Resourcing Unit for project team members that are contract workers seems to be irrelevant when it comes to cost prices. Price estimates for cost on a project display correct prices even when a Resourcing Unit is set for a contract worker despite the related Bookable Resource row not having an Organizational Unit defined. For sales prices, the sales price defaults to what is set on a related project contract’s price list as dimensions for the combination of role and organizational unit.
Image 1. Assigning a generic vendor resource on a task.

Subcontracting named resources

In part I we created a subcontract with a T&M subcontract line. We also added a vendor contact as the subcontract line resource. Let’s look at different ways of staffing that vendor contact to a project as a contract worker.

Task assignments for named resources

When a named contract worker is assigned to a project task, they aren’t automatically related to a subcontract. Assignments only place a bookable resource to a task and that’s all. A named resource has to be associated with a subcontract and a subcontract line in order to get the correct subcontract-related cost prices on a project’s estimates. Sales prices are drawn from a related project contract’s price list just like they are for generic contract workers.

Image 2. Assigning a named resource to a task and the resulting subcontract validity status.

A resource is associated with a subcontract and a subcontract line by selecting the resource in the Team tab’s grid and by choosing Subcontracting Options. When a resource only has assignments and no bookings, its assigned capacity is not drawn down on the related subcontract line’s Booked Capacity (msdyn_bookedcapacity) column. According to a support request I had open, this is a known defect that will get a fix at some point.

Image 3. Subcontracting options.

Bookings for named resources

Booking named contract workers works exactly in the same way as booking named, user-based internal resources:

  • Add a generic contract worker resource to a project team.
  • Create a resource requirement.
  • Look for available resources with the schedule assistant.
  • Book a named contract worker.

Before booking named resources, the schedule board needs to be configured for subcontracting. Follow these steps on docs to get the schedule board configured. Note that when generic resources are created the resourcing unit column might automatically populate with a value. Unless you have specifically defined contract workers to be part of an organizational unit, you might need to clear the resourcing unit value before creating a resource request.

When creating a resource requirement and using the schedule assistant to book a named contract worker to your project team, make sure the schedule assistant’s search query is populated with relevant information for your specific scenario. It’s easy to overlook specifics here so compare the resource requirement you created with the query that you get in the schedule assistant to fine-tune your scheduling process.

Image 4. Using the schedule assistant to book a name contract worker.

When a named resource is booked, verify the value in the Subcontract Validy column on the newly created Project Team Member. In all my tests, booking a named contract worker to replace a generic one never resulted in the Subcontract Validity column having a value of Valid. I always had to manually associate a booked contract worker with my subcontract and subcontract line of choice by clicking on Subcontracting Options in the team member grid. This is another defect in subcontracting, which is going to be addressed at some point (example of expected behavior can be found on docs).

When a named contract worker is booked against a subcontract and subcontract line, the Booked Capacity column on the subcontract line is updated with the amount of hours the resource was booked for. Note that deleting the resource from the project team or deleting the related Bookable Resource Bookings do NOT reduce the Booked Capacity column! This is the third defect I found in subcontracting and it is also pending a fix.

Image 5. Bookings are reflected on the related subcontract line.

Subcontractor time entries

Time entries for subcontractors work exactly the same was as for internal users. Subcontractors need to be licensed for D365 Project Operations with at least a Team Member license so that they can acesss the Project Operations Team Member model-driven application. It’s also possible to create time entries on behalf of another user by using the Bookable Resource column on the time entry quick create form. This is still the only way to delegate time entries as PSA V2 style delegation was deprecated all the way back in V3.

When creating time entries on behalf of a resource, make sure all relevant details such as bookable resource, project, project task, role, subcontract and subcontract line are available to you as a delegate. Especially role easily defaults to whatever role you as a delegate have on a project so it’s easy to accidentally create time entries with incorrect details.

Image 6. Creating subcontractor time entries.

Approving time entries should already be familiar to you so I’m not describing that part of the process in this post. After time entries are approved, Unbilled Sales and Cost Actuals are created. The sales price is drawn from the related project contract and the cost price from the related subcontract. The calculated column Time Reported (msdyn_timereportedv2) on the related subcontract line can be refreshed to display the amount of approved subcontractor time entries.

Image 7. Time reported on a subcontract line.


This is a list of findings that I encountered planning contract worker resources:

  • Resource assignments don’t impact Booked Capacity on a subcontract line.
  • Subcontract validity isn’t updated when booking a named contract worker over a generic.
  • Removing a named contract worker from a project team doesn’t impact Booked Capacity on the related subcotract line.
  • Quantity Ordered on a subcontract line is purely nice to know. There is no automation or enforcement tied to it.
  • Booking or assigning a contract worker beyond the Start Date/End Date found on a subcontract line’s subcontract line resource produces no warnings.
  • Effort found on a subcontract line’s subcontract line resource is purely nice to know. There is no automation or enforcement tied to it.
All my blog posts reflect my personal opinions and findings unless otherwise stated.