Exemple #1
0
 private static void AcknowledgeMessage(IModel currentChannel, Acknowledgment acknowledgment, ulong tag)
 {
     // Threading notes:
     // According to the RabbitMQ Client PDF documentation for .NET, a single channel is not thread safe and access to it
     // must be serialized, but this typically manifest during RPC operations such as declaring a queue or
     // for *committing* a transaction or publishing a message large message.  For non-blocking operations (such as ack/reject)
     // it performs it's own synchronization.  In fact, a review of the client source code reveals a library absolutely
     // filled with lock() statements to perform it's own serialization of operations.  I ran several intensive tests to assert the
     // behavior below.  I created a console app that ran a single receiving and multiple publishing threads.  I was
     // able to run millions of messages through without any threading issues whatsoever.  It was only by introducing
     // channel.TxSelect() (along with channel.TxCommit) that I started to receive the "Pipelining of requests forbidden" message.
     // In this console app, the published messages on the sending threads were tiny and only occupied a single RabbitMQ TCP frame which
     // is almost certainly the reason for not having pipelining issues.  Similarly, the ack/reject instructions occupy
     // a single TCP frame and are "non-blocking" operations according to RabbitMQ's definition of blocking.  This means
     // that even though a transaction commit is only a single frame, it's a blocking operation which causes an exception to be thrown
     // because multiple threads are trying to commit the transaction and it's getting multiple send operations before receiving
     // confirmation of the committed transaction.  In other words, the code below is entirely thread safe SO LONG AS this channel
     // remains a non-transactional channel.  I also asserted that confirming multiple messages while individually rejecting individual
     // messages here and there worked as expected.
     if (Acknowledgment.ConfirmBatch == acknowledgment)
     {
         currentChannel.BasicAck(tag, AcknowledgeMultiple);
     }
     else if (Acknowledgment.RejectSingle == acknowledgment)
     {
         currentChannel.BasicReject(tag, MarkAsDeadLetter);
     }
     else
     {
         currentChannel.BasicAck(tag, AcknowledgeSingle);
     }
 }
 public void AddAcknowledgment(Response response, Acknowledgment acknowledgment)
 {
     foreach (IResponseModifier modifier in _modifiers)
     {
         modifier.AddAcknowledgment(response, acknowledgment);
     }
 }
Exemple #3
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void ctxMenuAcknowledgmentClear_Click(object sender, EventArgs e)
        {
            if (listEvents.SelectedObjects.Count == 0)
            {
                return;
            }

            var list = listEvents.SelectedObjects.Cast <Event>().ToList();

            (new Thread(() =>
            {
                SetProcessingStatus(false);

                using (new HourGlass(this))
                    using (NPoco.Database db = new NPoco.Database(Db.GetOpenMySqlConnection()))
                    {
                        foreach (Event temp in list)
                        {
                            if (temp.AcknowledgmentId == 0)
                            {
                                continue;
                            }

                            Acknowledgment acknowledgment = new Acknowledgment();
                            acknowledgment.Id = temp.AcknowledgmentId;
                            var ack = db.SingleById <Acknowledgment>(acknowledgment.Id);

                            db.Delete(ack);
                        }
                    }

                SetProcessingStatus(true);
                LoadSearch(_currentPage);
            })).Start();
        }
        /// <summary>
        /// Parses the specified ack file into an acknowledgment object if possible.
        /// </summary>
        /// <param name="ackFileName">
        /// The ack File Name to parse into an acknowledgment object.
        /// </param>
        /// <param name="stream">
        /// File contents as stream of data
        /// </param>
        /// <returns>
        /// * The Acknowledgment object resulting from the parsing attempt if the specified acknowledgment file could be found.
        /// * Otherwise returns null.
        /// </returns>
        internal Acknowledgment Parse(string ackFileName, Stream stream)
        {
            Acknowledgment = new Acknowledgment();
            if (stream != null)
            {
                FileName = Path.GetFileName(ackFileName);
                DetailAcknowledgmentParser.FileName = FileName;

                string recordType;
                using (StreamReader streamReader = new StreamReader(stream))
                {
                    while ((Line = streamReader.ReadLine()) != null)
                    {
                        if (Line.Length > AcknowledgmentConstants.RecordTypeLength)
                        {
                            LineNumber++;
                            recordType = Line.Substring(0, AcknowledgmentConstants.RecordTypeLength);

                            switch (recordType)
                            {
                            case DetailAcknowledgmentParser.RecordType:
                                ParseDetailAcknowledgmentRecord();
                                break;

                            case GeneralAcknowledgmentParser.RecordType:
                                ParseGeneralAcknowledgmentRecord();
                                break;
                            }
                        }
                        else
                        {
                            Log.Warning("Error parsing record in line #{0} from file \"{1}\". Unexpected end of record detected.",
                                        (int)ResultCode.UnexpectedEndOfRecord, LineNumber, FileName);
                        }
                    }
                }

                // Add entries to the log if the acknowledgment file did not have the expected number of records of each type.
                if (Acknowledgment.DetailAcknowledgments.Count == 0)
                {
                    Log.Information("Acknowledgment file \"{0}\" contained no Detail Acknowledgments Records.", ackFileName);
                }

                if (Acknowledgment.GeneralAcknowledgments.Count != 1)
                {
                    Log.Warning("Acknowledgment file \"{0}\" should have exactly 1 General Acknowledgments Record.",
                                (int)ResultCode.FileMissingExpectedRecord,
                                ackFileName);
                }
            }
            else
            {
                Log.Error("Acknowledgment file \"{0}\" could not be found.", null, (int)ResultCode.FileNotFound, ackFileName);
                Acknowledgment = null;
            }

            return(Acknowledgment);
        }
Exemple #5
0
        protected override async Task HandleDocument(string companyId, TradingChannel.TradingChannel channel, TradingPartner.TradingPartner partner, TS997 ts997, TradingPartnerMessage.TradingPartnerMessage message)
        {
            var data = new Acknowledgment(ts997);
            //data
//            var shipments = Db.Get<Shipment.Shipment>(companyId);
//            var shipment = await shipments.FirstOrDefaultAsync(p =>
//                p.TradingPartnerId == partner.Id &&
//                p.ShipmentIdentificationNumber == data.);
        }
        public Acknowledgment ConvertAcknowledgment(List <Interchange> interchanges, string userId)
        {
            // Edi section ISA
            var isa = interchanges[0];
            // Edi section GS
            var gs = isa.FunctionGroups.ToList()[0];
            // Edi section ST
            var st = gs.Transactions[0];
            // Edi section BIG
            var bak = st.Segments.FirstOrDefault(x => x.SegmentId == "BAK");
            // Edi section CUR
            var cur = st.Segments.FirstOrDefault(x => x.SegmentId == "CUR");
            // Edi section CTT
            var ctt = st.Loops.Where(x => x.SegmentId == "CTT").ToList()[0];
            var amt = ctt.Segments.ToList()[0];
            // Edi section N1 - loop
            var n1 = st.Loops.Where(x => x.SegmentId == "N1").ToList();
            // Edi section NTE
            var td5 = st.Segments.Where(x => x.SegmentId == "TD5").ToList();
            // Edi section IT1 - loop
            var po1 = st.Loops.Where(x => x.SegmentId == "PO1").ToList();
            // Edi section REF - (ref keyword is taken so variable name can't follow convention)
            var refack = st.Segments.Where(x => x.SegmentId == "REF").ToList();

            var env   = ExtractEnv(isa, gs, st);
            var names = ExtractNames(n1);
            var td5s  = ExtractTransitDtl(td5);
            var items = ExtractItems(po1);
            var refs  = ExtractRefs(refack);

            var Acknowledgment = new Acknowledgment()
            {
                AckEnvelope = env,
                UserID      = userId,
                BAK01_TransactionSetPurposeCode = bak != null?bak.GetElement(1) : null,
                                                      BAK02_AcknowledgmentType = bak != null?bak.GetElement(2) : null,
                                                                                     BAK03_PurchaseOrderNumber = bak != null?bak.GetElement(3) : null,
                                                                                                                     BAK04_Date = bak != null?bak.GetDate8Element(4) : null,
                                                                                                                                      BAK05_ReleaseNumber = bak != null?bak.GetElement(5) : null,
                                                                                                                                                                BAK07_ContractNumber = bak != null?bak.GetElement(6) : null,
                                                                                                                                                                                           CUR01_EntityIdentifierCode = cur != null?cur.GetElement(1) : null,
                                                                                                                                                                                                                            CUR02_CurrencyCode = cur != null?cur.GetElement(2) : null,
                                                                                                                                                                                                                                                     CTT01_NumberOfLineItems = ctt != null?ctt.GetIntElement(1) : null,
                                                                                                                                                                                                                                                                                   AMT01_AmountQualifierCode = amt != null?amt.GetElement(1) : null,
                                                                                                                                                                                                                                                                                                                   AMT02_MonetaryAmount = amt != null?amt.GetDecimalElement(2) : null,
                                                                                                                                                                                                                                                                                                                                              AckNames = names,
                                                                                                                                                                                                                                                                                                                                              AckTd5s  = td5s,
                                                                                                                                                                                                                                                                                                                                              AckItems = items,
                                                                                                                                                                                                                                                                                                                                              AckRefs  = refs
            };

            Console.WriteLine(isa.SerializeToX12(true));

            return(Acknowledgment);
        }
Exemple #7
0
 public void AddAcknowledgment(Response response, Acknowledgment acknowledgment)
 {
     if (acknowledgment is CreatedItemAcknowledgment createdItemAcknowledgment)
     {
         response.StatusCode = HttpStatusCode.Created;
         SetLocationHeader(response, createdItemAcknowledgment.NewIdentifier);
     }
     else
     {
         response.StatusCode = HttpStatusCode.OK;
     }
 }
 public void AddAcknowledgment(Response response, Acknowledgment acknowledgment)
 {
     if (acknowledgment is CreatedItemAcknowledgment createdItemAcknowledgment)
     {
         response.ExtraBody[StatusKey]    = "created";
         response.ExtraBody["Identifier"] = createdItemAcknowledgment.NewIdentifier;
     }
     else
     {
         response.ExtraBody[StatusKey] = "ok";
     }
 }
Exemple #9
0
        public async Task <Feedback> ExecuteAsync(IRestItem item, IEndpointContext context, ResourceBody body)
        {
            var itemBody = body as ItemBody;

            if (itemBody == null)
            {
                throw new ItemBodyNotSupportedException(body.ResourceType);
            }

            Acknowledgment acknowledgment = await item.EditAsync(itemBody.Item);

            return(new AcknowledgmentFeedback(acknowledgment));
        }
        public async Task <Feedback> ExecuteAsync(IRestScalar scalar, IEndpointContext context, ResourceBody body)
        {
            var scalarBody = body as ScalarBody;

            if (scalarBody == null)
            {
                throw new InvalidCastException("Request body type must be a scalar value for this endpoint.");
            }

            Acknowledgment acknowledgment = await scalar.EditAsync(scalarBody.Scalar);

            return(new AcknowledgmentFeedback(acknowledgment));
        }
        public async Task <Acknowledgment> DeleteAllAsync(IRestCollectionQuery query)
        {
            using (HttpClient client = HttpClientCreator.Create())
            {
                var    queryStringBuilder = new CollectionQueryStringBuilder(new CollectionQueryStringConfiguration());
                string fullUrl            = UriUtilities.AppendQueryString(Path, queryStringBuilder.BuildString(query));

                HttpResponseMessage response = await client.DeleteAsync(fullUrl);

                Acknowledgment acknowledgment = await EnsureSuccessAsync(response);

                return(acknowledgment);
            }
        }
Exemple #12
0
        private void Acknowledge(Acknowledgment ack)
        {
            Console.WriteLine($"Remove: {ack.MessageId}");

            if (this.remoteActor == null)
            {
                this.remoteActor = this.Sender;

                Context.Watch(this.remoteActor);
            }

            this.queue.Remove(ack.MessageId);

            this.Deliver();
        }
        public async Task <CreatedItemAcknowledgment> AddAsync(RestItemData itemData)
        {
            using (HttpClient client = HttpClientCreator.Create())
            {
                HttpResponseMessage response = await client.PostAsync(Path, Serializer.SerializeItemToContent(itemData));

                Acknowledgment acknowledgment = await EnsureSuccessAsync(response);

                var created = acknowledgment as CreatedItemAcknowledgment;

                if (created == null)
                {
                    throw new InvalidOperationException("REST API did not return status code 201 after creating an item.");
                }

                return(created);
            }
        }
Exemple #14
0
        public async Task SetValueAsync(IDeferredItem <TItem> item, object deserializedValue, IDataTransaction dataTransaction)
        {
            IEngineRepository <TNav> navRepository = new NavigationItemRepository <TItem, TNav>(item, _navTools.NavExpression, _navTools.Setter);

            var itemData = new RestItemData(deserializedValue);

            var navLocatorCreator = new NavigationItemLocatorCreator <TNav>(_subContext);
            DeferredItemBase <TNav> deferredItem = await navLocatorCreator.LocateOrCreateItemAsync(navRepository, itemData, item.LoadAsync);

            try
            {
                IDataTransaction transaction  = new VoidTransaction(); // we commit the transaction in the parent. TODO optional save-as-you-go ?
                var            navContext     = new FullEngineContext <TNav>(transaction, navRepository, _subContext);
                var            navEngineItem  = new EngineRestItem <TNav>(navContext, deferredItem);
                Acknowledgment acknowledgment = await navEngineItem.EditAsync(itemData);
            }
            catch (RestApiException ex)
            {
                throw new SubWriterException(ex, item);
            }
        }
Exemple #15
0
 public void SetDeliveryInfo(Acknowledgment acknowledgment,
                             DateTime arrivedTime,
                             IMessageQueue destinationQueue,
                             string id,
                             MessageType messageType,
                             byte[] senderId,
                             long senderVersion,
                             DateTime sentTime,
                             string sourceMachine,
                             string transactionId)
 {
     this.acknowledgment   = acknowledgment;
     this.arrivedTime      = arrivedTime;
     this.destinationQueue = destinationQueue;
     this.id            = id;
     this.messageType   = messageType;
     this.senderId      = senderId;
     this.senderVersion = senderVersion;
     this.sentTime      = sentTime;
     this.sourceMachine = sourceMachine;
     this.transactionId = transactionId;
     this.isDelivered   = true;
 }
        public async Task SetValueAsync(IDeferredItem <TItem> item, object deserializedValue, IDataTransaction dataTransaction)
        {
            IEngineRepository <TNav> navRepository = new NavigationCollectionRepository <TItem, TCollection, TNav>(item, _navTools.NavExpression, _navTools.Setter);

            IDataTransaction transaction = new VoidTransaction(); // we commit the transaction in the parent. TODO optional save-as-you-go ?
            var navContext = new FullEngineContext <TNav>(transaction, navRepository, _subContext);

            var navLocatorCreator = new NavigationItemLocatorCreator <TNav>(_subContext);

            IEnumerable deserializedCollection = (IEnumerable)deserializedValue;  // todo null ?

            foreach (object deserializedItem in deserializedCollection)
            {
                var itemData = new RestItemData(deserializedItem);

                DeferredItemBase <TNav> deferredItem = await navLocatorCreator.LocateOrCreateItemAsync(navRepository, itemData, item.LoadAsync);

                var            navEngineItem  = new EngineRestItem <TNav>(navContext, deferredItem);
                Acknowledgment acknowledgment = await navEngineItem.EditAsync(itemData);
            }

            // TODO: remove items that were not located?
        }
 public void AddAcknowledgment(Response response, Acknowledgment acknowledgment)
 {
 }
Exemple #18
0
		public void SetDeliveryInfo (Acknowledgment acknowledgment,
		                             DateTime arrivedTime,
		                             IMessageQueue destinationQueue,
									 string id,
		                             MessageType messageType,
		                             byte[] senderId,
									 long senderVersion,
		                             DateTime sentTime,
									 string sourceMachine,
		                             string transactionId)
		{
			this.acknowledgment = acknowledgment;
			this.arrivedTime = arrivedTime;
			this.destinationQueue = destinationQueue;
			this.id = id;
			this.messageType = messageType;
			this.senderId = senderId;
			this.senderVersion = senderVersion;
			this.sentTime = sentTime;
			this.sourceMachine = sourceMachine;
			this.transactionId = transactionId;
			this.isDelivered = true;
		}
Exemple #19
0
 public void Create(Acknowledgment entity)
 {
     _unitOfWork.AcknowledgmentRepository.Add(entity);
     _unitOfWork.Commit();
 }
Exemple #20
0
 public void Update(Acknowledgment entity)
 {
     _unitOfWork.AcknowledgmentRepository.Edit(entity);
     _unitOfWork.Commit();
 }
Exemple #21
0
 public void Delete(Acknowledgment entity)
 {
     _unitOfWork.AcknowledgmentRepository.Delete(entity);
     _unitOfWork.Commit();
 }
        private void ProcessAcknowledgement()
        {
            // Deserialize ack file into an ack object.
            AcknowledgmentParser acknowledgmentParser = new AcknowledgmentParser(Context.Log);
            Acknowledgment       acknowledgment       = acknowledgmentParser.Parse(AcknowledgmentFileName, AcknowledgmentFileStream);

            Collection <int> successfullyRedeemedReferenceNumbers = new Collection <int>();
            Collection <int> rejectedByPartnerReferenceNumbers    = new Collection <int>();
            Collection <int> successfullyGrantedRewards           = new Collection <int>();
            Collection <int> rejectedRewards = new Collection <int>();

            if (acknowledgment != null)
            {
                // if we have general ack records to process, get the first one
                // We should ideally have only one B record, and we will log warning in parsing code otherwise.
                if (acknowledgment.GeneralAcknowledgments.Count > 0)
                {
                    GeneralAcknowledgment generalAcknowledgment = acknowledgment.GeneralAcknowledgments[0];
                    if (generalAcknowledgment.AcknowledgementCode != AcknowledgmentConstants.SuccessfulSubmissionAckCode)
                    {
                        // log failure and return
                        Context.Log.Warning(
                            "The PTS file submission was rejected. Details: \r\n:" +
                            "Record Seq Number : {0} \r\n" +
                            "Received Acknowledgment Code : {1} \r\n" +
                            "Sumission Id : {2} \r\n",
                            (int)ResultCode.SubmissionRejected,
                            generalAcknowledgment.RecordSequenceNumber,
                            generalAcknowledgment.AcknowledgementCode,
                            generalAcknowledgment.SubmissionId);

                        return;
                    }
                }


                // process each Detail Ack Record.
                foreach (DetailAcknowledgment detailAcknowledgment in acknowledgment.DetailAcknowledgments)
                {
                    if (detailAcknowledgment != null)
                    {
                        // No overflow because reference number will never be more than int range.
                        int referenceNumber = Convert.ToInt32(detailAcknowledgment.ReferenceNumber);

                        // add all the successfull
                        if (detailAcknowledgment.AcknowledgementCode == AcknowledgmentConstants.SuccessfulRedemptionAckCode)
                        {
                            if (String.Equals(detailAcknowledgment.MerchantDescriptor,
                                              ReferredRedemptionRewardsMerchantDescriptor, StringComparison.OrdinalIgnoreCase) == false)
                            {
                                successfullyRedeemedReferenceNumbers.Add(referenceNumber);
                            }
                            else
                            {
                                successfullyGrantedRewards.Add(referenceNumber);
                            }
                        }
                        else
                        {
                            Context.Log.Warning(
                                "Deal with reference number {0} was not accepted by the partner. " +
                                "We expected AcknowledgmentCode of {1} but we got {2}",
                                (int)ResultCode.RedeemedDealRejectedByPartner,
                                referenceNumber,
                                AcknowledgmentConstants.SuccessfulRedemptionAckCode,
                                detailAcknowledgment.AcknowledgementCode);

                            if (String.Equals(detailAcknowledgment.MerchantDescriptor,
                                              ReferredRedemptionRewardsMerchantDescriptor, StringComparison.OrdinalIgnoreCase) == false)
                            {
                                rejectedByPartnerReferenceNumbers.Add(referenceNumber);
                            }
                            else
                            {
                                rejectedRewards.Add(referenceNumber);
                            }
                        }
                    }
                }
            }

            if (successfullyRedeemedReferenceNumbers.Count > 0)
            {
                UpdateRedeemedDeals(successfullyRedeemedReferenceNumbers, CreditStatus.CreditGranted);
                WorkerActions.UpdateOutstandingReferredRedemptionRewards(successfullyGrantedRewards, RewardPayoutStatus.Paid, RewardOperations, Context);
            }

            if (rejectedByPartnerReferenceNumbers.Count > 0)
            {
                UpdateRedeemedDeals(rejectedByPartnerReferenceNumbers, CreditStatus.RejectedByPartner);
                WorkerActions.UpdateOutstandingReferredRedemptionRewards(rejectedRewards, RewardPayoutStatus.Rescinded, RewardOperations, Context);
            }
        }
        public async Task <Feedback> ExecuteAsync(IRestItem item, IEndpointContext context, ResourceBody body)
        {
            Acknowledgment acknowledgment = await item.DeleteAsync();

            return(new AcknowledgmentFeedback(acknowledgment));
        }
Exemple #24
0
 public AcknowledgmentFeedback(Acknowledgment acknowledgment)
 {
     Acknowledgment = acknowledgment;
 }
Exemple #25
0
 public async Task UpdateAsync(Acknowledgment entity)
 {
     _unitOfWork.AcknowledgmentRepository.Edit(entity);
     await _unitOfWork.CommitAsync();
 }
Exemple #26
0
 public async Task DeleteAsync(Acknowledgment entity)
 {
     _unitOfWork.AcknowledgmentRepository.Delete(entity);
     await _unitOfWork.CommitAsync();
 }
        public async Task <Feedback> ExecuteAsync(IRestScalar scalar, IEndpointContext context, ResourceBody body)
        {
            Acknowledgment acknowledgment = await scalar.EditAsync(null);

            return(new AcknowledgmentFeedback(acknowledgment));
        }
Exemple #28
0
        /// <summary>
        ///
        /// </summary>
        private void Process()
        {
            AcknowledgmentClass acknowledgmentClass = (AcknowledgmentClass)cboClassification.Items[cboClassification.SelectedIndex];
            string initials   = txtInitials.Text.ToUpper();
            string notes      = txtNotes.Text;
            bool   successful = chkSuccessful.Checked;

            btnOk.Enabled     = false;
            btnCancel.Enabled = false;

            (new Thread(() =>
            {
                try
                {
                    bool acknowledgedPrevious = false;
                    bool errors = false;
                    using (new HourGlass(this))
                        using (NPoco.Database db = new NPoco.Database(Db.GetOpenMySqlConnection()))
                        {
                            db.BeginTransaction();
                            foreach (Event temp in _events)
                            {
                                try
                                {
                                    bool insert = true;
                                    var ack = db.Fetch <Acknowledgment>("select * from acknowledgment where cid=@0 and sid=@1", new object[] { temp.Cid, temp.Sid });
                                    if (ack.Count() > 0)
                                    {
                                        if (ack.First().Initials.ToUpper() != initials)
                                        {
                                            acknowledgedPrevious = true;
                                            insert = false;
                                        }
                                        else
                                        {
                                            db.Delete(ack.First());
                                        }
                                    }

                                    if (insert == true)
                                    {
                                        Acknowledgment acknowledgment = new Acknowledgment();
                                        acknowledgment.Cid = temp.Cid;
                                        acknowledgment.Sid = temp.Sid;
                                        acknowledgment.Initials = initials;
                                        acknowledgment.Notes = notes;
                                        acknowledgment.Class = acknowledgmentClass.Id;
                                        acknowledgment.Successful = successful;
                                        acknowledgment.Timestamp = DateTime.Parse(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));

                                        db.Insert(acknowledgment);
                                    }
                                }
                                catch (Exception ex)
                                {
                                    db.AbortTransaction();
                                    errors = true;
                                    IO.WriteTextToFile("Acknowledgement Insert Error (" + DateTime.Now + "): " + ex.ToString() + Environment.NewLine,
                                                       System.IO.Path.Combine(Misc.GetUserDataDirectory(), "Errors.txt"),
                                                       true);
                                    break;
                                }
                            }

                            if (errors == false)
                            {
                                db.CompleteTransaction();
                            }
                        }

                    if (acknowledgedPrevious == true)
                    {
                        UserInterface.DisplayMessageBox(this,
                                                        "Some events were not classified due to being already classified",
                                                        MessageBoxIcon.Exclamation);
                    }

                    if (errors == true)
                    {
                        UserInterface.DisplayMessageBox(this,
                                                        "Errors occured, check the Errors.txt file",
                                                        MessageBoxIcon.Exclamation);
                    }
                }
                catch (Exception ex)
                {
                    UserInterface.DisplayMessageBox(this,
                                                    "Errors occured, check the Errors.txt file",
                                                    MessageBoxIcon.Exclamation);
                    IO.WriteTextToFile("Acknowledgement Insert Error (" + DateTime.Now + "): " + ex.ToString() + Environment.NewLine,
                                       System.IO.Path.Combine(Misc.GetUserDataDirectory(), "Errors.txt"),
                                       true);
                }
                finally
                {
                    this.DialogResult = DialogResult.OK;
                }
            })).Start();
        }