コード例 #1
0
 protected override Task <bool> ExecuteRequestAsync(IAuthenticatedTicket authenticatedTicket, InvoiceAddRqType request)
 {
     request.InvoiceAdd = new QbSync.QbXml.Objects.InvoiceAdd
     {
         // Mandatory
         CustomerRef = new CustomerRef
         {
             // Find the ListID for a customer with a previous Query.
             ListID = "80000001-1541542677"
         },
         InvoiceLineAdd = new List <InvoiceLineAdd>
         {
             new InvoiceLineAdd
             {
                 Amount  = 12,
                 ItemRef = new ItemRef
                 {
                     // Mandatory, you can query the list of of items prior to
                     // add an invoice. You may use the full name or ListID.
                     FullName = "test"
                 }
             }
         }
     };
     return(base.ExecuteRequestAsync(authenticatedTicket, request));
 }
コード例 #2
0
            protected override Task <bool> ExecuteRequestAsync(IAuthenticatedTicket authenticatedTicket, CustomerQueryRqType request)
            {
                // By default, we return 100, let's do 5 here.
                request.MaxReturned = "5";

                return(base.ExecuteRequestAsync(authenticatedTicket, request));
            }
コード例 #3
0
        protected override async Task <CustomerQueryRqType> CreateRequestAsync(IAuthenticatedTicket authenticatedTicket)
        {
            CustomerQueryRqType req = await base.CreateRequestAsync(authenticatedTicket);

            req.MaxReturned = this.DefaultMaxReturned;
            return(req);
        }
コード例 #4
0
        /// <summary>
        /// Returns the string that has to be sent to the Web Connector.
        /// Return null if your step has nothing to do this time. The next step will be executed immediately.
        /// </summary>
        /// <param name="authenticatedTicket">The authenticated ticket.</param>
        /// <returns>QbXml or null to execute the next step.</returns>
        public virtual async Task <string?> SendXMLAsync(IAuthenticatedTicket authenticatedTicket)
        {
            var requestObject = await ExecuteRequestAsync(authenticatedTicket);

            var requestObjectArray = requestObject?.ToArray();

            if (requestObjectArray?.Any() == true)
            {
                var qbXmlRequest = new QbXmlRequest();

                var list = new List <object>(requestObjectArray.Count());
                foreach (var request in requestObjectArray)
                {
                    list.Add(request);
                }

                qbXmlRequest.Add(new QBXMLMsgsRq
                {
                    onError = await GetOnErrorAttributeAsync(authenticatedTicket),
                    Items   = list.ToArray()
                });

                return(qbXmlRequest.GetRequest());
            }

            return(null);
        }
コード例 #5
0
        public async Task SaveTicketAsync(IAuthenticatedTicket ticket)
        {
            // Save the ticket to the databse.
            // It contains the information about the current step.
            var qbTicket = await dbContext.QbTickets
                           .FirstOrDefaultAsync(m => m.Ticket == ticket.Ticket);

            if (qbTicket == null)
            {
                var ticketAsQbTicket = ticket as QbTicket;
                if (ticketAsQbTicket != null)
                {
                    qbTicket = new QbTicket
                    {
                        Ticket        = ticket.Ticket,
                        Authenticated = ticket.Authenticated,
                        User          = ticketAsQbTicket.User,
                        UserId        = ticketAsQbTicket.UserId
                    };
                    dbContext.QbTickets.Add(qbTicket);
                }
            }

            qbTicket.CurrentStep = ticket.CurrentStep;
            await dbContext.SaveChangesAsync();
        }
コード例 #6
0
ファイル: QbManager.cs プロジェクト: tofer/quickbooks-sync
        /// <summary>
        /// Handles the authentication.
        /// </summary>
        /// <param name="authenticatedTicket">The ticket.</param>
        /// <returns>WebConnector Codes.</returns>
        protected internal async Task <string[]> AuthenticateInternalAsync(IAuthenticatedTicket authenticatedTicket)
        {
            var ret = new string[4];

            ret[0] = authenticatedTicket.Ticket;
            ret[2] = string.Empty;
            ret[3] = string.Empty; // Not used

            if (authenticatedTicket.Authenticated == false)
            {
                ret[1] = "nvu"; // Invalid user
            }
            else
            {
                var waitTime = await GetWaitTimeAsync(authenticatedTicket);

                if (waitTime == 0)
                {
                    ret[1] = await GetCompanyFileAsync(authenticatedTicket);
                }
                else
                {
                    ret[1] = "none"; // No work is necessary
                    ret[2] = waitTime.ToString();
                }
            }

            return(ret);
        }
コード例 #7
0
            protected override async Task <bool> ExecuteRequestAsync(IAuthenticatedTicket authenticatedTicket, CustomerQueryRqType request)
            {
                // Let's see if we had a previous saved time so we don't re-query the entire QuickBooks every time.
                var previouslySavedFromModified = (await dbContext.QbSettings
                                                   .FirstOrDefaultAsync(m => m.Name == LAST_MODIFIED_CUSTOMER))?.Value;

                request.FromModifiedDate = DATETIMETYPE.ParseOrDefault(previouslySavedFromModified, DATETIMETYPE.MinValue).GetQueryFromModifiedDate();
                return(await base.ExecuteRequestAsync(authenticatedTicket, request));
            }
コード例 #8
0
 public override Task <QbXmlResponseOptions> GetOptionsAsync(IAuthenticatedTicket authenticatedTicket)
 {
     // You should return a TimeZoneInfo based on the authenticated ticket.
     // The timezone where the user is running their QuickBooks.
     return(Task.FromResult(new QbXmlResponseOptions
     {
         TimeZoneBugFix = TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time")
     }));
 }
コード例 #9
0
            protected override async Task <string> RetrieveMessageAsync(IAuthenticatedTicket ticket, string key)
            {
                var state = await dbContext.QbKvpStates
                            .Where(m => m.Ticket == ticket.Ticket)
                            .Where(m => m.CurrentStep == ticket.CurrentStep)
                            .Where(m => m.Key == key)
                            .FirstOrDefaultAsync();

                return(state?.Value);
            }
コード例 #10
0
ファイル: CustomerAdd.cs プロジェクト: treys/quickbooks-sync
            protected override Task <bool> ExecuteRequestAsync(IAuthenticatedTicket authenticatedTicket, CustomerAddRqType request)
            {
                request.CustomerAdd = new QbSync.QbXml.Objects.CustomerAdd
                {
                    Name      = "Unique Name" + Guid.NewGuid().ToString("D"),
                    FirstName = "User " + authenticatedTicket.GetUserId().ToString()
                };

                return(base.ExecuteRequestAsync(authenticatedTicket, request));
            }
コード例 #11
0
        /// <summary>
        /// Executes the response, useful to save the data coming from QuickBooks.
        /// </summary>
        /// <param name="authenticatedTicket">The ticket</param>
        /// <param name="response">The QbResponse</param>
        /// <returns>Task.</returns>
        protected override async Task ExecuteResponseAsync(IAuthenticatedTicket authenticatedTicket, QbResponse response)
        {
            // We have more that can come our way.
            if (response.iteratorRemainingCount.HasValue && response.iteratorRemainingCount.Value > 0)
            {
                gotoNextStep = false;
                await SaveMessageAsync(authenticatedTicket, StepQueryRequestWithIterator.IteratorKey, response.iteratorID);
            }

            await base.ExecuteResponseAsync(authenticatedTicket, response);
        }
コード例 #12
0
            protected override Task ExecuteResponseAsync(IAuthenticatedTicket authenticatedTicket, CustomerQueryRsType response)
            {
                if (response.CustomerRet != null)
                {
                    foreach (var customer in response.CustomerRet)
                    {
                        // save these custoemr.
                    }
                }

                return(base.ExecuteResponseAsync(authenticatedTicket, response));
            }
コード例 #13
0
        /// <summary>
        /// Extension method to help fetching the extra properties off the IAuthenticatedTicket.
        /// </summary>
        /// <param name="authenticatedTicket">The ticket.</param>
        /// <returns>The user id.</returns>
        public static int GetUserId(this IAuthenticatedTicket authenticatedTicket)
        {
            if (authenticatedTicket != null)
            {
                var qbTicket = authenticatedTicket as QbTicket;
                if (qbTicket != null && qbTicket.UserId.HasValue)
                {
                    return(qbTicket.UserId.Value);
                }
            }

            return(0);
        }
コード例 #14
0
        /// <summary>
        /// Called when the Web Connector returns some data.
        /// </summary>
        /// <param name="authenticatedTicket">The authenticated ticket.</param>
        /// <param name="response">QbXml.</param>
        /// <param name="hresult">HResult.</param>
        /// <param name="message">Message.</param>
        /// <returns>Message to be returned to the Web Connector.</returns>
        public virtual async Task <int> ReceiveXMLAsync(IAuthenticatedTicket authenticatedTicket, string response, string hresult, string message)
        {
            var responseObject = new QbXmlResponse();

            if (!string.IsNullOrEmpty(response))
            {
                var msgResponseObject = responseObject.GetSingleItemFromResponse(response, typeof(QbResponse)) as QbResponse;
                await ExecuteResponseAsync(authenticatedTicket, msgResponseObject);

                return(0);
            }

            return(-1);
        }
コード例 #15
0
        /// <summary>
        /// Called when the Web Connector returns some data.
        /// </summary>
        /// <param name="authenticatedTicket">The authenticated ticket.</param>
        /// <param name="response">QbXml.</param>
        /// <param name="hresult">HResult.</param>
        /// <param name="message">Message.</param>
        /// <returns>Message to be returned to the Web Connector.</returns>
        public virtual async Task <int> ReceiveXMLAsync(IAuthenticatedTicket authenticatedTicket, string response, string hresult, string message)
        {
            var responseObject = new QbXmlResponse();

            if (!string.IsNullOrEmpty(response))
            {
                var objects           = responseObject.GetItemsFromResponse(response, typeof(IQbResponse));
                var msgResponseObject = ((IEnumerable)objects).Cast <IQbResponse>();
                await ExecuteResponseAsync(authenticatedTicket, msgResponseObject);

                return(0);
            }

            return(-1);
        }
コード例 #16
0
            protected override async Task ExecuteResponseAsync(IAuthenticatedTicket authenticatedTicket, CustomerQueryRsType response)
            {
                if (response.CustomerRet != null)
                {
                    foreach (var customer in response.CustomerRet)
                    {
                        // save these customers.
                    }

                    var lastFromModifiedDate = response.CustomerRet.OrderBy(m => m.TimeModified).Select(m => m.TimeModified).LastOrDefault();
                    await dbContext.SaveIfNewerAsync(LAST_MODIFIED_CUSTOMER, lastFromModifiedDate);
                }

                await base.ExecuteResponseAsync(authenticatedTicket, response);
            }
コード例 #17
0
        public override async Task CloseConnectionAsync(IAuthenticatedTicket authenticatedTicket)
        {
            // We do some clean up.
            var savedStates = dbContext.QbKvpStates
                              .Where(m => m.Ticket == authenticatedTicket.Ticket)
                              .ToList();

            dbContext.QbKvpStates.RemoveRange(savedStates);

            var savedTickets = dbContext.QbTickets
                               .Where(m => m.Ticket == authenticatedTicket.Ticket)
                               .ToList();

            dbContext.QbTickets.RemoveRange(savedTickets);

            await dbContext.SaveChangesAsync();
        }
コード例 #18
0
        /// <summary>
        /// Returns the string that has to be sent to the Web Connector.
        /// Return null if your step has nothing to do this time. The next step will be executed immediately.
        /// </summary>
        /// <param name="authenticatedTicket">The authenticated ticket.</param>
        /// <returns>QbXml or null to execute the next step.</returns>
        public virtual async Task <string?> SendXMLAsync(IAuthenticatedTicket authenticatedTicket)
        {
            var requestObject = await CreateRequestAsync(authenticatedTicket);

            if (requestObject != null)
            {
                if (await ExecuteRequestAsync(authenticatedTicket, requestObject))
                {
                    var qbXmlRequest = new QbXmlRequest();
                    qbXmlRequest.AddToSingle(requestObject);

                    return(qbXmlRequest.GetRequest());
                }
            }

            return(null);
        }
コード例 #19
0
            protected override Task ExecuteResponseAsync(IAuthenticatedTicket authenticatedTicket, IEnumerable <IQbResponse> responses)
            {
                foreach (var item in responses)
                {
                    switch (item)
                    {
                    case CustomerQueryRsType customerQueryRsType:
                        // Do something with the CustomerQuery data
                        break;

                    case CustomerAddRsType customerAddRsType:
                        // Do something with the CustomerAdd data
                        break;
                    }
                }

                return(base.ExecuteResponseAsync(authenticatedTicket, responses));
            }
コード例 #20
0
            protected override Task <IEnumerable <IQbRequest>?> ExecuteRequestAsync(IAuthenticatedTicket authenticatedTicket)
            {
                var list = new List <IQbRequest>
                {
                    new CustomerAddRqType
                    {
                        CustomerAdd = new QbSync.QbXml.Objects.CustomerAdd
                        {
                            Name      = "Unique Name" + Guid.NewGuid().ToString("D"),
                            FirstName = "User " + authenticatedTicket.GetUserId().ToString()
                        }
                    },
                    new CustomerQueryRqType
                    {
                        ActiveStatus = ActiveStatus.All
                    }
                };

                return(Task.FromResult <IEnumerable <IQbRequest>?>(list as IEnumerable <IQbRequest>));
            }
コード例 #21
0
            protected override async Task SaveMessageAsync(IAuthenticatedTicket ticket, string key, string value)
            {
                var state = await dbContext.QbKvpStates
                            .Where(m => m.Ticket == ticket.Ticket)
                            .Where(m => m.CurrentStep == ticket.CurrentStep)
                            .Where(m => m.Key == key)
                            .FirstOrDefaultAsync();

                if (state == null)
                {
                    state = new QbKvpState
                    {
                        CurrentStep = ticket.CurrentStep,
                        Ticket      = ticket.Ticket,
                        Key         = key
                    };
                    dbContext.QbKvpStates.Add(state);
                }

                state.Value = value;

                await dbContext.SaveChangesAsync();
            }
コード例 #22
0
 /// <summary>
 /// Called when the Web Connector detected an error.
 /// You can return a message to be displayed to the user.
 /// </summary>
 /// <param name="authenticatedTicket">The authenticated ticket.</param>
 /// <returns>Message to be displayed to the user.</returns>
 public virtual Task <string> LastErrorAsync(IAuthenticatedTicket authenticatedTicket)
 {
     return(Task.FromResult(string.Empty));
 }
コード例 #23
0
 /// <summary>
 /// Executes the response with all the QbResponse found.
 /// </summary>
 /// <param name="authenticatedTicket">The authenticated ticket.</param>
 /// <param name="responses">The responses.</param>
 /// <returns>Task.</returns>
 protected internal virtual Task ExecuteResponseAsync(IAuthenticatedTicket authenticatedTicket, IEnumerable <IQbResponse> responses)
 {
     return(Task.FromResult <object>(null));
 }
コード例 #24
0
 protected override Task <bool> ExecuteRequestAsync(IAuthenticatedTicket authenticatedTicket, InvoiceQueryRqType request)
 {
     return(base.ExecuteRequestAsync(authenticatedTicket, request));
 }
コード例 #25
0
ファイル: QbManager.cs プロジェクト: tofer/quickbooks-sync
 /// <summary>
 /// Returns the path where the client company file is located.
 /// Override this method if you wish to open a different file than the current one open on the client.
 /// </summary>
 /// <param name="authenticatedTicket">The ticket.</param>
 /// <returns>Path where company file is located.</returns>
 protected internal virtual Task <string> GetCompanyFileAsync(IAuthenticatedTicket authenticatedTicket)
 {
     return(webConnectorHandler.GetCompanyFileAsync(authenticatedTicket));
 }
コード例 #26
0
ファイル: QbManager.cs プロジェクト: tofer/quickbooks-sync
 /// <summary>
 /// Indicates if there is anything to be done with the current ticket.
 /// Return 0 if you have work to do immediately. Otherwise return the number of seconds
 /// when you want the Web Connector to come back.
 /// </summary>
 /// <returns>Number of seconds to wait before the Web Connector comes back, or 0 to do some work right now.</returns>
 protected internal virtual Task <int> GetWaitTimeAsync(IAuthenticatedTicket authenticatedTicket)
 {
     return(webConnectorHandler.GetWaitTimeAsync(authenticatedTicket));
 }
コード例 #27
0
ファイル: QbManager.cs プロジェクト: tofer/quickbooks-sync
 /// <summary>
 /// Implement this function in order to save the states to your database.
 /// </summary>
 protected internal virtual Task SaveChangesAsync(IAuthenticatedTicket authenticatedTicket)
 {
     return(authenticator.SaveTicketAsync(authenticatedTicket));
 }
コード例 #28
0
ファイル: QbManager.cs プロジェクト: tofer/quickbooks-sync
 /// <summary>
 /// Processes the response sent for the first time by the WebConnector.
 /// </summary>
 /// <param name="authenticatedTicket">The ticket.</param>
 /// <param name="response">First Message.</param>
 protected virtual Task ProcessClientInformationAsync(IAuthenticatedTicket authenticatedTicket, string response)
 {
     return(webConnectorHandler.ProcessClientInformationAsync(authenticatedTicket, response));
 }
コード例 #29
0
 protected override Task ExecuteResponseAsync(IAuthenticatedTicket authenticatedTicket, InvoiceQueryRsType response)
 {
     return(base.ExecuteResponseAsync(authenticatedTicket, response));
 }
コード例 #30
0
ファイル: QbManager.cs プロジェクト: tofer/quickbooks-sync
 /// <summary>
 /// Logs messages to a database.
 /// </summary>
 /// <param name="authenticatedTicket">The ticket which has the ticket string. The ticket could also be not authenticated if an error happened.</param>
 /// <param name="messageType">Type of message.</param>
 /// <param name="direction">Direction of the message (In the WebService, or Out the WebService).</param>
 /// <param name="ticket">The ticket.</param>
 /// <param name="arguments">Other arguments to save.</param>
 protected internal virtual void LogMessage(IAuthenticatedTicket authenticatedTicket, LogMessageType messageType, LogDirection direction, string ticket, params string[] arguments)
 {
     logger.LogTrace("Ticket: {TICKET}; Type: {TYPE}; Direction: {DIRECTION}; Arguments: {Arguments}", ticket, messageType, direction, arguments);
 }