Subcontracting in Project Operations Lite – Part III

Tested on Project Operations on Dataverse version 4.44.0.22

In part II we looked at managing vendor resources and how they’re booked to projects. This post of the three-part series focuses on vendor invoicing. When vendors send invoices for materials and services they’ve delivered, those invoices need to be matched with costs recorded on related projects. Vendor invoicing is a feature that can be used either with the subcontracting functionality in Dynamics 365 Project Operations or without it, when tracking a subcontracting process in a third-party system. This post focuses on using vendor invoicing with subcontracting in the Lite deployment of Project Operations.

Vendor invoicing in Project Operations

Let’s look at how vendor invoices are created and how approved time and materials related to a subcontract are matched with a vendor invoices. When looking at creating new vendor invoices, we’re presented with two options in ProjOps: A vendor invoice can either be created from the Project Vendor Invoice table in the application or from the context of a subcontract. The nice thing about creating it from a subcontract is that the subcontract in question is automatically referenced on the vendor invoice.

Getting started

The baseline for our scenario follows parts I and II. A subcontracted consultant, Mike Vendor, has submitted time entries for our project. A Surface Laptop 4 has also been allotted to him as part of the project. Mike’s time and and materials consumption has been approved. The project contract (Order) that backs the project has the order lines for T&M and Fixed Price seen in image 1. The first two tasks of the project seen in image 2 are FP tasks, related to the project contract’s FP order line. I’ve highlighted all this information to provide you context on the initial setup and the baseline of the vendor invoicing scenario.

Image 1. Project Contract’s setup.
Image 2. Project Task setup.

The subcontract related to this scenario was covered in part I, but I’ve added an image of the related subcontract lines as the scenario uses T&M subcontract lines for time and materials and a Fixed Price line for time. The subcontract lines related to the scenario can be seen in image 3 below.

Image 3. Related subcontact lines.

The last piece of the baseline data are the Actuals, which have been created when time and the one single material usage log have been approved. By looking at the Actuals we can determine that the following approvals have taken place:

  • Total of 12 h for time entries related to the T&M order line of the project contract.
  • Total of 2 h for time entries related to the Fixed Price order line of the project contract.
  • Total of 1 pcs of materials related to the T&M order line of the project contract.

Image 4 below only displays cost actuals as only those are matched to vendor invoice lines, when performing cost matching.

Image 4. Cost Actuals.

Creating and processing vendor invoices

Now that the baseline for the scenario has been covered let’s look at how vendor invoices are created and processed. As we have a valid subcontracting scenario, I’ve created a vendor invoice from the context of the subcontract in question. The initial state of a new vendor invoice is draft. Docs has more on vendor invoice state transitions. I recommend checking it out.

The first thing that I recommend doing is checking that all relevant Vendor Invoice Lines have been created on the new vendor invoice. In this example, a vendor invoice line is created for time, materials, and milestone. Expenses were not used in this example. The reason vendor invoice lines should be checked right away is because it’s easy to overlook Fixed Price based scenarios. If a subcontract line milestone on a FP subcontract line hasn’t been set to Ready to invoice, a related vendor invoice line won’t be created. Docs states that:

Each line on the subcontract that has a Time and material billing method will cause a line to be created on the vendor invoice. Each line on the subcontract that has a Fixed price billing method will cause a line to be created on the vendor invoice for every subcontract line milestone that has a status of Ready to invoice.

It’s also important to check the created vendor invoice lines because there might be vendor invoice lines that you don’t want to match actuals for. In this example, I’m only going to match actuals for the time-based (Transaction Classification = Time) vendor invoice line seen in image 5 below. For the sake of example, the vendor will invoice the contents of the other vendor invoice lines at a later date. This means that I have to remove the unnecessary vendor invoice lines for materials and milestones from the project vendor invoice.

Image 5. Project Vendor Invoice Lines.

Matching Cost Actuals

Let’s look at how cost actuals are matched for the vendor invoice line for time. There are a couple of important gotchas when starting the matching process. When clicking on a Project Vendor Invoice Line (such as the time-based line in this example), you land on the Project Vendor Invoice Line row’s main form. This is where ambiguity kicks in at least in version 4.44.0.22 of the Lite deployment:

  • The lookup to Project has a null value by default. This needs to have a value of the project that the cost actuals are related to. The value must be set before matching cost actuals. Otherwise, the Project Contract ID and Project Contract Line lookups won’t populate with values.
  • The Project Task lookup is visible when the Project lookup has a value. If a project task is to be used, the column has to be populated after choosing a project and before saving the project vendor invoice line row. Otherwise, the project task column will be locked.
  • The Quantity column won’t populate automatically at least for time-based PVILs. The value can be greater than the sum of the actual cost. As I’m writing this post, I have no idea why this is possible. In any case, the value has to be set manually.
  • The value for Bookable Resource is optional.
  • Not setting values for project task and bookable resource will result in actuals without task and bookable resource references, when a project vendor invoice is confirmed. Read on for more about using values for tasks and bookable resources.

In image 6, I’ve added a project to the project vendor invoice line. The quantity column remains null for now.

Image 6. Project Vendor Invoice Line before matching cost actuals. Note that Project has a value set.

In image 7, I’ve observed the sum total of hours, and I’ve matched the cost actuals. After matching, the cost actuals are displayed under the Matched Cost Actuals tab.

Image 7. Unmatched Cost Actuals.

In image 8, I have manually entered the quantity observed in image 7. Project Contract ID and Project Contract Line now have values as cost actuals have been matched, and the project column has a value. The last step is to click on Complete Verification on the command bar to complete the verification process. The value in Verification Status changes to Complete.

Image 8. Project Vendor Invoice Line after matching cost actuals.

As my one and only project vendor invoice line has gone through the cost actual matching and verification process, the project vendor invoice will have a proper value in the Subtotal column seen in image 9, and the project vendor invoice can be confirmed. Note that I’ve opted out of using the business process flow for the project vendor invoice in this example.

Image 9. Project Vendor Invoice after cost actual matching and verification.

When a project vendor invoice is confirmed, cost actuals are affected. Docs states that:

If any cost actuals reference the vendor invoice line as part of the matching process, all cost actuals that are associated with the referenced vendor invoice line are reversed.

The impact on cost actuals in this example can be seen in image 10. As a project task or a bookable resource weren’t set on the project vendor invoice line, the resulting cost actual doesn’t reference a project task or a bookable resource.

Image 10. Reversed Cost Actuals.

Considerations after confirming a Project Vendor Invoice

In our example, cost actuals for 1 h and 11 h were reversed, and a new cost actual for 12 h was created as part of the verification and matching process. What I discovered was that when a new project vendor invoice was created after the confirmed one, the new invoice picked up the time-based project vendor invoice line and displayed the cost actual for 12 h under the Unmatched Cost Actuals tab. As I’m writing this post, I’m unsure if this is WAI or a bug. I can’t understand why I’d want to re-match a cost actual that’s been created as a result of matching its predecessor cost actuals. If you can think of a scenario, be sure to leave a comment!

But I want my new actuals to have project task and bookable resource references…

We just went through matching and verifying cost actuals by processing what we automatically get on a project vendor invoice. The end result was a bit surprising because we actually lost references to project tasks and bookable resources in the new actual that was created to replace the reversed ones. What can we do to keep the references? That’s a good question!

The answer is to create the project vendor invoice lines manually. I’ve added two new project tasks (CR 1 and CR 2), and I’ve submitted and approved time for our subcontractor Mike Vendor. CR 1 has 1 approved hour, and CR 2 has 2 approved hours. I’ve also created a new project vendor invoice from the context of the related subcontract.

Next, I’ve deleted the project vendor invoice lines that get created with the new project vendor invoice. I’ve manually created a new project vendor invoice line for CR 1, as seen in image 11.

Image 11. Creating a Project Vendor Invoice Line manually.

When creating a new project vendor invoice line, the Unmatched Cost Actuals tab will show the cost actuals for both of the new time entries I have approved, and the 12 h cost actual we discussed in the previous considerations chapter. As we only want to match the cost actual for CR 1, the other two will remain unmatched. At this point, it gets even more confusing because we can’t remove any unmatched cost actuals from the subgrid, and despite having a single matched cost actual for CR 1, the Complete Verification command bar button is nowhere to be found. It seems that if there are actuals under the Unmatched Cost Actuals tab, the Verification Status choice column has to be manually set to Complete.

When the process is repeated and a new project vendor invoice line is created for CR 2, it’s time to confirm the new project vendor invoice. Looking at the resulting cost actuals seen in image 12, we got project tasks references to match, but for some reason, the reference to our bookable resource Mike Vendor was lost. Maybe a bug ¯\_(ツ)_/¯

Image 12. Cost Actuals resulting from manually created and confirmed PVILs are missing Bookable Resource references.

Final thoughts

Vendor invoicing ended up being the most time-consuming feature of subcontracting to figure out. As it stands today, the feature leaves several unanswered questions. The fact that there’s data inconsistency between original cost actuals and the ones resulting from matching and verifying cost actuals and then confirming project vendor invoices is a bit worrying.

Disclaimer:
All my blog posts reflect my personal opinions and findings unless otherwise stated.