Ejemplo n.º 1
0
        public async Task <string> ProcessDocument(string companyId,
                                                   TradingChannel.TradingChannel tradingChannel,
                                                   TradingPartner.TradingPartner tradingPartner,
                                                   string message, TradingPartnerMessage.TradingPartnerMessage messageData)
        {
            var             ediStream = new MemoryStream(Encoding.Default.GetBytes(message));
            List <IEdiItem> ediItems;

            using (var reader = new X12Reader(ediStream, EdiHelper.TypeFactory))
            {
                var items = reader.ReadToEndAsync().Result;
                ediItems = items.ToList();
                string controlNumber = string.Empty;
                string errorMessage  = null;
                foreach (var item in ediItems)
                {
                    if (item is ISA isa)
                    {
                        // find the company with the sender id
                        var senderId = isa.InterchangeSenderID_6.Trim();
                        var rId      = isa.InterchangeReceiverID_8.Trim();
                        continue;
                        // VERIFY PARTNER INFORMATION IS CORRECT
                    }

                    if (item is GS gs)
                    {
                        controlNumber = gs.GroupControlNumber_6;
                        continue;
                    }

                    var handler = _ediHandlers.FirstOrDefault(p => p.ForType.IsAssignableFrom(item.GetType()));

                    if (handler != null)
                    {
                        try
                        {
                            if (item is EdiMessage edi)
                            {
                                if (edi.HasErrors)
                                {
                                    errorMessage = "EDI VALIDATION: " + string.Join(Environment.NewLine, edi.ErrorContext.Flatten());
                                    return(errorMessage);
                                }
                            }
                            await handler.Handle(companyId, tradingChannel, tradingPartner, item, messageData);
                        }
                        catch (Exception ex)
                        {
                            errorMessage = ex.Message + Environment.NewLine +
                                           ex.StackTrace + (ex.InnerException?.Message ?? string.Empty) +
                                           (ex.InnerException?.StackTrace ?? string.Empty);
                            return(errorMessage);
                        }
                    }
                }
            }

            return(null);
        }
        protected override async Task HandleDocument(string companyId, TradingChannel.TradingChannel channel,
                                                     TradingPartner.TradingPartner partner, TS990 ts990, TradingPartnerMessage.TradingPartnerMessage message)
        {
            var shipments   = Db.Get <Shipment.Shipment>(companyId);
            var stp         = Db.Get <ShipmentTradingPartner.ShipmentTradingPartner>(companyId);
            var transaction = AutoMapper.Mapper.Map <LoadTenderResponseTransaction>(ts990);

            var shipment = await shipments.FirstOrDefaultAsync(p => p.ShipmentIdentificationNumber == transaction.ShipmentIdentificationNumber);

            message.ReferenceId = shipment.ShipmentIdentificationNumber;

            var shipmentPartnerMessage = stp.Get()
                                         .FirstOrDefault(x => x.TradingPartnerId == partner.Id && x.ShipmentId == shipment.Id);

            if (transaction.Action == LoadTenderResponseAction.Accepted)
            {
                shipment.ToPartnerId          = partner.Id;
                shipmentPartnerMessage.Status = ShipmentTradingPartnerStatus.Accepted;
                var evt = new ShipmentStatusChangedEvent()
                {
                    Previous = shipment.Status,
                    Shipment = shipment,
                    Sender   = this
                };
                shipment.Status = evt.Status = ShipmentStatus.PendingDispatch;
                await Mediator.Publish(evt);

                // TODO Notify all other trading partners (if any) that the load is accepted by someone else
            }
            else if (transaction.Action == LoadTenderResponseAction.Declined)
            {
                shipmentPartnerMessage.Status = ShipmentTradingPartnerStatus.Declined;
//                var evt = new ShipmentStatusChangedEvent()
//                {
//                    Previous = shipment.Status,
//                    Shipment = shipment,
//                    Sender = this
//                };
//                shipment.Status = evt.Status = ShipmentStatus.Started;
//                await Mediator.Publish(evt);
            }
            else
            {
                shipment.ToPartnerId          = null;
                shipmentPartnerMessage.Status = ShipmentTradingPartnerStatus.Cancelled;
                var evt = new ShipmentStatusChangedEvent()
                {
                    Previous = shipment.Status,
                    Shipment = shipment,
                    Sender   = this
                };
                shipment.Status = evt.Status = ShipmentStatus.Started;
                await Mediator.Publish(evt);
            }

            await shipments.Save(shipment);

            await stp.Save(shipmentPartnerMessage);
        }
        protected override async Task HandleDocument(string companyId, TradingChannel.TradingChannel channel, TradingPartner.TradingPartner partner, TS210 ts210, TradingPartnerMessage.TradingPartnerMessage message)
        {
            var data      = new LoadTenderInvoice(ts210);
            var shipments = Db.Get <Shipment.Shipment>(companyId);
            var shipment  = await shipments.FirstOrDefaultAsync(p => p.ShipmentIdentificationNumber == data.ShipmentIdentificationNumber);

            message.ReferenceId = data.ShipmentIdentificationNumber;
        }
Ejemplo n.º 4
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.);
        }
        protected override async Task HandleDocument(string companyId, TradingChannel.TradingChannel channel, TradingPartner.TradingPartner partner, TS214 ts214, TradingPartnerMessage.TradingPartnerMessage message)
        {
            var data = AutoMapper.Mapper.Map <LoadTenderStatusUpdateTransaction>(ts214);

            var shipments = Db.Get <Shipment.Shipment>(companyId);
            var shipment  = await shipments.FirstOrDefaultAsync(p => p.ShipmentIdentificationNumber == data.ShipmentIdentificationNumber);

            if (data.EquipmentItem != null)
            {
                await Mediator.Send(new SaveEquipmentRequest()
                {
                    ServiceModel = data.EquipmentItem
                });
            }

            if (shipment.CurrentStopId == null)
            {
                try
                {
                    await Mediator.Send(new BeginRequest()
                    {
                        Id = shipment.Id
                    });
                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }
            else
            {
                await Mediator.Send(new SaveStopUpdateRequest()
                {
                    CompanyId = companyId,

                    ServiceModel = new StopUpdateServiceModel()
                    {
                        StopId             = shipment.CurrentStopId,
                        Lat                = data.StopUpdate.Lat,
                        Lng                = data.StopUpdate.Lng,
                        DriverId           = data.StopUpdate.DriverId,
                        Timestamp          = data.StopUpdate.Timestamp,
                        StatusCodeId       = data.StopUpdate.StatusCodeId,
                        StatusUpdateTypeId = data.StopUpdate.StatusUpdateTypeId
                    }
                });
            }
            message.ReferenceId = shipment.ShipmentIdentificationNumber;
        }
Ejemplo n.º 6
0
        public async Task Send(string senderCompanyId, TradingChannel.TradingChannel channel, TradingPartner.TradingPartner partner,
                               string subject, EdiMessage message, string referenceId)
        {
            var sender = await _companyRepo.Find(senderCompanyId);

            partner.CurrentControlNumber++;
            await _partnerRepo.Save(partner);

            await _messageRepo.Save(new TradingPartnerMessage.TradingPartnerMessage()
            {
                Type    = TradingPartnerMessageType.Outgoing,
                Status  = TradingPartnerMessageStatus.Queued,
                Content = await EdiUtils.CreateTransaction(message,
                                                           partner.CurrentControlNumber.ToString().PadLeft(9, '0'),
                                                           sender.IsaId, partner.IsaId, partner.RequestAck, partner.TestMode ? "T":"P"),
                ReferenceId      = referenceId,
                ContentType      = "EDI",
                Subject          = subject,
                TradingChannelId = channel.Id,
                TradingPartnerId = partner.Id
            });
        }
Ejemplo n.º 7
0
        protected override async Task HandleDocument(string companyId, TradingChannel.TradingChannel channel,
                                                     TradingPartner.TradingPartner partner, TS204 doc, TradingPartnerMessage.TradingPartnerMessage message)
        {
            var shipments   = Db.Get <Shipment.Shipment>(companyId);
            var stops       = Db.Get <Stop.Stop>(companyId);
            var transaction = AutoMapper.Mapper.Map <LoadTenderTransaction>(doc);

            if (transaction.Purpose == LoadTenderTransactionPurpose.Original ||
                transaction.Purpose == LoadTenderTransactionPurpose.OriginalNoResponse) // Original
            {
                var requiresResponse = transaction.Purpose == LoadTenderTransactionPurpose.OriginalNoResponse;

                transaction.Shipment.Status        = ShipmentStatus.Tendered;
                transaction.Shipment.FromPartnerId = partner.Id;

                var result = await Mediator.Send(new SaveShipmentRequest()
                {
                    ServiceModel = transaction.Shipment
                });

                //await shipments.Save(transaction.Shipment);

                foreach (var stop in transaction.Shipment.Stops)
                {
                    stop.ShipmentId = result.Id;
                    var stopServiceModel = await Mediator.Send(new SaveStopRequest()
                    {
                        ServiceModel = stop,
                        SkipRefresh  = true
                    });

                    foreach (var item in stop.EquipmentItems)
                    {
                        // Save the equipment information
                        if (item.Equipment != null)
                        {
                            var equipmentServiceModel = await Mediator.Send(new SaveEquipmentRequest()
                            {
                                ServiceModel = item.Equipment
                            });

                            item.EquipmentId = equipmentServiceModel.Id;
                        }

                        item.ShipmentId = result.Id;
                        item.StopId     = stopServiceModel.Id;

                        var orderItemServiceModel = await Mediator.Send(
                            new SaveStopEquipmentItemRequest()
                        {
                            ServiceModel = item
                        });
                    }

                    foreach (var item in stop.OrderItems)
                    {
                        item.ShipmentId = result.Id;
                        item.StopId     = stopServiceModel.Id;

                        var orderItemServiceModel = await Mediator.Send(
                            new SaveOrderItemRequest()
                        {
                            ServiceModel = item
                        });
                    }
                }


                try
                {
                    var refreshStopsHandler =
                        new RefreshStopsHandler(shipments, stops, _mapperService, _locationCalculator);
                    await refreshStopsHandler.Handle(new RefreshStopsRequest()
                    {
                        ShipmentId = result.Id
                    }, CancellationToken.None);
                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }
            else
            {
//                var shipment = await shipments.FirstOrDefaultAsync(p =>
//                    p.ShipmentIdentificationNumber == data.ShipmentIdentificationNumber);
//
//                await Mediator.Send(new CancelRequest()
//                {
//                    Id = shipment.Id
//                });
            }
        }
Ejemplo n.º 8
0
 protected abstract Task HandleDocument(string companyId, TradingChannel.TradingChannel channel,
                                        TradingPartner.TradingPartner partner, TFor data, TradingPartnerMessage.TradingPartnerMessage message);
Ejemplo n.º 9
0
 async Task IEdiHandler.Handle(string companyId, TradingChannel.TradingChannel channel,
                               TradingPartner.TradingPartner partner, object data, TradingPartnerMessage.TradingPartnerMessage message)
 {
     await HandleDocument(companyId, channel, partner, (TFor)data, message);
 }