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; }
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; }
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 }); }
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 // }); } }
protected abstract Task HandleDocument(string companyId, TradingChannel.TradingChannel channel, TradingPartner.TradingPartner partner, TFor data, TradingPartnerMessage.TradingPartnerMessage message);
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); }