Hey,

I'm trying to deep insert a PSA salesorder with salesorderdetails, orderlinetransactions etc. via WebAPI.

The request errors out because the PSA orderlinetransactions validation plugin is complaining that the lookup to the salesorderdetail is missing.

This is a test request body:

{
    "shipto_freighttermscode": 1,
    "msdyn_psastate": 192350000,
    "name": "Kopie",
    "paymenttermscode": 2,
    "pricingerrorcode": 0,
    "processid": "00000000-0000-0000-0000-000000000000",
    "prioritycode": 1,
    "totaltax": 0,
    "billto_postalcode": "123",
    "od4uc_versandartcode": 513110000,
    "statecode": 0,
    "od4uc_fuerbatchvorsehen": false,
    "od4uc_steuerbetrag": 92.625,
    "totallineitemamount": 487.5,
    "msdyn_ordertype": 192350001,
    "billto_city": "123",
    "msdyn_ContractOrganizationalUnitId@odata.bind": "/msdyn_organizationalunits(a50d05e4-3df7-e811-a95c-000d3ab6dc82)",
    "od4uc_nachbuchungvonlizenzencode": false,
    "od4uc_stornoauftrag": false,
    "od4uc_bereitsverteilterbetrag": 0,
    "od4uc_gesamtbetragbrutto": 580.125,
    "totalamount": 487.5,
    "bms_email_setting": 0,
    "totallineitemdiscountamount": 0,
    "totaldiscountamount": 0,
    "bms_anteil_cs_euro": 0,
    "od4uc_rechnungsadresseueberkontakt": true,
    "totalamountlessfreight": 487.5,
    "customerid_account@odata.bind": "/accounts(c4ce13f1-46ed-ea11-a817-000d3a4ab96a)",
    "msdyn_psastatusreason": 192350000,
    "od4uc_namevertragseinheit": "bms-gruppe",
    "skippricecalculation": 1,
    "statuscode": 1,
    "bms_abweichende_debitoreninformation": false,
    "od4uc_steuersatzcode": 513110002,
    "willcall": false,
    "od4uc_gruppendatenklauselliegtvor": false,
    "pricelevelid@odata.bind": "/pricelevels(9e052aa4-45ed-ea11-a817-000d3a4ab96a)",
    "billto_line1": "123",
    "billto_country": "Japan",
    "order_details": [{
        "od4uc_anteilesageuro": 0,
        "productname": "Test",
        "msdyn_linetype": 690970000,
        "iscopied": true,
        "od4uc_anteilbmstceuro": 0,
        "msdyn_costamount": 0,
        "od4uc_anteilnpoeuro": 0,
        "extendedamount": 0,
        "quantity": 1,
        "bms_anteil_cs_euro": 0,
        "od4uc_hilfsfeldanteilnpoeuroausdetailzeilen": 0,
        "sequencenumber": 2,
        "msdyn_includematerial": false,
        "bms_anteil_digitaler_vertrieb_euro": 0,
        "pricingerrorcode": 0,
        "salesorderdetailname": "Test",
        "msdyn_includefee": true,
        "od4uc_ordertype": 192350001,
        "msdyn_includetime": false,
        "shipto_freighttermscode": 1,
        "ispriceoverridden": true,
        "od4uc_anteilnpoeuroausdetailzeilen": 0,
        "od4uc_anteilbmsodeuro": 0,
        "tax": 0,
        "od4uc_anteilbmsmmmeuro": 0,
        "skippricecalculation": 0,
        "volumediscountamount": 0,
        "msdyn_billingmethod": 192350001,
        "msdyn_includeexpense": false,
        "priceperunit": 0,
        "productdescription": "Test",
        "isproductoverridden": true,
        "od4uc_anteilbmseuropublicerrechnet": 0,
        "propertyconfigurationstatus": 2,
        "od4uc_anteilbmsbankingeuro": 0,
        "producttypecode": 5,
        "willcall": false,
        "description": "Changed the description",
        "msdyn_salesorderdetail_msdyn_orderlinetransacti": [{
            "msdyn_ResourceOrganizationalUnitId@odata.bind": "/msdyn_organizationalunits(a50d05e4-3df7-e811-a95c-000d3ab6dc82)",
            "msdyn_accountingdate": "2020-09-10T22:00:00Z",
            "msdyn_documentdate": "2020-09-10T22:00:00Z",
            "msdyn_billingtype": 192350001,
            "msdyn_enddatetime": "2020-09-10T22:00:51Z",
            "msdyn_amountmethod": 192350000,
            "statuscode": 1,
            "msdyn_transactionclassification": 192350004,
            "msdyn_quantity": 1,
            "timezoneruleversionnumber": 0,
            "msdyn_vendortype": 192350001,
            "msdyn_price": 0,
            "msdyn_PriceList@odata.bind": "/pricelevels(20b2759e-46ed-ea11-a817-000d3a4ab96a)",
            "msdyn_transactiontypecode": 192350000,
            "msdyn_AccountCustomer@odata.bind": "/accounts(c4ce13f1-46ed-ea11-a817-000d3a4ab96a)",
            "msdyn_exchangeratedate": "2020-09-10T22:00:00Z",
            "msdyn_startdatetime": "2020-09-10T22:00:51Z",
            "msdyn_customertype": 192350001,
            "msdyn_amount": 0
        }, {
            "msdyn_ResourceOrganizationalUnitId@odata.bind": "/msdyn_organizationalunits(a50d05e4-3df7-e811-a95c-000d3ab6dc82)",
            "msdyn_accountingdate": "2020-09-10T22:00:00Z",
            "msdyn_documentdate": "2020-09-10T22:00:00Z",
            "msdyn_billingtype": 192350001,
            "msdyn_enddatetime": "2020-09-10T22:00:51Z",
            "msdyn_amountmethod": 192350000,
            "statuscode": 1,
            "msdyn_transactionclassification": 192350004,
            "msdyn_quantity": 1,
            "timezoneruleversionnumber": 0,
            "msdyn_Origin@odata.bind": "/msdyn_orderlinetransactions(15af90c2-4af4-ea11-a815-000d3aafb97e)",
            "msdyn_vendortype": 192350001,
            "msdyn_price": 0,
            "msdyn_PriceList@odata.bind": "/pricelevels(68fa3a09-47ed-ea11-a817-000d3a4ab96a)",
            "msdyn_transactiontypecode": 192350004,
            "msdyn_AccountCustomer@odata.bind": "/accounts(c4ce13f1-46ed-ea11-a817-000d3a4ab96a)",
            "msdyn_exchangeratedate": "2020-09-10T22:00:00Z",
            "msdyn_startdatetime": "2020-09-10T22:00:51Z",
            "msdyn_customertype": 192350001,
            "msdyn_amount": 0
        }]
    }, {
        "od4uc_anteilesageuro": 0,
        "productname": "T&M123123123",
        "msdyn_linetype": 690970000,
        "iscopied": true,
        "od4uc_anteilbmstceuro": 0,
        "msdyn_costamount": 0,
        "od4uc_anteilnpoeuro": 0,
        "extendedamount": 487.5,
        "quantity": 1,
        "bms_anteil_cs_euro": 0,
        "od4uc_hilfsfeldanteilnpoeuroausdetailzeilen": 0,
        "sequencenumber": 1,
        "msdyn_includematerial": false,
        "bms_anteil_digitaler_vertrieb_euro": 0,
        "pricingerrorcode": 0,
        "salesorderdetailname": "T&M123123123",
        "msdyn_includefee": false,
        "od4uc_ordertype": 192350001,
        "msdyn_includetime": true,
        "shipto_freighttermscode": 1,
        "ispriceoverridden": true,
        "od4uc_anteilnpoeuroausdetailzeilen": 0,
        "od4uc_anteilbmsodeuro": 0,
        "tax": 0,
        "od4uc_anteilbmsmmmeuro": 0,
        "skippricecalculation": 0,
        "volumediscountamount": 0,
        "msdyn_billingmethod": 192350000,
        "msdyn_includeexpense": true,
        "priceperunit": 487.5,
        "productdescription": "T&M123123123",
        "isproductoverridden": true,
        "od4uc_anteilbmseuropublicerrechnet": 0,
        "propertyconfigurationstatus": 2,
        "od4uc_anteilbmsbankingeuro": 0,
        "producttypecode": 5,
        "willcall": false,
        "description": "Changed the description",
        "msdyn_salesorderdetail_msdyn_orderlinetransacti": [{
            "msdyn_ResourceOrganizationalUnitId@odata.bind": "/msdyn_organizationalunits(a50d05e4-3df7-e811-a95c-000d3ab6dc82)",
            "msdyn_accountingdate": "2020-09-13T22:00:00Z",
            "msdyn_documentdate": "2020-09-13T22:00:00Z",
            "msdyn_Unit@odata.bind": "/uoms(7886d424-3fed-ea11-a817-000d3aafb97e)",
            "msdyn_billingtype": 192350001,
            "msdyn_enddatetime": "2020-09-13T22:00:43Z",
            "msdyn_amountmethod": 192350000,
            "statuscode": 1,
            "msdyn_transactionclassification": 192350000,
            "msdyn_UnitSchedule@odata.bind": "/uomschedules(dad307c2-c3fc-e811-a95b-000d3ab6d5d9)",
            "msdyn_quantity": 2,
            "timezoneruleversionnumber": 0,
            "msdyn_description": "Aufgabe 1",
            "msdyn_vendortype": 192350001,
            "msdyn_price": 81.25,
            "msdyn_PriceList@odata.bind": "/pricelevels(20b2759e-46ed-ea11-a817-000d3a4ab96a)",
            "msdyn_transactiontypecode": 192350000,
            "msdyn_AccountCustomer@odata.bind": "/accounts(c4ce13f1-46ed-ea11-a817-000d3a4ab96a)",
            "msdyn_exchangeratedate": "2020-09-13T22:00:00Z",
            "msdyn_startdatetime": "2020-09-13T22:00:43Z",
            "msdyn_customertype": 192350001,
            "msdyn_amount": 162.5
        }, {
            "msdyn_ResourceOrganizationalUnitId@odata.bind": "/msdyn_organizationalunits(a50d05e4-3df7-e811-a95c-000d3ab6dc82)",
            "msdyn_accountingdate": "2020-09-13T22:00:00Z",
            "msdyn_documentdate": "2020-09-13T22:00:00Z",
            "msdyn_Unit@odata.bind": "/uoms(7886d424-3fed-ea11-a817-000d3aafb97e)",
            "msdyn_billingtype": 192350001,
            "msdyn_enddatetime": "2020-09-13T22:00:43Z",
            "msdyn_amountmethod": 192350000,
            "statuscode": 1,
            "msdyn_transactionclassification": 192350000,
            "msdyn_UnitSchedule@odata.bind": "/uomschedules(dad307c2-c3fc-e811-a95b-000d3ab6d5d9)",
            "msdyn_quantity": 2,
            "timezoneruleversionnumber": 0,
            "msdyn_description": "Aufgabe 1",
            "msdyn_Origin@odata.bind": "/msdyn_orderlinetransactions(a6b2fff9-7ef6-ea11-a815-000d3a4ab96a)",
            "msdyn_vendortype": 192350001,
            "msdyn_price": 243.75,
            "msdyn_PriceList@odata.bind": "/pricelevels(68fa3a09-47ed-ea11-a817-000d3a4ab96a)",
            "msdyn_transactiontypecode": 192350004,
            "msdyn_AccountCustomer@odata.bind": "/accounts(c4ce13f1-46ed-ea11-a817-000d3a4ab96a)",
            "msdyn_exchangeratedate": "2020-09-13T22:00:00Z",
            "msdyn_startdatetime": "2020-09-13T22:00:43Z",
            "msdyn_customertype": 192350001,
            "msdyn_amount": 487.5
        }]
    }]
}

Getting back a 400 error with the following message (translated to English):

XHRPOSTXXX.crm.dynamics.com/.../salesorders
[HTTP/1.1 400 Bad Request 3234ms]

        
    error    Object { code: "0x80040265", message: "Value cannot be null.\r\nParameter name: The Salescontractline-ID is missing.", "@Microsoft.PowerApps.CDS.ErrorDetails.ApiExceptionSourceKey": "Plugin/Microsoft.Crm.ObjectModel.CustomBusinessEntityService", … }
    code    "0x80040265"
    message    "Value cannot be null.\r\nParameter name: The Salescontractline-ID is missing."
    @Microsoft.PowerApps.CDS.ErrorDetails.ApiExceptionSourceKey    "Plugin/Microsoft.Crm.ObjectModel.CustomBusinessEntityService"
    @Microsoft.PowerApps.CDS.ErrorDetails.ApiStepKey    "4fcabb1b-ea3e-db11-86a7-000a3a5473e8"
    @Microsoft.PowerApps.CDS.ErrorDetails.ApiDepthKey    "1"
    @Microsoft.PowerApps.CDS.ErrorDetails.ApiActivityIdKey    "4b0fea6d-6852-4f26-9019-58854fd2fdaa"
    @Microsoft.PowerApps.CDS.ErrorDetails.ApiPluginSolutionNameKey    "System"
    @Microsoft.PowerApps.CDS.ErrorDetails.ApiStepSolutionNameKey    "System"
    @Microsoft.PowerApps.CDS.ErrorDetails.ApiExceptionCategory    "ClientError"
    @Microsoft.PowerApps.CDS.ErrorDetails.ApiExceptionMesageName    "IsvAborted"
    @Microsoft.PowerApps.CDS.ErrorDetails.ApiExceptionHttpStatusCode    "400"
    @Microsoft.PowerApps.CDS.ErrorDetails.OperationStatus    "0"
    @Microsoft.PowerApps.CDS.ErrorDetails.SubErrorCode    "-2146233088"
    @Microsoft.PowerApps.CDS.TraceText    "\r\n[Microsoft.Dynamics.ProjectService.Plugins: Microsoft.Dynamics.ProjectService.Plugins.PreValidateContractLineDetailCreateInputValidation]\r\n[6b688e0a-43c7-4cf4-b7ba-d52836740195: Project Service - PreValidateContractLineDetailCreateInputValidation]\r\n\r\n"
    @Microsoft.PowerApps.CDS.InnerError.Message    "Value cannot be null.\r\nParameter name: Die Projektvertragszeilen-ID fehlt."

It's the msdyn_salescontractlineid lookup that is causing the error.

This lookup should be automatically populated with the GUID of the newly created salesorderdetail up the chain. I cannot know it at the time of creation of the request body.

If I disable the plugin message Microsoft.Dynamics.ProjectService.Plugins.PreValidateContractLineDetailCreateInputValidation, it works as expected.

What gives?