public async Task <IWrappedResponse> Rollback(Guid refLtmsTransactionId)
        {
            PostingRequestRollbackSyncRequest requestRollbackSyncRequest = new PostingRequestRollbackSyncRequest
            {
                RefLtmsTransactionId = refLtmsTransactionId
            };
            var postingRequestsSyncRequest = new PostingRequestsSyncRequest
            {
                PostingRequestRollbackSyncRequests = new List <PostingRequestRollbackSyncRequest> {
                    requestRollbackSyncRequest
                }
            };

            var result = await _synchronizationsService.SendPostingRequestsAsync(postingRequestsSyncRequest);


            if (result.ResultType == ResultType.Failed)
            {
                return(new WrappedResponse
                {
                    ResultType = ResultType.Failed,
                    State = ErrorHandler.Create().AddMessage(new PostingRequestNotRolledBackError()).GetServiceState()
                });
            }

            return(new WrappedResponse
            {
                ResultType = ResultType.Ok
            });
        }
        public async Task <IWrappedResponse> SendPostingRequestsAsync(PostingRequestsSyncRequest request)
        {
            try
            {
                _queueClient = new QueueClient(_syncServiceBusConnectionString,
                                               _postingRequestSyncRequestQueueName, retryPolicy: RetryPolicy.Default);

                var messageBody = JsonConvert.SerializeObject(request);
                var message     = new Message(Encoding.UTF8.GetBytes(messageBody))
                {
                    ContentType = @"application/json"
                };


                await _queueClient.SendAsync(message);

                return(new WrappedResponse
                {
                    ResultType = ResultType.Ok
                });
            }
            catch (Exception exception)
            {
                ErrorHandler.Create()
                .LogException(new SynchronizationException("Send posting request failed.", exception), request);
                return(new WrappedResponse
                {
                    ResultType = ResultType.Failed
                });
            }
        }
        public async Task <IWrappedResponse <long> > SchedulePostingRequestsAsync(PostingRequestsSyncRequest request,
                                                                                  DateTimeOffset dateTimeOffset)
        {
            _queueClient = new QueueClient(_syncServiceBusConnectionString,
                                           _postingRequestSyncRequestQueueName, retryPolicy: RetryPolicy.Default);

            var messageBody = JsonConvert.SerializeObject(request);
            var message     = new Message(Encoding.UTF8.GetBytes(messageBody));

            var numberSequence = await _queueClient.ScheduleMessageAsync(message, dateTimeOffset);

            return(new WrappedResponse <long>
            {
                ResultType = ResultType.Ok,
                Data = numberSequence
            });
        }
        public async Task <IWrappedResponse> Create(PostingRequestsCreateRequest request)
        {
            var olmaPostingRequests = new List <Olma.PostingRequest>();

            foreach (var postingRequestPosition in request.Positions)
            {
                var olmaPostingRequest = Mapper.Map <Olma.PostingRequest>(request);
                olmaPostingRequest.LoadCarrierId       = postingRequestPosition.LoadCarrierId;
                olmaPostingRequest.LoadCarrierQuantity = postingRequestPosition.LoadCarrierQuantity;
                olmaPostingRequest.SyncDate            = DateTime.UtcNow;

                _olmaPostingRequestRepo.Create(olmaPostingRequest);
                _olmaPostingRequestRepo.Save();

                var postingRequest = olmaPostingRequest;
                olmaPostingRequest = _olmaPostingRequestRepo.FindByCondition(pr => pr.Id == postingRequest.Id)
                                     .Include(lc => lc.LoadCarrier)
                                     .Include(pa => pa.PostingAccount)
                                     .FirstOrDefault();

                if (olmaPostingRequest == null)
                {
                    return(Failed <IEnumerable <PostingRequest> >());
                }

                if (string.IsNullOrEmpty(request.ReferenceNumber))
                {
                    olmaPostingRequest.ReferenceNumber =
                        await _numberSequencesService.GetProcessNumber(ProcessType.PostingRequest,
                                                                       olmaPostingRequest.Id);
                }

                olmaPostingRequests.Add(olmaPostingRequest);
            }

            var postingRequestsSyncRequest = new PostingRequestsSyncRequest
            {
                PostingRequestCreateSyncRequests = new List <PostingRequestCreateSyncRequest>()
            };

            var postingRequestCreateSyncRequest =
                new PostingRequestCreateSyncRequest
            {
                IsSortingRequired = olmaPostingRequests.Select(i => i.IsSortingRequired).FirstOrDefault(),
                Positions         = olmaPostingRequests.Select(pr => new PostingRequestPosition
                {
                    RefLtmsPalletId       = pr.LoadCarrier.RefLtmsPalletId,
                    LoadCarrierQuantity   = pr.LoadCarrierQuantity,
                    RefLtmsBookingRowGuid = pr.RowGuid
                }),
                CreditRefLtmsAccountId =
                    olmaPostingRequests.Select(pr => pr.DestinationRefLtmsAccountId).FirstOrDefault(),
                DebitRefLtmsAccountId =
                    olmaPostingRequests.Select(pr => pr.SourceRefLtmsAccountId).FirstOrDefault(),
                ReferenceNumber          = olmaPostingRequests.Select(pr => pr.ReferenceNumber).FirstOrDefault(),
                IssuedByRefLtmsAccountId = olmaPostingRequests.Select(pr => pr.PostingAccount.RefLtmsAccountId)
                                           .FirstOrDefault(),
                Note               = olmaPostingRequests.Select(pr => pr.Note).FirstOrDefault(),
                RefLtmsProcessId   = olmaPostingRequests.Select(pr => pr.RefLtmsProcessId).FirstOrDefault(),
                RefLtmsProcessType =
                    (RefLtmsProcessType)olmaPostingRequests.Select(pr => pr.RefLtmsProcessTypeId)
                    .FirstOrDefault(),
                RefLtmsTransactionId = request.RefLtmsTransactionRowGuid ?? olmaPostingRequests.Select(pr => pr.RefLtmsTransactionId).FirstOrDefault(),
                DocumentFileName     = request.DocumentFileName,
                IsSelfService        = request.IsSelfService,
                DigitalCode          = request.DigitalCode,
                DeliveryNoteNumber   = request.DeliveryNoteNumber,
                PickUpNoteNumber     = request.PickUpNoteNumber,
                RefLmsBusinessTypeId = request.RefLmsBusinessTypeId
            };

            var result =
                Mapper.Map <IEnumerable <Olma.PostingRequest>, IEnumerable <PostingRequest> >(olmaPostingRequests);

            postingRequestsSyncRequest.PostingRequestCreateSyncRequests.Add(postingRequestCreateSyncRequest);
            var syncResult = await _synchronizationsService.SendPostingRequestsAsync(postingRequestsSyncRequest);

            // Switch (override) Type and loadCarrierQuantity sign when quantity is negative to support Split Bookings
            // PostingRequests have to have positive quantities all the time
            if (olmaPostingRequests.Any(r => r.LoadCarrierQuantity < 0))
            {
                foreach (var postingRequest in olmaPostingRequests.Where(r => r.LoadCarrierQuantity < 0))
                {
                    postingRequest.LoadCarrierQuantity = Math.Abs(postingRequest.LoadCarrierQuantity);
                    postingRequest.Type = PostingRequestType.Credit;
                }
                _olmaPostingRequestRepo.Save();
            }

            if (syncResult.ResultType != ResultType.Ok)
            {
                return(new WrappedResponse
                {
                    ResultType = ResultType.Failed
                });
            }
            return(Created(result));
        }
Esempio n. 5
0
        private async Task CheckPostingRequestsSyncDate(CancellationToken stoppingToken)
        {
            using var scope = Services.CreateScope();
            var olmaPostingRequestRepo =
                scope.ServiceProvider.GetRequiredService <IRepository <Olma.PostingRequest> >();

            var postingRequests = olmaPostingRequestRepo.FindByCondition(pr =>
                                                                         //PostingRequest created but not synchronized
                                                                         !pr.IsDeleted && !pr.SyncDate.HasValue)
                                  .Include(lc => lc.LoadCarrier)
                                  .Include(pa => pa.PostingAccount)
                                  .IgnoreQueryFilters().ToList();

            if (postingRequests.Any())
            {
                var postingRequestsGroupedByTransactionId = postingRequests.GroupBy(pr => pr.RefLtmsTransactionId);

                foreach (var postingRequestGroup in postingRequestsGroupedByTransactionId)
                {
                    var postingRequestsSyncRequest = new PostingRequestsSyncRequest
                    {
                        PostingRequestCreateSyncRequests = new List <PostingRequestCreateSyncRequest>()
                    };

                    var postingRequestCreateSyncRequest = new PostingRequestCreateSyncRequest
                    {
                        IsSortingRequired      = postingRequestGroup.Select(i => i.IsSortingRequired).FirstOrDefault(),
                        CreditRefLtmsAccountId =
                            postingRequestGroup.Select(pr => pr.DestinationRefLtmsAccountId).FirstOrDefault(),
                        DebitRefLtmsAccountId    = postingRequestGroup.Select(pr => pr.SourceRefLtmsAccountId).FirstOrDefault(),
                        IssuedByRefLtmsAccountId =
                            postingRequestGroup.Select(pr => pr.PostingAccount.RefLtmsAccountId).FirstOrDefault(),
                        Note               = postingRequestGroup.Select(pr => pr.Note).FirstOrDefault(),
                        ReferenceNumber    = postingRequestGroup.Select(pr => pr.ReferenceNumber).FirstOrDefault(),
                        RefLtmsProcessId   = postingRequestGroup.Select(pr => pr.RefLtmsProcessId).FirstOrDefault(),
                        RefLtmsProcessType =
                            (RefLtmsProcessType)postingRequestGroup.Select(pr => pr.RefLtmsProcessTypeId).FirstOrDefault(),
                        RefLtmsTransactionId = postingRequestGroup.Select(pr => pr.RefLtmsTransactionId).FirstOrDefault(),
                        Positions            = postingRequestGroup.Select(pr => new PostingRequestPosition
                        {
                            RefLtmsPalletId       = pr.LoadCarrier.RefLtmsPalletId,
                            LoadCarrierQuantity   = pr.LoadCarrierQuantity,
                            RefLtmsBookingRowGuid = pr.RowGuid
                        })
                    };

                    postingRequestsSyncRequest.PostingRequestCreateSyncRequests.Add(postingRequestCreateSyncRequest);
                    var synchronizationsService =
                        scope.ServiceProvider.GetRequiredService <ISynchronizationsService>();

                    var syncResult = await synchronizationsService.SendPostingRequestsAsync(postingRequestsSyncRequest);

                    if (syncResult.ResultType == ResultType.Ok)
                    {
                        foreach (var olmaPostingRequest in postingRequestGroup)
                        {
                            olmaPostingRequest.SyncDate = DateTime.UtcNow;
                            olmaPostingRequestRepo.Update(olmaPostingRequest);
                        }
                        olmaPostingRequestRepo.Save();
                    }
                }
            }

            await Task.Delay(30000, stoppingToken);
        }