Tested on:
Dynamics 365 CE version 9.1, PSA solution version 3.3, Unified Interface
Actuals are records that hold financial data about approved Time and Expense Entries, Milestones and Materials in Dynamics 365 Project Service Automation. Actuals are primarily created in the context of Sales (revenue) and Cost for Projects and Project Contracts, and are in most cases passed on to a financial system / ERP for invoicing and the general ledger.
By design, Actuals can not be deleted as deleting them can lead to major repercussions in both PSA and in a financial system/ERP. What can we do when we need to get rid of Actuals that hold incorrect financial data? Or what if we have test data in PSA that we want to get rid of? Before we dive deeper into reversing, canceling and deleting Actuals, be sure to read this post by Microsoft about Actuals.
Reversing Actuals with Journals
The preferred method of reversing Actuals is by using Journals. A common situation where Actuals need to be reversed is an incorrect Time Entry approval. Using Journals doesn’t delete existing Actuals so dependencies to Projects and Project Contracts will remain. You can find more information about using Journals on my previous blog post here.
Canceling Actuals
In some cases Actuals may need to be canceled without creating reversals. An example could be double Actuals created by either concurrent Batch Jobs in older PSA versions or double Billed Sales Actuals due to concurrent Invoice confirmation. In these cases you may want to set an Actual’s Billing status to either Canceled or Customer Invoice Posted, depending on your specific scenario. Canceling Actuals doesn’t delete existing Actuals so dependencies to Projects and Project Contracts will remain.
In normal business scenarios such as when incorrect Time Entries have been approved, using Journals is preferred. Canceling Actuals is an approach that is usually taken in unexpected scenarios. For me these scenarios have always included an open Support Request and a Microsoft Support Engineer.
Deleting Actuals
Actuals form the financial data that PSA creates. As such, Actuals are sacred and deleting them should always be your last resort. In production use, you shouldn’t face situations where Actuals would need to be deleted. Either reversing them with Journals or canceling them should suffice in both daily business operations as well as in unexpected scenarios.
If your environment is based on a trial with demo data installed, you may have existing Actuals, Projects and Project Contracts that you want to get rid of. In such cases deleting Actuals can be a faster approach than resetting your instance and reconfiguring PSA. Deleting Actuals lets you delete Projects and Project Contracts when all dependencies are torn down.
Let’s go through the process of deleting Actuals.
1. Deactivate the plug-in PreOperationmsdyn_actualDelete
Look for the following information under Sdk Message Processing Steps:
Name
Project Service – Delete of msdyn_actual
Event Handler
Microsoft.Dynamics.ProjectService.Plugins.PreOperationmsdyn_actualDelete
Deactivating this plug-in allows you to delete Actuals. Remember to reactivate it after all necessary Actuals are deleted.
2. Run a Bulk Deletion job to delete Actuals
As the ribbon on the Actuals entity no longer has a Delete button, we have to run a Bulk Deletion job to delete the Actuals that we want to get rid of. Be careful not to accidentially remove incorrect Actuals! Below are two images of a Bulk Deletion job I made against a demo Time Entry. Both Cost and Unbilled Sales Actuals are removed. Remember that you will also have Time Entries, Project Approvals and Journal Lines related to your Actuals. In this example I have removed Actuals and Journal Lines and have left Time Entries and Project Approvals untouched.
I hope this blog post helps you resolve situations where incorrect and unnecessary Actuals are formed in PSA. Remember that deleting Actuals should always be your last resort and that it is not a recommended approach!
Disclaimer:
All my blog posts reflect my personal opinions and findings unless otherwise stated.
Hi Antti. Thank you for your extreme post! 🙂
JFYI – I had to deactivate Delete SDK message for Time Entry too (ver.9.0 – PreValidateTimeEntryDelete).
Message for Actuals has the “Delete of msdyn_actual” name in ver.9.0.
Thanks Roman and thanks for sharing the info about PreValidateTimeEntryDelete.