public OrderDetail SaveOrderDetail(OrderDetail orderDetailToSave) { var orderDetailEntityToSave = _orderDetailMapper.Map(orderDetailToSave); DeactivateExistingSourceCodes(orderDetailToSave.Id); if (orderDetailToSave.OrderItemStatus != null && orderDetailToSave.OrderItemStatus.OrderStatusState != OrderStatusState.FinalSuccess) { DeactivateExistingShippingDetails(orderDetailToSave.Id); DeactivateExistingEventCustomer(orderDetailToSave.Id); } SourceCodeOrderDetail sourceCodeOrderDetail = orderDetailToSave.SourceCodeOrderDetail; EventCustomerOrderDetail eventCustomerOrderDetail = orderDetailToSave.EventCustomerOrderDetail; List <ShippingDetailOrderDetail> shippingDetailsForOrderDetail = orderDetailToSave.ShippingDetailOrderDetails; var shippingDetailsOrderDetail = new List <ShippingDetailOrderDetail>(); using (var myAdapter = PersistenceLayer.GetDataAccessAdapter()) { if (!myAdapter.SaveEntity(orderDetailEntityToSave, true)) { throw new PersistenceFailureException(); } if (sourceCodeOrderDetail != null && orderDetailToSave.OrderItemStatus != null && orderDetailToSave.OrderItemStatus.OrderStatusState == OrderStatusState.FinalSuccess && !ActivateExistingSourceCode(sourceCodeOrderDetail)) { sourceCodeOrderDetail.OrderDetailId = orderDetailEntityToSave.OrderDetailId; sourceCodeOrderDetail = _sourceCodeOrderDetailRepository.Save(sourceCodeOrderDetail); } if (eventCustomerOrderDetail != null && orderDetailToSave.OrderItemStatus != null && orderDetailToSave.OrderItemStatus.OrderStatusState == OrderStatusState.FinalSuccess && !ExistingEventCustomerOrderDetail(eventCustomerOrderDetail.EventCustomerId, orderDetailEntityToSave.OrderDetailId)) { eventCustomerOrderDetail.OrderDetailId = orderDetailEntityToSave.OrderDetailId; eventCustomerOrderDetail = _eventCustomerOrderDetailRepository.Save(eventCustomerOrderDetail); } if (!shippingDetailsForOrderDetail.IsEmpty()) { foreach (var shippingDetailOrderDetail in shippingDetailsForOrderDetail) { if (shippingDetailOrderDetail != null && orderDetailToSave.OrderItemStatus != null && orderDetailToSave.OrderItemStatus.OrderStatusState == OrderStatusState.FinalSuccess && !ExistingShippingDetailOrderDetail(shippingDetailOrderDetail.ShippingDetailId, orderDetailEntityToSave.OrderDetailId)) { shippingDetailOrderDetail.OrderDetailId = orderDetailEntityToSave.OrderDetailId; shippingDetailsOrderDetail.Add( _shippingDetailOrderDetailRepository.Save(shippingDetailOrderDetail)); } } } } // HACK OrderDetail detailToReturn = CreateOrderDetail(orderDetailToSave, orderDetailEntityToSave); detailToReturn.SourceCodeOrderDetail = sourceCodeOrderDetail; detailToReturn.EventCustomerOrderDetail = eventCustomerOrderDetail; detailToReturn.ShippingDetailOrderDetails = shippingDetailsOrderDetail; return(detailToReturn); }
private void GetEventCustomerInfo(LinqMetaData linqMetaData, IEnumerable <OrderDetail> orderDetails) { IEnumerable <long> orderDetailIds = orderDetails.Select(ode => ode.Id); IEnumerable <EventCustomerOrderDetailEntity> eventCustomersInOrder = linqMetaData. EventCustomerOrderDetail.Where(ecod => orderDetailIds.Contains(ecod.OrderDetailId) && ecod.IsActive); foreach (var eventCustomerInOrder in eventCustomersInOrder) { EventCustomerOrderDetail eventCustomerOrderDetail = _eventCustomerOrderDetailMapper.Map(eventCustomerInOrder); OrderDetail orderDetail = orderDetails. Where(od => od.Id == eventCustomerOrderDetail.OrderDetailId).Single(); orderDetail.EventCustomerOrderDetail = eventCustomerOrderDetail; } }
// TODO: Once order system is refactored this method will have to be rewritten. public Order SynchronizeOrder(Order oldOrder, Order newOrder, SourceCodeOrderDetail newSourceCodeOrderDetail) { if (oldOrder.OrderDetails.IsNullOrEmpty()) { return(newOrder); } var newOrderDetails = new List <OrderDetail>(); newOrder.OrderDetails.ForEach(newOrderDetails.Add); var newOrderItemIds = newOrderDetails.Select(od => od.OrderItemId); var newOrderDetailCreator = newOrderDetails.First().DataRecorderMetaData.DataRecorderCreator.Id; var oldOrderDetails = oldOrder.OrderDetails; var oldOrderItemIds = oldOrderDetails.Select(od => od.OrderItemId); newOrder.OrderDetails.Clear(); var alreadyCancelledOrderDetails = oldOrderDetails.Where( ood => !ood.IsCompleted || (ood.DetailType != OrderItemType.EventPackageItem && ood.DetailType != OrderItemType.EventTestItem && ood.DetailType != OrderItemType.ProductItem)) .ToList(); var alreadyCancelledOrderItemIds = alreadyCancelledOrderDetails.Select(od => od.OrderItemId); newOrder.OrderDetails.AddRange(alreadyCancelledOrderDetails); // It will give the line items which still exists for the order. var existingOrderDetails = newOrderDetails.Join(oldOrderDetails, nod => nod.OrderItemId, ood => ood.OrderItemId, (nod, ood) => ood); newOrder.OrderDetails.AddRange(existingOrderDetails); // It will give the line items which does not exist for the order. var nonExistingOrderDetails = oldOrderDetails.Where( eod => !newOrderItemIds.Contains(eod.OrderItemId) && eod.IsCompleted && (eod.DetailType == OrderItemType.EventPackageItem || eod.DetailType == OrderItemType.EventTestItem)); EventCustomerOrderDetail eventCustomerOrderDetail = null; List <ShippingDetailOrderDetail> shippingDetailOrderDetails = null; foreach (var nonExistingOrderDetail in nonExistingOrderDetails) { if (nonExistingOrderDetail.EventCustomerOrderDetail != null) { eventCustomerOrderDetail = new EventCustomerOrderDetail { EventCustomerId = nonExistingOrderDetail.EventCustomerOrderDetail. EventCustomerId, IsActive = true, OrderDetailId = 0 }; if (!nonExistingOrderDetail.ShippingDetailOrderDetails.IsNullOrEmpty()) { if (shippingDetailOrderDetails.IsNullOrEmpty()) { shippingDetailOrderDetails = new List <ShippingDetailOrderDetail>(); } foreach (var shippingDetailOrderDetail in nonExistingOrderDetail.ShippingDetailOrderDetails) { if (shippingDetailOrderDetails != null) { shippingDetailOrderDetails.Add(new ShippingDetailOrderDetail { ShippingDetailId = shippingDetailOrderDetail.ShippingDetailId, IsActive = true }); } } } shippingDetailOrderDetails = nonExistingOrderDetail.ShippingDetailOrderDetails; shippingDetailOrderDetails.ForEach(sdod => sdod.OrderDetailId = 0); } var cancelledOrderDetail = _orderDetailFactory.CreateNewOrderDetail(nonExistingOrderDetail, nonExistingOrderDetail. ForOrganizationRoleUserId, newOrderDetailCreator); newOrder.OrderDetails.Add(nonExistingOrderDetail); newOrder.OrderDetails.Add(cancelledOrderDetail); } // It will give the line items which are new for this order. var freshOrderDetails = newOrderDetails.Where(nod => !oldOrderItemIds.Contains(nod.OrderItemId)).ToList(); var alreadyAddedOrderItems = newOrder.OrderDetails.Where(od => od.IsCompleted).Select(nod => nod.OrderItemId); // Items which were cancelled earlier and are made active again. var cancelledOrderDetailsToBeRevived = newOrderDetails.Where( nod => alreadyCancelledOrderItemIds.Contains(nod.OrderItemId) && nod.IsCompleted && !alreadyAddedOrderItems.Contains(nod.OrderItemId)); newOrder.OrderDetails.AddRange(cancelledOrderDetailsToBeRevived); newOrder.OrderDetails.AddRange(freshOrderDetails); if (eventCustomerOrderDetail != null) { var currentActiveOrderDetail = newOrder.OrderDetails.SingleOrDefault( od => od.SourceCodeOrderDetail != null && od.OrderItemStatus.OrderStatusState == OrderStatusState.FinalSuccess) ?? newOrder.OrderDetails.First( od => od.OrderItemStatus.OrderStatusState == OrderStatusState.FinalSuccess && (od.DetailType == OrderItemType.EventPackageItem || od.DetailType == OrderItemType.EventTestItem)); newOrder.OrderDetails.Remove(currentActiveOrderDetail); currentActiveOrderDetail.EventCustomerOrderDetail = eventCustomerOrderDetail; currentActiveOrderDetail.ShippingDetailOrderDetails = shippingDetailOrderDetails; currentActiveOrderDetail.SourceCodeOrderDetail = newSourceCodeOrderDetail; newOrder.OrderDetails.Add(currentActiveOrderDetail); } else { var currentActiveOrderDetail = newOrder.OrderDetails.SingleOrDefault( od => od.EventCustomerOrderDetail != null && od.OrderItemStatus.OrderStatusState == OrderStatusState.FinalSuccess); newOrder.OrderDetails.Remove(currentActiveOrderDetail); if (newSourceCodeOrderDetail != null) { currentActiveOrderDetail.SourceCodeOrderDetail = newSourceCodeOrderDetail; newSourceCodeOrderDetail.OrderDetailId = currentActiveOrderDetail.Id; } newOrder.OrderDetails.Add(currentActiveOrderDetail); } foreach (var orderDetail in newOrder.OrderDetails) { if (orderDetail.IsCompleted) { var newOrderDetail = newOrderDetails.SingleOrDefault(od => od.OrderItemId == orderDetail.OrderItemId); if (newOrderDetail != null) { orderDetail.Price = newOrderDetail.Price; } } } return(newOrder); }
public OrderDetail CreateNewOrderDetail(IOrderable orderable, int quantity, long forOrganizationRoleUserId, long dataRecorderCreatorId, SourceCode sourceCode, EventCustomer eventCustomer, ShippingDetail shippingDetail, long?sourceId = null) { if (orderable == null) { throw new ArgumentNullException("orderable"); } if (orderable.Id == 0) { throw new InvalidOperationException("itemToOrder must already exist in the database."); } if (quantity < 1) { throw new ArgumentOutOfRangeException("quantity", "The quantity must be at least 1."); } DataRecorderMetaData dataRecorderMetaData = _dataRecorderMetaDataFactory. CreateDataRecorderMetaData(dataRecorderCreatorId); OrderItemStatus orderItemStatus = _orderItemStatusFactory.CreateOrderItemStatus(orderable. OrderItemType, (int)OrderStatusState.Initial); decimal price = orderable.Price; // TODO: Test source code logic. SourceCodeOrderDetail sourceCodeOrderDetail = null; if (sourceCode != null) { sourceCodeOrderDetail = new SourceCodeOrderDetail { Amount = sourceCode.CouponValue, SourceCodeId = sourceCode.Id, IsActive = true, OrganizationRoleUserCreatorId = dataRecorderMetaData.DataRecorderCreator.Id }; } EventCustomerOrderDetail eventCustomerOrderDetail = null; if (eventCustomer != null) { eventCustomerOrderDetail = new EventCustomerOrderDetail { EventCustomerId = eventCustomer.Id, IsActive = true }; } ShippingDetailOrderDetail shippingDetailOrderDetail = null; if (shippingDetail != null) { shippingDetailOrderDetail = new ShippingDetailOrderDetail { ShippingDetailId = shippingDetail.Id, IsActive = true }; } return(new OrderDetail { Description = orderable.Description, Price = price, Quantity = quantity, DetailType = orderable.OrderItemType, DataRecorderMetaData = dataRecorderMetaData, ForOrganizationRoleUserId = forOrganizationRoleUserId, OrderItemStatus = orderItemStatus, SourceCodeOrderDetail = sourceCodeOrderDetail, EventCustomerOrderDetail = eventCustomerOrderDetail, ShippingDetailOrderDetails = new List <ShippingDetailOrderDetail> { shippingDetailOrderDetail }, SourceId = sourceId }); }