Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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;
            }
        }
Ejemplo n.º 3
0
        // 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);
        }
Ejemplo n.º 4
0
        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
            });
        }