Search code examples
javascriptdynamics-crmdynamics-crm-2011xrmservicetoolkit

Cannot change created custom Status Reason via JavaScript


I have changed salesorder entity and create a new status reason in Submitted. I have added a status reason named PreTransport in submitted state, with value 100000004. I can go from Active state(pending status reason) to Submitted state(In-Progress status reason) via this request :

          var request = ""
           request += "<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\">";
           request += "  <s:Body>";
           request += "    <Execute xmlns=\"http://schemas.microsoft.com/xrm/2011/Contracts/Services\" xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\">";
           request += "      <request i:type=\"b:SetStateRequest\" xmlns:a=\"http://schemas.microsoft.com/xrm/2011/Contracts\" xmlns:b=\"http://schemas.microsoft.com/crm/2011/Contracts\">";
           request += "        <a:Parameters xmlns:c=\"http://schemas.datacontract.org/2004/07/System.Collections.Generic\">";
           request += "          <a:KeyValuePairOfstringanyType>";
           request += "            <c:key>EntityMoniker</c:key>";
           request += "            <c:value i:type=\"a:EntityReference\">";
           request += "              <a:Id>" +recordGuid+ "</a:Id>";
           request += "              <a:LogicalName>salesorder</a:LogicalName>";
           request += "              <a:Name i:nil=\"true\" />";
           request += "            </c:value>";
           request += "          </a:KeyValuePairOfstringanyType>";
           request += "          <a:KeyValuePairOfstringanyType>";
           request += "            <c:key>State</c:key>";
           request += "            <c:value i:type=\"a:OptionSetValue\">";
           request += "              <a:Value>"+stateCode+"</a:Value>";
           request += "            </c:value>";
           request += "          </a:KeyValuePairOfstringanyType>";
           request += "          <a:KeyValuePairOfstringanyType>";
           request += "            <c:key>Status</c:key>";
           request += "            <c:value i:type=\"a:OptionSetValue\">";
           request += "              <a:Value>"+statusCode+"</a:Value>";
           request += "            </c:value>";
           request += "          </a:KeyValuePairOfstringanyType>";
           request += "        </a:Parameters>";
           request += "        <a:RequestId i:nil=\"true\" />";
           request += "        <a:RequestName>SetState</a:RequestName>";
           request += "      </request>";
           request += "    </Execute>";
           request += "  </s:Body>";
           request += "</s:Envelope>";
           //send set state request  
           var req = new XMLHttpRequest();
           req.open("POST", Xrm.Page.context.getClientUrl() + "/XRMServices/2011/Organization.svc/web", true)
           // Responses will return XML. It isn't possible to return JSON.
           req.setRequestHeader("Accept", "application/xml, text/xml, */*");
           req.setRequestHeader("Content-Type", "text/xml; charset=utf-8");
           req.setRequestHeader("SOAPAction", "http://schemas.microsoft.com/xrm/2011/Contracts/Services/IOrganizationService/Execute");
           var successCallback = null;
           var errorCallback = null;
           req.send(request );

But it does not work from In-Progress to PreTransport that are in the same state. I suppose that it because of permission. Should I set Permission on this new status reason?

If yes How can I do this? Note that I have CRM 2011 on-premise.

Note: I have tried this code also, but no success.

XrmServiceToolkit.Soap.SetState("salesorder", Xrm.Page.data.entity.getId(), 1, 100000004,false);

Solution

  • Sorry I don't have access to 2011 version. But I tested this below snippet in CRM Rest builder, It works perfectly.

    I have created a custom status reason (StatusCode) of value 100000000 : Shipping ready under status (StateCode) of 1 : Submitted. Make sure you are flowing through the allowed transitions like answered here.

    var entity = {};
    entity.StateCode = {
        Value: 1
    };
    entity.StatusCode = {
        Value: 100000000
    };
    
    XrmServiceToolkit.Rest.Update("B4B625A1-3789-E811-A967-000D3A1A9407", entity, "SalesOrderSet", function() {
        //Success - No Return Data - Do Something
    }, function(error) {
        Xrm.Utility.alertDialog(error.message);
    }, true);
    

    enter image description here