Search code examples
quickbooksintuit-partner-platform

IPP .NET CustomerQuery exclude Jobs


How do we filter out Jobs from a CustomerQuery with IPP .NET (QuickBooks Online)?

See this thread for reference (it seems unresolved?): https://idnforums.intuit.com/messageview.aspx?catid=87&threadid=16282

Below are the relevant lines that should exlude Jobs, but it isn't working...

Dim cq As New Qbo.CustomerQuery
cq.IncludeJobs = False
customers = cq.ExecuteQuery(Of Qbo.Customer)(context).ToList()

Thanks, Kyle


Solution

  • This is a bug in the DevKit. It does not pass the IncludeJobs filter in the request body.

    It will be fixed in the next release, but here is a workaround using DevDefined.

    IEnumerable<Customer> customers = GetQboCustomers(dataService, 1, 100, false);
    
    public List<Intuit.Ipp.Data.Qbo.Customer> GetQboCustomers(DataServices dataServices, int startPage, int resultsPerPage, bool includeJobs)
    {
        StringBuilder requestXML = new StringBuilder();
        StringBuilder responseXML = new StringBuilder();
    
        var requestBody = String.Format("PageNum={0}&ResultsPerPage={1}", startPage, resultsPerPage);
        if (!includeJobs) { requestBody += "&Filter=IncludeJobs :EQUALS: false"; }
    
        HttpWebRequest httpWebRequest = WebRequest.Create(dataServices.ServiceContext.BaseUrl + "customers/v2/" + dataServices.ServiceContext.RealmId) as HttpWebRequest;
        httpWebRequest.Method = "POST";
        httpWebRequest.ContentType = "application/x-www-form-urlencoded";
        httpWebRequest.Headers.Add("Authorization", GetDevDefinedOAuthHeader(httpWebRequest, requestBody));
        requestXML.Append(requestBody);
        UTF8Encoding encoding = new UTF8Encoding();
        byte[] content = encoding.GetBytes(requestXML.ToString());
        using (var stream = httpWebRequest.GetRequestStream())
        {
            stream.Write(content, 0, content.Length);
        }
        HttpWebResponse httpWebResponse = httpWebRequest.GetResponse() as HttpWebResponse;
        using (Stream data = httpWebResponse.GetResponseStream())
        {
            Intuit.Ipp.Data.Qbo.SearchResults searchResults = (Intuit.Ipp.Data.Qbo.SearchResults)dataServices.ServiceContext.Serializer.Deserialize<Intuit.Ipp.Data.Qbo.SearchResults>(new StreamReader(data).ReadToEnd());
            return ((Intuit.Ipp.Data.Qbo.Customers)searchResults.CdmCollections).Customer.ToList();
        }
    
    }
    
    protected string GetDevDefinedOAuthHeader(HttpWebRequest webRequest, string requestBody)
    {
    
        OAuthConsumerContext consumerContext = new OAuthConsumerContext
        {
            ConsumerKey = consumerKey,
            ConsumerSecret = consumerSecret,
            SignatureMethod = SignatureMethod.HmacSha1,
            UseHeaderForOAuthParameters = true
    
        };
    
        consumerContext.UseHeaderForOAuthParameters = true;
    
        //URIs not used
        OAuthSession oSession = new OAuthSession(consumerContext, "https://www.example.com",
                                "https://www.example.com",
                                "https://www.example.com");
    
    
        oSession.AccessToken = new TokenBase
        {
            Token = accessToken,
            ConsumerKey = consumerKey,
            TokenSecret = accessTokenSecret
        };
    
        IConsumerRequest consumerRequest = oSession.Request();
        consumerRequest = ConsumerRequestExtensions.ForMethod(consumerRequest, webRequest.Method);
        consumerRequest = ConsumerRequestExtensions.ForUri(consumerRequest, webRequest.RequestUri);
        if (webRequest.Headers.Count > 0)
        {
            ConsumerRequestExtensions.AlterContext(consumerRequest, context => context.Headers = webRequest.Headers);
            if (webRequest.Headers[HttpRequestHeader.ContentType] == "application/x-www-form-urlencoded")
            {
                Dictionary<string, string> formParameters = new Dictionary<string, string>();
                foreach (string formParameter in requestBody.Split('&'))
                {
                    formParameters.Add(formParameter.Split('=')[0], formParameter.Split('=')[1]);
                }
                consumerRequest = consumerRequest.WithFormParameters(formParameters);
            }
        }
    
        consumerRequest = consumerRequest.SignWithToken();
        return consumerRequest.Context.GenerateOAuthParametersForHeader();
    }