Tested on Project Operations on Dataverse version 18.104.22.168
The final bits and pieces of subcontracting landed Dynamics 365 Project Operations Lite in April 2022. Subcontracting has been a highly anticipated feature since ProjOps’ preview and it’s also been quite a substantial effort for the product team to roll out. While April 2022 marks the release of the final pieces in subcontracting in ProjOps Lite, the resource/non-stocked (integrated) deployment still has to wait for the feature.
Despite the size of the release, subcon is surprisingly easy to get to grips with. It follows a pattern ProjOps users are familiar with: Create a contract, manage resources, submit and approve time and expense, and create an invoice. While the feature is new, the UX is similar to what we’re used to from the core features of ProjOps.
This blog post will serve as a guide to getting subcon up and running. Docs are a great place to start so before you start fiddling with the feature I suggest you go through its docs pages. This first part of the three-part series will focus on general setup and subcontract management. Part II covers resource management and time entries, and part III will focus on vendor invoices.
Let’s get started by creating a new vendor and a couple of vendor contacts. The Relationship Type of a vendor account can be Vendor or Supplier. Why are contacts needed though? The reason is that Bookable Resources are created based on vendor contacts. They represent the actual subcontractors or Contract Workers as they’re defined in ProjOps. These Contract Workers can be accounts, contacts, or users, and in this example, contacts are used.
Contract Workers can have roles, a location, and work hours just like Employee type Bookable Resources. While a Contract Worker most likely wouldn’t have an Organizational Unit set, roles and work hours play an important role just like they do with non-subcontractor Bookable Resources i.e. employees. For this example, all Contract Workers have been given a default role of Consultant. Their work hours are 9 AM to 5 PM.
Next, a purchase price list is created. It’s easier to create a purchase price list after all Contract Workers have been created if resource-specific pricing is used in addition to role-specific pricing. Priority for pricing dimensions is set under Parameters > Amount-based-pricing dimensions. The context of a vendor price list must be Purchase.
As vendor resources belong to a vendor as opposed to a Resourcing Unit, the Resourcing Unit column doesn’t have a value for any of the role prices. As can be seen from image 4, the msdyn_organizationalunit pricing dimension doesn’t even have a purchase priority set OOTB for amount-based pricing dimensions. If resourcing units are not used for vendors, make sure your other price lists have entries without resourcing units as well! Example:
- The purchase price for a Consultant role on a vendor price list is set without a Resourcing Unit.
- Contract Worker Bookable Resources don’t have an Organization Unit set.
- The sales price list used on a Project Contract must have the sales price for Consultant without a Resourcing Unit. Unbilled Sales Actuals will then pick up a non-zero price for approved Contract Worker time entries with a Consultant role.
To automatically assign a price list to a new subcontract, a purchase price list can be added to a vendor account as an Account Project Price List. This is done by adding a price list in the Project Price Lists subgrid on a vendor account. This is illustrated in image 5.
After all the general setup, new subcontracts can be created. Image 7 below illustrates a simplified version of the subcontracting feature’s data model. I’ve kept it compact so that it’s easy to understand the structure of how subcontracts work. Subcontracts have different states similar to Project Contracts. Their role is quite minimal in subcontracting, so I’ll let you read more about states and state transitions from docs.
Let’s look at the basic information that a subcontract needs. Since an Account Project Price List was created for the demo vendor account Ven-Dor LLC, a Subcontract Price List is automatically added to a new subcontract. The Contracting Unit lookup defines the Contracting Unit that is subcontracting from the vendor. That and the Vendor lookup are two key columns to populate.
With the frame of the subcontract crated, it’s time to look at Subcontract Lines. As I’m writing this post, the only supported line type for a Subcontract Line is quantity-based, with subcontract line details for work-based lines not yet even present in the data model as a placeholder. The UI allows for selecting work-based lines but saving such Subcontract Lines is blocked. Quoting docs, the main difference between the options is:
- When a subcontract line is quantity-based, the quantity being purchased on the subcontract line for time, expense, or material can be used on any project.
- When a subcontract line is work-based, the subcontract line maps to a body of work represented by a node in the project plan. The value of the subcontract line is the sum of all the components that are required to deliver that body of work. These are modeled as subcontract line details and can be a collection of time, expense, or materials. For a work-based subcontract line, the subcontract line is also dedicated to a single project. These types of subcontracts are currently not supported by Project Operations.
When Subcontract Lines are created the available Transaction Classes are:
Billing Method can be set as either Time and Material or Fixed Price. Docs has a descriptive table for the majority of the table’s other columns so instead of explaining them all in this post, I recommend you check out this docs page. What I do want to mention is the Usage Status section, which isn’t described in a lot of detail on docs. There are three columns visible OOTB:
- Quantity Billed. Indicates the quantity billed on the Subcontract Line to date.
- Booked Capacity. Bookable Resource Bookings and Resource Assignments that have been booked on the Subcontract Line to date. As I’m writing this blog post, this column, introduced in version 22.214.171.124, doesn’t correctly calculate capacity. I will update the post as I learn more.
- Time Reported. Approved time entries related to the Subcontract Line to date.
As can be seen in images 9 and 10, both Billing Methods (FP and T&M) display the Subcontract Line Resources tab, while only a FP Subcontract Line will let us set Subcontract Line Milestones. Let’s look at the milestones next, followed by resources. When setting the Subcontract Line Milestones, remember that the sum of the subcontract line milestone amounts should be equal to the value of the subcontract line. The milestones in subcon work a lot like milestones on Fixed Price Order Lines on a Project Contact do.
Let’s look at Subcontract Line Resources next. When a subcontractor knows the resources they’ll provide, Subcontract Line Resources can be used to identify the named resources a vendor is providing. If no specific resources are named then SLR rows don’t need to be created. If a contact or user row exists but a bookable resource row hasn’t yet been created, setting either the Contact or the User lookup and saving the SLR creates a new Bookable Resource row for the contact/user in question.
The Effort column is worth a special mention. Effort from a Subcontract Line Resource doesn’t roll up to a Subcontract Line. Effort can also be greater than or less than Quantity Ordered on a Subcontral Line. When booking resources, no notifications are currently presented if a resource is booked or assigned more work than what the value of Effort on a Subcontract Line Resource is.
We’ve now defined general settings in subcon and we’ve also created our first subcontract. In part II we’ll look at resource management, followed by vendor invoicing in part III.