PavanKumar GVVS
PavanKumar GVVS

Reputation: 1045

How to close CRM opportunity entity using C# web api

I am new to CRM. I had implemented OAuth for application. I am using web api approach to access specific CRM user data. I had implemented web api successfully for "Get User Opportunities", "Update User Opportunity". But i am unable to do same for "close opportunity" or "win opportunity".

Note: I am not using OrganizationService proxy while accessing user data. I am using OAuth token and calling specific API request URL.

Please guide me to achieve same. Highly appreciable if anyone can show any samples on code and or how to test same in postman.

My queries:

1) Is it possible using OAuth token,can we connect to OrganizationServiceProxy without passing user credentials?

Ex: Get Opportunities

Request URL : https://testdevcrm.crm8.dynamics.com/api/data/v9.1/opportunities

Header:

Authorization:Bearer (accessToken)

Accept:application/json

OData-MaxVersion:4.0

OData-Version:4.0

Method Type : GET

Code

  #region FectchUserOpportunities
    public async Task<JToken> FectchUserOpportunities(string systemuserid,string bearerToken)
    {
        JToken jResu = null;
        try
        {
            var httpClient = new HttpClient();

            httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", bearerToken);
            ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
            string filter = "&$filter=_createdby_value eq '" + systemuserid + "' and opportunityid ne null and statuscode eq 1&$orderby=createdon asc&$top=5";
            string opportunitiesURL = string.Concat(GenericMethods.GetAppSetting("FetchCRMOpportunitiesAPI"), filter);
            var result = httpClient.GetAsync(opportunitiesURL).Result;

            if (result != null)
            {
                var opporJSON = await result.Content.ReadAsStringAsync();
                JToken jsonResult = JsonConvert.DeserializeObject<JObject>(opporJSON);
                jResu = jsonResult["value"];
            }
            else
            {
                jResu = null;
            }
        }
        catch (Exception ex)
        {
        }
        return jResu;
    }

    #endregion

Upvotes: 0

Views: 2155

Answers (2)

PavanKumar GVVS
PavanKumar GVVS

Reputation: 1045

Finally I implemented C# code using web api for opportunity as WON.

Code:

    #region UpdateUserOpportunityWon

    public async Task<string> UpdateUserOpportunityWon(string bearerToken, string opportunityid, string wonsubject, string actualend = "", int actualrevenue = 0, string wondesc = "")
    {
        string jResu = "";
        try
        {
            string opportunitiesURL = string.Format(GenericMethods.GetAppSetting("UpdateCRMOpportunityAPI"), opportunityid);
            var httpClient = new HttpClient();
            httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", bearerToken);
            httpClient.DefaultRequestHeaders.Add("OData-MaxVersion", "4.0");
            httpClient.DefaultRequestHeaders.Add("OData-Version", "4.0");
            httpClient.DefaultRequestHeaders.Add("Accept", "application/json");
            //httpClient.DefaultRequestHeaders.Add("Content-Type", "application/json; charset=utf-8");
            ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
            string jsonBody = "";
            if (String.IsNullOrEmpty(actualend))
            {
                jsonBody = "{'Status':3,'OpportunityClose':{'subject':'" + wonsubject + "','actualrevenue':" + actualrevenue + ",'description':'" + wondesc + "','[email protected]':'" + opportunitiesURL + "'}}";
            }
            else
            {
                jsonBody = "{'Status':3,'OpportunityClose':{'subject':'" + wonsubject + "','actualrevenue':" + actualrevenue + ",'actualend':'" + actualend + "','description':'" + wondesc + "','[email protected]':'" + opportunitiesURL + "'}}";
            }
            var content = new StringContent(jsonBody, Encoding.UTF8, "application/json");
            string opportunitiesWonURL = string.Format(GenericMethods.GetAppSetting("UpdateOpportunityWon"), opportunityid);

            var result = httpClient.PostAsync(opportunitiesWonURL, content).Result;
          //  TelemetryHelper.Trace("API res", result.ToString());
            string statuscode = result.StatusCode.ToString();
            if (result != null)
            {
                var opporJSON = await result.Content.ReadAsStringAsync();
                if (statuscode.ToLower() == "nocontent")
                {
                    jResu = statuscode; //success
                }
                else
                {
                    JToken jsonResult = JsonConvert.DeserializeObject<JObject>(opporJSON);
                    if (jsonResult["error"] != null)
                    {
                        jResu = jsonResult["error"]["message"].ToString();
                    }
                }
            }
            else
            {
                jResu = Resources.CommonAPIError + statuscode;
            }
        }
        catch (Exception ex)
        {
            TelemetryHelper.Trace("API Ex", ex.Message.ToString());
        }
        return jResu;
    }

    #endregion

Upvotes: 0

AnkUser
AnkUser

Reputation: 5531

Well There is an Specific Action which can be called from WebAPI to Close opportunity as WIN or LOSS. It's called

WinOpportunity

LoseOpportunity

Now how do you call it via Webapi. Here is the sample Code From front end Side to call it. You can easily replicate this using Postman and see how this helps.

var parameters = {};
var opportunityclose = {};
opportunityclose.activityid = "00000000-0000-0000-0000-000000000000"; //Delete if creating new record 
opportunityclose["@odata.type"] = "Microsoft.Dynamics.CRM.opportunityclose";
opportunityclose["[email protected]"] = "/opportunities(8CA20837-715F-E911-A83A-000D3A3852A3)";
parameters.OpportunityClose = opportunityclose;
parameters.Status = 0;

var req = new XMLHttpRequest();
req.open("POST", Xrm.Page.context.getClientUrl() + "/api/data/v9.1/WinOpportunity", false);
req.setRequestHeader("OData-MaxVersion", "4.0");
req.setRequestHeader("OData-Version", "4.0");
req.setRequestHeader("Accept", "application/json");
req.setRequestHeader("Content-Type", "application/json; charset=utf-8");
req.onreadystatechange = function() {
    if (this.readyState === 4) {
        req.onreadystatechange = null;
        if (this.status === 204) {
            //Success - No Return Data - Do Something
        } else {
            Xrm.Utility.alertDialog(this.statusText);
        }
    }
};
req.send(JSON.stringify(parameters));

var parameters = {};
var opportunityclose = {};
opportunityclose.activityid = "00000000-0000-0000-0000-000000000000"; //Delete if creating new record 
opportunityclose["@odata.type"] = "Microsoft.Dynamics.CRM.opportunityclose";
opportunityclose["[email protected]"] = "/opportunities(8CA20837-715F-E911-A83A-000D3A3852A3)";
parameters.OpportunityClose = opportunityclose;
parameters.Status = 0;

    var req = new XMLHttpRequest();
    req.open("POST", Xrm.Page.context.getClientUrl() + "/api/data/v9.1/LoseOpportunity", false);
    req.setRequestHeader("OData-MaxVersion", "4.0");
    req.setRequestHeader("OData-Version", "4.0");
    req.setRequestHeader("Accept", "application/json");
    req.setRequestHeader("Content-Type", "application/json; charset=utf-8");
    req.onreadystatechange = function() {
        if (this.readyState === 4) {
            req.onreadystatechange = null;
            if (this.status === 204) {
                //Success - No Return Data - Do Something
            } else {
                Xrm.Utility.alertDialog(this.statusText);
            }
        }
    };
    req.send(JSON.stringify(parameters));

Upvotes: 1

Related Questions