Dynamics 365: Migrating fixed price projects and WIP balances

Dynamics 365: Migrating fixed price projects and WIP balances

To import a fixed-price project in Dynamics 365 for Finance, you need up to 14 different entities and more, and 18-20 steps, sometimes manual and time consuming.

Before importing, make sure that the employees have been declared as bookable resources in the company. If not, use the entities “Project scheduling resource” (ResResourceDataEntity) and “Project scheduling resource details” (ResResourceSetupDataEntity). See also AX7 Table Browser and Class Runner | Microsoft Learn for more information on the ResResourceIdentifier table.

Project contract and funding sources

Next, import the project master table in the following order:

  • Project contract (ProjContractEntity)
  • Project funding source (ProjFundingSourceEntity, the link between the customer and the project contract)
  • Project funding rule (ProjFundingRuleEntity, the link between the [multiple] customers and sources, and the project; typically, there is just one record with 100% allocation of the funds of just one customer to the whole project = project contract)
  • Projects (ProjectEntity, parent projects first)

Next, deal with the open (unbilled) on-account transactions (a.k.a. instalments in CRM Project operations, a.k.a. billing milestones). There is no entity to export these, and no entity to import. The easiest is to extract the billing milestones to Excel, then open the form Project management and accounting > Enquiries and reports > Transactions inquiries > On-account, tailor the Excel sheet to match exactly the order of columns in the grid, then paste all milestones and hit Save, see also How to copy data from Excel into D365. The financial dimensions and VAT groups are inherited from the project master.

By the way, the billed milestones i.e. the on-account transactions in the Fully invoiced status are imported with the Beginning balance journal, see below.

Work breakdown structures

Project Work Breakdown Structures (WBS) are often used to slice the project scope into phases and tasks. Dynamics is currently only able to import draft WBS’ through the entities 

  • Project work breakdown structure – Draft (ProjProjectWBSDraftEntity, these are the projects tasks) and 
  • Project work breakdown structure – Draft estimates” (ProjWBSActivityEstimatesEntity, number of hours per task).

To export a WBS, the current WBS must be turned into a draft with the Edit button first; this is a manual work with 3 mouse clicks per project: select a project, open its WBS, click Edit.

Conversely, upon the migration of the draft WBS’es these must be activated manually with 4 clicks: select a project, open the WBS, click Publish, confirm with OK.

Project cost budgets

Importing the Project budget is a somewhat similar job, with even more manual interventions. There is no entity for the project budget, but project forecasts may be used as a primer. First, prepare a set of 3 forecast files, all with the same forecast model ModelID:

  • Project hour forecasts (ProjForecastEmplEntity by category, the employee ID is negligible)
  • Project expense forecasts (ProjForecastCostEntity, by category) 
  • Project item forecasts (ProjForecastSalesEntity by category; the item number may be omitted, populate the item allocation key ItemAllocateID instead).

Import the forecasts, then initiate the budgets project by project, this is a manual time-consuming operation with 7 clicks per project: select a project, click Project budget, choose Import, confirm with OK, then send the resulting budget into an automated Workflow (the project budget workflow must exist), close the form, repeat.

Historical project transactions

Finally, to migrate started, already running fixed-fee projects, you must import all historical project transactions. They are used to either build up the WIP balance of the project, or for the revenue recognition, or both. The historical project transactions are imported through the Beginning balances journals:

  • Project journal lines for on account beginning balances (ProjBeginningBalanceOnAccEntity) for the billed on-account milestones. The grand total of billed and unbilled (Chargeable) milestones gives the total contract value of the fixed-price project.
  • Project journal lines for cost/sale beginning balances (ProjBeginningBalanceCostSaleEntity) of 3 kinds: hour, expense, item [consumption].

The 3rd entity of this class, called “Project journal lines for fee beginning balances” (ProjBeginningBalanceFeeEntity) is rarely used, because the accrued revenue may be caught up differently.

The target project must be in the In progress stage already. Transactions posted through the beginning balances journal do not affect the general ledger but stay in the project sub-ledger, hence the voucher number in the line is not important. The impact on the P&L and/or balance (for project posted into WIP) only becomes visible after a proper GL balance migration.

To export project transactions of all kinds the entity “Project posted transactions“ (ProjPostTransViewEntity) may be used. Please keep in mind it is a SQL UNION VIEW, and it may skip some transactions under unclear circumstances. To export data from a legacy Dynamics system, consider using the usual Project management and accounting > Enquiries and reports > Transactions inquiries instead.

The minimal set of data for the beginning balances is listed below. Sales prices and amounts are irrelevant in fixed-price projects, and may therefore be omitted:

TRANSACTIONTYPE Cost Hour Item Remark
JOURNALNAME ProjBeg ProjBeg ProjBeg
JOURNALID 149-000020 149-000020 149-000020 A new number makes a new journal head
LINENUMBER 1 2 3 increment the line number
CATEGORYID Hotel PrjMan ItemReq
COSTPRICE 123,45 345,67 567,89
ITEMID R0028055 Not really mandatory for phased out products
DESCRIPTION Trv.exp 238 Kick-off 11th Little pwny Not mandatory
PROJECTDATE 06.11.2024 06.11.2024 06.11.2024
PROJECTID ABC000011 ABC000011 ABC000011
RESOURCE 000_542100 Personnel number, not mandatory
QUANTITY 1 8 1 For items, only the cost price may be imported; when multiplied with the Quantity, a rounding error may occur. Set the quantity to "1" for items and use the Cost amount for the Price
COSTSTATUS Operations Operations Operations "Balance" for projects with WIP, "Operations" for projects with an immediate P&L recognition

Once the beginning balances have been imported and posted, the recognised revenue may be brought up to date. The revenue recognition must be performed in the “Update with beginning balance amounts“ mode: the posting of such a revenue calculation record does not update the general ledger. If manually amended percentages of completion are used, let the revenue recognition run in this mode, then set the Completion method to Manual, enter the voluntary Percentage complete = XX%, hit Calculate, then Post.

Sales and purchase orders

At last, use the entity “Project item requirements” (ProjSalesItemRequirementEntity) to import open (not delivered) Item requirements (also known as a “project BOM”). Be aware that you cannot control the Sales order number with this entity, D365 simply draws one Sales ID per project.

The entities

  • Purchase order headers V2 (PurchPurchaseOrderHeaderV2Entity) and
  • Purchase order lines V2 (PurchPurchaseOrderLineV2Entity

are suitable for the project PO import. Keep in mind that open project POs for tangible goods (stocked products) are getting imported as standalone project purchase orders, “self-destructing” upon receipt of the goods; D365 prepares a neutralizing negative inventory transaction. However, if the purchase order was derived from an item requirement, this is going to leave an uncovered demand for items, since a standalone project PO remains “stock neutral”, so to say. When importing SO–backed purchase orders, remove the Project ID from the PO header, then apply a marking to the SO item requirements line (manually). This will allow for PO line consumption through the item requirements.

Good luck!