コード例 #1
0
ファイル: QbWcService.cs プロジェクト: theparagroup/paraquick
        protected override string OnGetLastError(string ticket)
        {
            string message;

            if (ticket == ServiceUtils.ZeroTicket)
            {
                //note: we should never see the zero tickets, but we report it here
                message = "Can't process zero ticket";
                Error(message);
            }
            else
            {
                using (var db = ServiceUtils.CreateDbContext())
                {
                    EfParaquickSession efSession = ServiceUtils.FindSession(db, ticket);

                    if (efSession != null)
                    {
                        //return response-level and ticket-level errors
                        //(no need to log them again)
                        message = OnGetLastError(db, efSession);
                    }
                    else
                    {
                        //we report bad tickets here
                        message = $"can't find ticket ({ticket})";
                        Error(message);
                    }
                }
            }


            return(message);
        }
コード例 #2
0
ファイル: QbWcService.cs プロジェクト: theparagroup/paraquick
        protected override string OnConnectionError(string ticket, HResult hResult)
        {
            if (ticket != ServiceUtils.ZeroTicket)
            {
                using (var db = ServiceUtils.CreateDbContext())
                {
                    EfParaquickSession efSession = ServiceUtils.FindSession(db, ticket);

                    if (efSession != null)
                    {
                        //log this error
                        SessionError(db, efSession, hResult.Format());

                        //ask the implementation if we should tell the WC to retry
                        string companyFilePath;
                        if (OnRetryConnection(db, efSession, hResult, out companyFilePath))
                        {
                            return(companyFilePath);
                        }
                        else
                        {
                            //if not, we reset the session to "New" and let the user fix it and try again
                            ServiceUtils.Reset(db, efSession);
                        }
                    }
                    else
                    {
                        //note: getLastError will not be called so we log this here
                        Error("Can't find ticket ({ticket}) during connection error");
                    }
                }
            }
            else
            {
                //note: getLastError will not be called so we log this here
                Error("Can't process zeroticket during connection error");
            }

            return("done");
        }
コード例 #3
0
ファイル: QbWcService.cs プロジェクト: theparagroup/paraquick
        protected override string OnCloseConnection(string ticket)
        {
            //note: we should never see the zero ticket here either
            //      but it's already been logged at this point
            if (ticket != ServiceUtils.ZeroTicket)
            {
                using (var db = ServiceUtils.CreateDbContext())
                {
                    EfParaquickSession efSession = ServiceUtils.FindSession(db, ticket);

                    //bad tickets have already been logged
                    if (efSession != null)
                    {
                        //close session
                        ServiceUtils.Close(db, efSession);

                        //allow implementation to send custom message back to WC
                        return(OnGetCloseMessage(db, efSession));
                    }
                }
            }

            return($"Session closed for invalid ticket {ticket}");
        }
コード例 #4
0
ファイル: QbWcService.cs プロジェクト: theparagroup/paraquick
        protected override int OnResponseMessage(string ticket, string responseXml, HResult hResult)
        {
            //zerotickets should never be seen here, but if so, they will recur in getLastError and be logged there
            if (ticket != ServiceUtils.ZeroTicket)
            {
                using (var db = ServiceUtils.CreateDbContext())
                {
                    EfParaquickSession efSession = ServiceUtils.FindSession(db, ticket);

                    //bad tickets will recur in getLastError and be logged there
                    if (efSession != null)
                    {
                        //COM error?
                        if (hResult == null)
                        {
                            //deserialize response and process success/error
                            RsMsgSet rsMsgSet = new RsMsgSet();
                            QBXML    qbxml    = rsMsgSet.Deserialize(responseXml);

                            //TODO update paraquick entities based on response type
                            foreach (var rsMsg in rsMsgSet)
                            {
                                var efMessage = efSession.ParaquickMessages.Where(m => m.RequestId == rsMsg.requestID).FirstOrDefault();

                                if (efMessage != null)
                                {
                                    ServiceUtils.Response(db, efMessage, rsMsg);

                                    //allow implementor to do something with response
                                    OnResponse(db, efMessage, rsMsg);

                                    if (rsMsg.statusCode != "0")
                                    {
                                        //TODO stop on errors?
                                        ResponseError(db, efSession, efMessage, rsMsg.statusMessage);
                                    }
                                }
                                else
                                {
                                    //TODO stop on errors?
                                    SessionError(db, efSession, $"Can't find request ({rsMsg.requestID})");
                                }
                            }


                            //TODO StopOnErrors? do we stop on errors here (return -1) or keep going?
                            //report "%" - completed messages/total messages for session
                            int pctComplete = ServiceUtils.CalculatePercentComplete(db, efSession);
                            return(pctComplete);
                        }
                        else
                        {
                            SessionError(db, efSession, $"COM Error {hResult.Format()}");
                        }
                    }
                }
            }

            //error condition
            return(-1);
        }
コード例 #5
0
ファイル: QbWcService.cs プロジェクト: theparagroup/paraquick
        protected override string OnCreateRequestMessage(string ticket, string hcpXml, string companyFilePath, string qbCountry, int qbMajorVersion, int qbMinorVersion)
        {
            //zerotickets should never be seen here, but if so, they will recur in getLastError and be logged there
            if (ticket != ServiceUtils.ZeroTicket)
            {
                using (var db = ServiceUtils.CreateDbContext())
                {
                    EfParaquickSession efSession = ServiceUtils.FindSession(db, ticket);

                    //bad tickets will recur in getLastError and be logged there
                    if (efSession != null)
                    {
                        //confirm file path
                        if (IsCompanyFileValid(db, efSession, companyFilePath))
                        {
                            //save the hcpXml & other information in the company record
                            if (!string.IsNullOrEmpty(hcpXml))
                            {
                                ServiceUtils.Session(db, efSession, hcpXml, qbCountry, qbMajorVersion, qbMinorVersion);
                            }

                            //find next message for this ticket
                            List <EfParaquickMessage> efMessages = ServiceUtils.FindNextMessageSet(db, efSession);

                            if (efMessages != null)
                            {
                                //TODO do we set OnError to stopOnErrors in the request?
                                RqMsgSet rqMsgSet = new RqMsgSet();

                                foreach (var efMessage in efMessages)
                                {
                                    //deserialize request message
                                    IRqMsg rqMsg = (IRqMsg)Msg.Deserialize(efMessage.MessageType.RequestTypeName, efMessage.RequestXml);

                                    //allow implementation to see/modify message
                                    string errorMessage = OnRequest(db, efMessage, rqMsg);
                                    if (errorMessage == null)
                                    {
                                        //add it to message set
                                        rqMsgSet.Add(rqMsg);
                                    }
                                    else
                                    {
                                        //"close" this request, don't send to WC
                                        RequestError(db, efSession, efMessage, errorMessage);
                                    }
                                }

                                //TODO is "nothing to do" at this point an error?

                                //send it
                                string xml = rqMsgSet.Serialize();
                                return(xml);
                            }
                            else
                            {
                                //something wrong with the message set in the database, log it
                                SessionError(db, efSession, $"An error occurred when building the message set for session ({efSession.Id})");

                                //this is pretty bad, let's just close the session
                                ServiceUtils.Close(db, efSession);
                            }
                        }
                        else
                        {
                            //log error
                            SessionError(db, efSession, $"Incorrect company file ({companyFilePath}) for company ({efSession.CompanyId})");
                        }
                    }
                }
            }

            //error condition
            return("");
        }