public static void CancelOrder(IUnitOfWork db,
                                       ILogService log,
                                       ITime time,
                                       ISystemActionService actionService,
                                       IOrderHistoryService orderHistoryService,
                                       long orderId,
                                       long?by)
        {
            var dbOrder = db.Orders.Get(orderId);

            if (dbOrder != null)
            {
                var orderItems = db.OrderItemSources.GetWithListingInfo().Where(oi => oi.OrderId == orderId).ToList();
                var itemIdList = orderItems.Where(oi => !String.IsNullOrEmpty(oi.SourceMarketId))
                                 .Select(oi => oi.SourceMarketId)
                                 .ToList();

                log.Info("Items to cancel: " + String.Join(";", itemIdList));

                db.OrderNotifies.Add(new OrderNotify()
                {
                    OrderId    = dbOrder.Id,
                    Type       = (int)OrderNotifyType.CancellationRequest,
                    Status     = 1,
                    Message    = "Email cancelation from web page",
                    CreateDate = time.GetAppNowTime(),
                });
                db.Commit();

                orderHistoryService.AddRecord(dbOrder.Id, OrderHistoryHelper.CancellationRequestKey, null, true, by);

                SystemActionHelper.AddCancelationActionSequences(db,
                                                                 actionService,
                                                                 dbOrder.Id,
                                                                 dbOrder.AmazonIdentifier,
                                                                 String.Join(";", itemIdList),
                                                                 null,
                                                                 null,
                                                                 null,
                                                                 null,
                                                                 by,
                                                                 CancelReasonType.Manually);
            }
        }
예제 #2
0
        public void CheckRemovedOrder(IUnitOfWork db,
                                      ILogService log,
                                      ISystemActionService systemAction,
                                      Order order,
                                      long?toBatchId,
                                      long?by)
        {
            log.Info("CheckRemovedOrder");

            var orderNumber     = order.AmazonIdentifier;
            var customerOrderId = order.CustomerOrderId;
            var buyerEmail      = order.BuyerEmail;

            //NOTE: when remove from batch if has cancellation request process them
            var cancelationRequests = db.OrderNotifies.GetAll().Where(o => o.OrderId == order.Id && o.Type == (int)OrderNotifyType.CancellationRequest).ToList();

            if (cancelationRequests.Any() &&
                toBatchId == null)    //Move to Order Page
            {
                log.Info("Order status was changed to Canceled, orderNumber=" + orderNumber);

                var itemIdList = cancelationRequests
                                 .Where(r => !String.IsNullOrEmpty(r.Params))
                                 .Select(r => r.Params)
                                 .Distinct();
                SystemActionHelper.AddCancelationActionSequences(db,
                                                                 systemAction,
                                                                 order.Id,
                                                                 orderNumber,
                                                                 String.Join(";", itemIdList),
                                                                 null,
                                                                 null,
                                                                 null,
                                                                 null,
                                                                 by,
                                                                 CancelReasonType.PerBuyerRequest);

                order.OrderStatus = OrderStatusEnumEx.Canceled;

                db.Commit();
            }
        }
예제 #3
0
        private void CancelOrder(IUnitOfWork db,
                                 EmailReadingResult result,
                                 string orderNumber,
                                 Order order)
        {
            if (!String.IsNullOrEmpty(orderNumber))
            {
                var itemId = EmailHelper.ExtractWalmartItemId(result.Email.Message);

                _log.Info("ItemId=" + itemId);

                var existCancellationActions = _systemAction.GetByTypeAndTag(db,
                                                                             SystemActionType.UpdateOnMarketCancelOrder, orderNumber);
                var isExistCancelRequest = existCancellationActions.Any();

                if (existCancellationActions.Any() &&
                    order != null &&
                    (order.Market == (int)MarketType.Walmart ||
                     order.Market == (int)MarketType.WalmartCA))   //NOTE: for Walmart checking by item cancallation
                {
                    var existItemCancallation = false;
                    foreach (var action in existCancellationActions)
                    {
                        var data = JsonConvert.DeserializeObject <CancelOrderInput>(action.InputData);
                        if (data.ItemId == itemId)
                        {
                            existItemCancallation = true;
                        }
                    }
                    isExistCancelRequest = existItemCancallation;
                }

                if (!isExistCancelRequest)
                {
                    result.WasEmailProcessed = true;
                    _log.Info("CancellationEmailRule, WasEmailProcessed=" + result.WasEmailProcessed);

                    var comment = "";

                    //NOTE: "system to cancel that order if it wasn’t shipped and it’s not assigned to Active Batch yet, and send client an email"
                    //NOTE: if no order in system
                    if (order == null ||
                        ((order.OrderStatus == OrderStatusEnumEx.Unshipped ||
                          order.OrderStatus == OrderStatusEnumEx.Pending ||
                          order.OrderStatus == OrderStatusEnumEx.Canceled) &&
                         !order.BatchId.HasValue))
                    {
                        _log.Info("Order status was changed to Canceled, orderNumber=" + orderNumber);

                        SystemActionHelper.AddCancelationActionSequences(db,
                                                                         _systemAction,
                                                                         order.Id,
                                                                         orderNumber,
                                                                         itemId,
                                                                         result.Email.Id,
                                                                         result.Email.From,
                                                                         (order != null && (order.Market == (int)MarketType.Walmart || order.Market == (int)MarketType.WalmartCA)) ? result.Email.Subject : null,
                                                                         EmailHelper.ExtractShortMessageBody(result.Email.Message, 200, true),
                                                                         null,
                                                                         CancelReasonType.PerBuyerRequest);

                        if (order != null && order.Market != (int)MarketType.Walmart && order.Market != (int)MarketType.WalmartCA)
                        //NOTE: Exclude Walmart, cancellation happen only for one item
                        {
                            order.OrderStatus = OrderStatusEnumEx.Canceled;
                        }
                        //if (order != null && (order.Market == (int) MarketType.Walmart || order.Market == (int)MarketType.WalmartCA))
                        //{
                        //    if (!order.BatchId.HasValue) //Only when not in batch
                        //    {
                        //        var orderItemLineCount = db.OrderItems.GetByOrderIdAsDto(order.Id).Count();
                        //        if (orderItemLineCount > 1)
                        //        {
                        //            _log.Info("Walmart Order set OnHold, in case it has more then one item line = " + orderItemLineCount);
                        //            order.OnHold = true;

                        //            db.OrderComments.Add(new OrderComment()
                        //            {
                        //                OrderId = order.Id,
                        //                Message = String.Format("[System] Partial email cancellation request, 1 / {0} order lines", orderItemLineCount),
                        //                Type = (int)CommentType.ReturnExchange,
                        //                LinkedEmailId = result.Email.Id,
                        //                CreateDate = _time.GetAppNowTime(),
                        //                UpdateDate = _time.GetAppNowTime(),
                        //            });
                        //        }
                        //    }
                        //}

                        if (order != null)
                        {
                            comment = "Marked as cancelled + emailed";

                            db.OrderNotifies.Add(new OrderNotify()
                            {
                                OrderId    = order.Id,
                                Status     = 1,
                                Type       = (int)OrderNotifyType.CancellationRequest,
                                Params     = itemId,
                                Message    = "Email cancelation request in progress",
                                CreateDate = _time.GetAppNowTime(),
                            });
                        }
                    }
                    else
                    {
                        var commentText =
                            "[System] Email cancelation request wasn't processed. Order already shipped.";

                        if (order.OrderStatus != OrderStatusEnumEx.Shipped)
                        {
                            db.OrderNotifies.Add(new OrderNotify()
                            {
                                OrderId    = order.Id,
                                Status     = 1,
                                Type       = (int)OrderNotifyType.CancellationRequest,
                                Params     = itemId,
                                Message    = "Email cancelation request, order in batch",
                                CreateDate = _time.GetAppNowTime(),
                            });
                        }
                        else
                        {
                            _systemAction.AddAction(db,
                                                    SystemActionType.SendEmail,
                                                    orderNumber,
                                                    new SendEmailInput()
                            {
                                EmailType      = EmailTypes.RejectOrderCancellationToBuyer,
                                OrderId        = orderNumber,
                                ReplyToEmail   = result.Email.From,
                                ReplyToSubject = result.Email.Subject,
                            },
                                                    null,
                                                    null);

                            commentText += " Email was sent to customer.";
                        }

                        db.OrderComments.Add(new OrderComment()
                        {
                            OrderId       = order.Id,
                            Message       = commentText,
                            Type          = (int)CommentType.ReturnExchange,
                            LinkedEmailId = result.Email.Id,
                            CreateDate    = _time.GetAppNowTime(),
                            UpdateDate    = _time.GetAppNowTime(),
                        });

                        comment = "Cancellation skipped";
                    }

                    db.OrderEmailNotifies.Add(new OrderEmailNotify()
                    {
                        OrderNumber = orderNumber,
                        Type        = (int)OrderEmailNotifyType.InputOrderCancelledEmail,
                        Reason      = comment,
                        CreateDate  = _time.GetUtcTime()
                    });

                    db.Commit();
                }
                else
                {
                    _log.Info("Repeated OrderCancellation email, no action");
                }
            }
            else
            {
                _log.Info("Can't OrderCancellation, no order number!");
            }
        }