public void RefreshSuspiciousFedexRates()
        {
            var syncInfo = new EmptySyncInformer(_log, SyncType.Orders);

            using (var db = _dbFactory.GetRWDb())
            {
                var toRefreshOrderIds = (from o in db.Orders.GetAll()
                                         join sh in db.OrderShippingInfos.GetAll() on o.Id equals sh.OrderId
                                         where o.OrderStatus == OrderStatusEnumEx.Unshipped &&
                                         sh.IsActive &&
                                         (sh.ShippingMethodId == ShippingUtils.FedexOneRate2DayEnvelope ||
                                          sh.ShippingMethodId == ShippingUtils.FedexOneRate2DayPak) &&
                                         sh.StampsShippingCost > 12
                                         select o.Id).ToList();

                _log.Info("Orders to update: " + String.Join(", ", toRefreshOrderIds.Select(o => o).ToList()));

                var orderIdList = toRefreshOrderIds.ToArray();
                if (!orderIdList.Any())
                {
                    return;
                }

                IList <DTOOrder> dtoOrders = db.ItemOrderMappings.GetSelectedOrdersWithItems(_weightService, orderIdList, includeSourceItems: true).ToList();
                foreach (var dtoOrder in dtoOrders)
                {
                    //Ignore shipped orders
                    if (ShippingUtils.IsOrderShipped(dtoOrder.OrderStatus) ||
                        dtoOrder.ShippingInfos.Any(s => !String.IsNullOrEmpty(s.LabelPath)) ||
                        dtoOrder.ShippingInfos.Any(s => !String.IsNullOrEmpty(s.TrackingNumber)))
                    {
                        _log.Info("OrderId: " + dtoOrder.Id + " (" + dtoOrder.OrderId + ") - Skipped (has shipped status or has tr#)");
                    }
                    else
                    {
                        _log.Info("Add recalc action for OrderId=" + dtoOrder.OrderId);

                        _actionService.AddAction(db,
                                                 SystemActionType.UpdateRates,
                                                 dtoOrder.OrderId,
                                                 new UpdateRatesInput()
                        {
                            OrderId = dtoOrder.Id
                        },
                                                 null,
                                                 null);
                    }
                }
            }
        }
        public CheckResult Check(IUnitOfWork db, DTOMarketOrder order, IList <ListingOrderDTO> items)
        {
            if (order.OrderStatus == OrderStatusEnumEx.Shipped)
            {
                var existHasCancellation = db.OrderNotifies.IsExist(order.Id, OrderNotifyType.CancellationRequest);
                if (existHasCancellation)
                {
                    if (!db.OrderEmailNotifies.IsExist(order.OrderId,
                                                       OrderEmailNotifyType.OutputRejectedOrderCancelledEmailToBuyer))
                    {
                        _systemAction.AddAction(db,
                                                SystemActionType.SendEmail,
                                                order.OrderId,
                                                new SendEmailInput()
                        {
                            EmailType = EmailTypes.RejectOrderCancellationToBuyer,
                            OrderId   = order.OrderId,
                        },
                                                null,
                                                null);
                    }
                }
                return(new CheckResult()
                {
                    IsSuccess = false
                });
            }

            return(new CheckResult()
            {
                IsSuccess = true
            });
        }
        public void ProcessReturns(IUnitOfWork db)
        {
            var returnsResult = _api.GetReturns();

            if (returnsResult.IsSuccess)
            {
                foreach (var returnDetail in returnsResult.Data)
                {
                    var tag = returnDetail.OrderNumber;
                    var existSystemAction = db.SystemActions.GetAllAsDto().FirstOrDefault(a => a.Tag == tag);
                    if (existSystemAction == null)
                    {
                        _log.Info("Jet: new return request, orderNumber=" + returnDetail.OrderNumber + ", SKU=" + returnDetail.SKU);
                        _emailService.SendSystemEmail("Jet: new return request, orderNumber: " + returnDetail.OrderNumber,
                                                      "SKU: " + returnDetail.SKU + " x " + returnDetail.Quantity + " - Requested Amount: $" + returnDetail.RequestedRefundAmount + " - Reason: " + returnDetail.Reason,
                                                      EmailHelper.RafiEmail,
                                                      EmailHelper.SupportDgtexEmail);

                        _actionService.AddAction(db,
                                                 SystemActionType.UpdateOnMarketReturnOrder,
                                                 tag,
                                                 new ReturnOrderInput()
                        {
                        },
                                                 null,
                                                 null);
                    }
                }
            }
        }
        public void PurchaseForOverdue()
        {
            var when = _time.GetAppNowTime();
            var date = when.AddHours(-4).Date;

            using (var db = _dbFactory.GetRWDb())
            {
                var overdueOrderIds = GetOverdueOrderInfos(db, _time.GetAppNowTime()).Select(i => i.OrderId).ToList();

                _log.Info("Overdue orders count=" + overdueOrderIds.Count);

                if (overdueOrderIds.Count > 5) //NOTE: print only when a lot of overdue
                {
                    var orderIdList = overdueOrderIds;
                    var batchName   = date.ToString("MM/dd/yyyy") + " Overdue";

                    var batchId = _batchManager.CreateBatch(db,
                                                            BatchType.AutoBuy,
                                                            batchName,
                                                            orderIdList,
                                                            when,
                                                            null);

                    _batchManager.LockBatch(db,
                                            batchId,
                                            when);

                    var actionId = _actionService.AddAction(db,
                                                            SystemActionType.PrintBatch,
                                                            batchId.ToString(),
                                                            new PrintBatchInput()
                    {
                        BatchId   = batchId,
                        CompanyId = _companyId,
                        UserId    = null
                    },
                                                            null,
                                                            null);

                    _log.Info("PrintLabelsForBatch, add print action, id=" + actionId);
                }
            }
        }
Beispiel #5
0
 public static void RequestRelationshipUpdates(
     IUnitOfWork db,
     ISystemActionService systemAction,
     long itemId,
     long?by)
 {
     systemAction.AddAction(db,
                            SystemActionType.UpdateOnMarketProductRelationship,
                            itemId.ToString(),
                            null,
                            null,
                            by);
 }
Beispiel #6
0
 public static void RequestPriceRecalculation(
     IUnitOfWork db,
     ISystemActionService systemAction,
     long listingId,
     long?by)
 {
     systemAction.AddAction(
         db,
         SystemActionType.ListingPriceRecalculation,
         listingId.ToString(),
         null,
         null,
         by);
 }
Beispiel #7
0
 public static void RequestQuantityDistribution(
     IUnitOfWork db,
     ISystemActionService systemAction,
     long[] styleIdList,
     long?by)
 {
     systemAction.AddAction(db,
                            SystemActionType.QuantityDistribute,
                            null,
                            new QuantityDistributeInput()
     {
         StyleIdList = styleIdList,
     },
                            null,
                            by);
 }
Beispiel #8
0
        //public static void RequestImageUpdates(
        //    IUnitOfWork db,
        //    ISystemActionService systemAction,
        //    long itemId,
        //    long? by)
        //{
        //    RequestImageUpdates(db, systemAction, new List<long>() { itemId }, by);
        //}

        //public static void RequestImageUpdates(
        //    IUnitOfWork db,
        //    ISystemActionService systemAction,
        //    IList<long> itemIds,
        //    long? by)
        //{
        //    foreach (var itemId in itemIds)
        //    {
        //        systemAction.AddAction(db,
        //            SystemActionType.UpdateOnMarketProductImage,
        //            itemId.ToString(),
        //            null,
        //            null,
        //            by);
        //    }
        //}

        public static void RequestItemTitleUpdates(
            IUnitOfWork db,
            ISystemActionService systemAction,
            IList <int> itemIds,
            long?by)
        {
            foreach (var itemId in itemIds)
            {
                systemAction.AddAction(db,
                                       SystemActionType.UpdateOnMarketProductTitle,
                                       itemId.ToString(),
                                       null,
                                       null,
                                       by);
            }
        }
Beispiel #9
0
 public static void RequestPriceRuleUpdates(
     IUnitOfWork db,
     ISystemActionService systemAction,
     IList <string> skuList,
     long?by)
 {
     foreach (var sku in skuList)
     {
         systemAction.AddAction(db,
                                SystemActionType.UpdateOnMarketProductPriceRule,
                                sku,
                                null,
                                null,
                                by);
     }
 }
Beispiel #10
0
 public static void RequestUpdateCache(
     IUnitOfWork db,
     ISystemActionService systemAction,
     long styleId,
     long?by)
 {
     systemAction.AddAction(db,
                            SystemActionType.UpdateCache,
                            null,
                            new UpdateCacheInput()
     {
         StyleIdList = new List <long>()
         {
             styleId
         },
     },
                            null,
                            by);
 }
Beispiel #11
0
 public static void RequestItemBarcodeUpdates(
     IUnitOfWork db,
     ISystemActionService systemAction,
     IList <int> itemIds,
     string newBarcode,
     long?by)
 {
     foreach (var itemId in itemIds)
     {
         systemAction.AddAction(db,
                                SystemActionType.UpdateOnMarketProductBarcode,
                                itemId.ToString(),
                                new UpdateProductBarcodeInput()
         {
             NewBarcode = newBarcode
         },
                                null,
                                by);
     }
 }
Beispiel #12
0
        public static CallMessagesResultVoid Add(IUnitOfWork db,
                                                 ISystemActionService actionService,
                                                 UploadOrderFeedViewModel model,
                                                 long?by)
        {
            actionService.AddAction(db,
                                    SystemActionType.ProcessUploadOrderFeed,
                                    "",
                                    new PublishFeedInput()
            {
                FileName        = model.FileName,
                FieldMappingsId = model.FieldMappingsId,
            },
                                    null,
                                    by);

            db.Commit();

            return(CallMessagesResultVoid.Success());
        }
Beispiel #13
0
 public static void RequestRemoveTagUpdates(
     IUnitOfWork db,
     ISystemActionService systemAction,
     IList <long> styleIds,
     string tag,
     long?by)
 {
     foreach (var styleId in styleIds)
     {
         systemAction.AddAction(db,
                                SystemActionType.UpdateOnMarketProductTags,
                                styleId.ToString(),
                                new UpdateProductTagsInput()
         {
             Action = UpdateProductTagsInput.DELETE_ACTION,
             Tags   = new List <string>()
             {
                 tag
             }
         },
                                null,
                                by);
     }
 }
Beispiel #14
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!");
            }
        }
Beispiel #15
0
        public static void AddCancelationActionSequences(
            IUnitOfWork db,
            ISystemActionService systemAction,
            long orderId,
            string orderNumber,
            string itemId,
            long?emailId,
            string replyToEmail,
            string replyToSubject,
            string replyToShortBody,
            long?by,
            CancelReasonType reasonType)
        {
            var cancelOrderActionId = systemAction.AddAction(db,
                                                             SystemActionType.UpdateOnMarketCancelOrder,
                                                             orderNumber,
                                                             new CancelOrderInput()
            {
                OrderNumber = orderNumber,
                ItemId      = itemId,
            },
                                                             null,
                                                             by);

            if (reasonType == CancelReasonType.PerBuyerRequest)
            {
                systemAction.AddAction(db,
                                       SystemActionType.SendEmail,
                                       orderNumber,
                                       new SendEmailInput()
                {
                    EmailType      = EmailTypes.AcceptOrderCancellationToBuyer,
                    OrderEntityId  = orderId,
                    OrderId        = orderNumber,
                    ReplyToEmail   = replyToEmail,
                    ReplyToSubject = replyToSubject,
                },
                                       cancelOrderActionId,
                                       by);

                //systemAction.AddAction(db,
                //    SystemActionType.SendEmail,
                //    orderNumber,
                //    new SendEmailInput()
                //    {
                //        EmailType = EmailTypes.AcceptOrderCancellationToSeller,
                //        OrderEntityId = orderId,
                //        OrderId = orderNumber,
                //        Args = new Dictionary<string, string>()
                //                                {
                //                                                {
                //                                                    "SourceMessage",
                //                                                    replyToShortBody
                //                                                }
                //                                }
                //    },
                //    cancelOrderActionId,
                //    by);
            }

            var commentText = reasonType == CancelReasonType.PerBuyerRequest
                ? "[System] Order was canceled per buyer request"
                : "[System] Manually canceled";

            systemAction.AddAction(db,
                                   SystemActionType.AddComment,
                                   orderNumber,
                                   new AddCommentInput()
            {
                OrderId       = orderId,
                OrderNumber   = orderNumber,
                Message       = commentText,
                Type          = (int)CommentType.ReturnExchange,
                LinkedEmailId = emailId,
                By            = by,
            },
                                   cancelOrderActionId,
                                   by);
        }
Beispiel #16
0
        public void Process(IUnitOfWork db, EmailReadingResult result)
        {
            if (result.Status == EmailMatchingResultStatus.New &&
                result.HasMatches)
            {
                var noHtml  = StringHelper.TrimTags(result.Email.Message ?? "");
                var message = StringHelper.Substring(noHtml, 70).ToLower();
                //to remove the signature confirmation
                var removeSignConfirmation =
                    message.IndexOf("remove signature confirmation", StringComparison.OrdinalIgnoreCase) >= 0 ||
                    message.IndexOf("remove signature", StringComparison.OrdinalIgnoreCase) >= 0 ||
                    message.IndexOf("remove the signature", StringComparison.OrdinalIgnoreCase) >= 0;

                if (removeSignConfirmation)
                {
                    var orderNumber = result.MatchedIdList.FirstOrDefault();
                    _log.Info("Received RemoveSignatureConfirmation request, orderNumber=" + orderNumber);

                    if (!String.IsNullOrEmpty(orderNumber))
                    {
                        var isExistRemoveSignConfirmation = db.OrderEmailNotifies.IsExist(orderNumber,
                                                                                          OrderEmailNotifyType.InputRemoveSignConfirmationEmail);
                        if (!isExistRemoveSignConfirmation) //NOTE: First remove sign confirmation request
                        {
                            result.WasEmailProcessed = true;
                            _log.Info("RemoveSignatureEmailRule, WasEmailProcessed=" + result.WasEmailProcessed);

                            var comment = String.Empty;
                            var order   = db.Orders.GetByOrderNumber(orderNumber);
                            //var now = _time.GetAppNowTime();
                            //var isWeekday = db.Dates.IsWorkday(_time.GetAppNowTime());

                            if (order.OrderStatus == OrderStatusEnumEx.Shipped
                                //|| (isWeekday && now.Hour > 15)
                                )
                            {
                                //comment = "Skipped. Order already shipped or request came after 3PM on weekday";
                                var commentText = "";
                                if (order.OrderStatus == OrderStatusEnumEx.Shipped)
                                {
                                    commentText = "[System] Remove signature confirmation request came after the order shipped";
                                    comment     = "Skipped. Order already shipped";
                                }
                                //if (isWeekday && now.Hour > 15)
                                //{
                                //    commentText = "[System] Remove signature confirmation request came after 3PM on weekday";
                                //    comment = "Skipped. Request came after 3PM on weekday";
                                //}
                                db.OrderComments.Add(new OrderComment()
                                {
                                    OrderId    = order.Id,
                                    Message    = commentText,
                                    Type       = (int)CommentType.Address,
                                    CreateDate = _time.GetAppNowTime(),
                                    UpdateDate = _time.GetAppNowTime()
                                });

                                var emailInfo = new RejectRemoveSignConfirmationEmailInfo(_emailService.AddressService,
                                                                                          null,
                                                                                          orderNumber,
                                                                                          (MarketType)order.Market,
                                                                                          order.BuyerName,
                                                                                          order.BuyerEmail);

                                _emailService.SendEmail(emailInfo, CallSource.Service);
                            }
                            else
                            {
                                //Tring to remove signature

                                if (order.OrderStatus == OrderStatusEnumEx.Unshipped ||
                                    order.OrderStatus == OrderStatusEnumEx.PartiallyShipped ||
                                    order.OrderStatus == OrderStatusEnumEx.Pending)
                                {
                                    if (order.IsSignConfirmation)
                                    {
                                        order.IsSignConfirmation = false;
                                        _log.Info("Updated IsSignConfirmation=false, orderNumber=" + order.AmazonIdentifier);

                                        db.OrderComments.Add(new OrderComment()
                                        {
                                            OrderId    = order.Id,
                                            Message    = "[System] Signature confirmation was removed per buyer request",
                                            Type       = (int)CommentType.Address,
                                            CreateDate = _time.GetAppNowTime(),
                                            UpdateDate = _time.GetAppNowTime()
                                        });

                                        _actionService.AddAction(db,
                                                                 SystemActionType.UpdateRates,
                                                                 order.AmazonIdentifier,
                                                                 new UpdateRatesInput()
                                        {
                                            OrderId = order.Id
                                        },
                                                                 null,
                                                                 null);

                                        var orderItems = db.Listings.GetOrderItems(order.Id);
                                        var emailInfo  = new AcceptRemoveSignConfirmationEmailInfo(_emailService.AddressService,
                                                                                                   null,
                                                                                                   orderNumber,
                                                                                                   (MarketType)order.Market,
                                                                                                   orderItems,
                                                                                                   order.BuyerName,
                                                                                                   order.BuyerEmail);

                                        _emailService.SendEmail(emailInfo, CallSource.Service);

                                        comment = "Sign confirmation removed + emailed";
                                    }
                                    else
                                    {
                                        db.OrderComments.Add(new OrderComment()
                                        {
                                            OrderId    = order.Id,
                                            Message    = "[System] Remove signature confirmation request skipped. Signature confirmation was already removed",
                                            Type       = (int)CommentType.Address,
                                            CreateDate = _time.GetAppNowTime(),
                                            UpdateDate = _time.GetAppNowTime()
                                        });

                                        comment = "Skipped. Already removed";
                                    }
                                }
                                else
                                {
                                    //NOTE: If OrderStatus=Canceled
                                    comment = "Skipped. Order status=" + order.OrderStatus;
                                }
                            }

                            var dbBuyer = db.Buyers.GetFiltered(b => b.Email == result.Email.From).FirstOrDefault();
                            if (dbBuyer != null)
                            {
                                dbBuyer.RemoveSignConfirmation     = true;
                                dbBuyer.RemoveSignConfirmationDate = _time.GetUtcTime();
                                _log.Info("Set RemoveSignConfirmation=true, buyerEmail=" + result.Email.From);
                            }
                            else
                            {
                                _log.Info("Can't find buyerEmail=" + result.Email.From);
                            }

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

                            db.Commit();
                        }
                        else
                        {
                            _log.Info("Repeated RemoveSignConfirmation email, no action");
                        }
                    }
                    else
                    {
                        _log.Info("Can't RemoveSignConfirmation, no matching orders!");
                    }
                }
            }
        }
        public void Process(IUnitOfWork db, EmailReadingResult result)
        {
            if (result.Status == EmailMatchingResultStatus.New &&
                result.HasMatches)
            {
                var subject = result.Email.Subject ?? "";
                if (EmailHelper.IsAutoCommunicationAddress(result.Email.From) &&
                    subject.StartsWith("Your e-mail to"))
                {
                    return; //NOTE: Skip processing our emails to customer
                }

                _log.Info("AddCommentEmailRule, WasEmailProcessed=" + result.WasEmailProcessed);
                if (!result.WasEmailProcessed)
                {
                    //var orderNumber = result.MatchedIdList.FirstOrDefault();
                    var orders = db.Orders.GetAllByCustomerOrderNumbers(result.MatchedIdList);

                    var message = " > " + EmailHelper.ExtractShortSubject(result.Email.Subject);
                    message += " > " + EmailHelper.ExtractShortMessageBody(result.Email.Message, 200, true);
                    var commentText = "Customers Email" + message;
                    commentText = StringHelper.Substring(commentText, 110);

                    if (orders.Any())
                    {
                        foreach (var order in orders)
                        {
                            if ((order.OrderStatus == OrderStatusEnumEx.Unshipped ||
                                 order.OrderStatus == OrderStatusEnumEx.Pending))
                            {
                                db.OrderComments.Add(new OrderComment()
                                {
                                    OrderId       = order.Id,
                                    Message       = commentText,
                                    Type          = (int)CommentType.IncomingEmail,
                                    LinkedEmailId = result.Email.Id,
                                    CreateDate    = _time.GetAppNowTime(),
                                    UpdateDate    = _time.GetAppNowTime()
                                });

                                OrderBatchDTO batch = null;
                                if (order.BatchId.HasValue)
                                {
                                    batch = db.OrderBatches.GetAsDto(order.BatchId.Value);
                                }

                                if (batch == null || !batch.IsLocked) //Exclude set onHold to orders in locked batch
                                {
                                    order.OnHold           = true;
                                    order.OnHoldUpdateDate = _time.GetAppNowTime();
                                }

                                db.Commit();

                                _log.Info("Comment was added, orderId=" + order.AmazonIdentifier
                                          + ", customerOrderId=" + order.CustomerOrderId
                                          + ", comment=" + commentText);
                            }
                        }
                    }
                    else
                    {
                        _log.Info("No exist orders");
                        foreach (var orderNumber in result.MatchedIdList)
                        {
                            _log.Info("Action add comment was added, orderId=" + orderNumber);
                            _actionService.AddAction(db,
                                                     SystemActionType.AddComment,
                                                     orderNumber,
                                                     new AddCommentInput()
                            {
                                OrderNumber   = orderNumber,
                                Message       = message,
                                Type          = (int)CommentType.IncomingEmail,
                                LinkedEmailId = result.Email.Id,
                            },
                                                     null,
                                                     null);
                        }
                    }
                }
            }
        }
Beispiel #18
0
        public long Apply(IUnitOfWork db,
                          IDbFactory dbFactory,
                          ILogService log,
                          ICacheService cache,
                          IPriceManager priceManager,
                          IStyleItemHistoryService styleItemHistory,
                          ISystemActionService actionService,
                          DateTime when,
                          long?by)
        {
            var style = db.Styles.Get(StyleId);

            style.UpdateDate = when;
            style.UpdatedBy  = by;

            style.ReSaveDate = when;
            style.ReSaveBy   = by;


            var excessiveShipmentAttr = db.StyleFeatureTextValues.GetAll().FirstOrDefault(sv => sv.StyleId == style.Id &&
                                                                                          sv.FeatureId == StyleFeatureHelper.EXCESSIVE_SHIPMENT);

            if (excessiveShipmentAttr == null)
            {
                excessiveShipmentAttr = new Core.Entities.Features.StyleFeatureTextValue()
                {
                    StyleId    = StyleId,
                    CreateDate = when,
                    CreatedBy  = by,
                    FeatureId  = StyleFeatureHelper.EXCESSIVE_SHIPMENT,
                };
                db.StyleFeatureTextValues.Add(excessiveShipmentAttr);
            }
            excessiveShipmentAttr.Value = ExcessiveShipmentAmount.HasValue ? ExcessiveShipmentAmount.ToString() : null;


            var wasAnyChanges       = false;
            var wasAnyMinMaxChanges = false;

            if (Sizes != null && Sizes.Any())
            {
                var styleItems = db.StyleItems.GetFiltered(si => si.StyleId == StyleId).ToList();

                foreach (var size in Sizes)  //Update prices (marking when/by)
                {
                    var    changeType         = PriceChangeSourceType.None;
                    string tag                = null;
                    bool   wasChanged         = false;
                    var    minMaxPriceChanged = false;

                    var styleItem = styleItems.FirstOrDefault(si => si.Id == size.StyleItemId);

                    if (styleItem != null)
                    {
                        StyleItemSale sale = size.SaleId.HasValue
                            ? db.StyleItemSales
                                             .GetAll()
                                             .FirstOrDefault(s => s.Id == size.SaleId.Value)
                            : null;

                        if (sale == null) //If no sale Id remove all exist sales (Remove Sale action was performed)
                        {
                            IList <StyleItemSale> saleList = db.StyleItemSales
                                                             .GetAll()
                                                             .Where(s => s.StyleItemId == styleItem.Id &&
                                                                    !s.IsDeleted)
                                                             .ToList();

                            foreach (var toRemove in saleList)
                            {
                                log.Info("Sale mark removed, saleId=" + toRemove.Id + ", Info=" +
                                         ToStringHelper.ToString(toRemove));
                                toRemove.IsDeleted = true;
                                db.Commit();

                                styleItemHistory.AddRecord(StyleItemHistoryTypes.RemoveSale, styleItem.Id,
                                                           new HistorySaleData()
                                {
                                    SaleStartDate = toRemove.SaleStartDate,
                                    SaleEndDate   = toRemove.SaleEndDate,
                                }, by);
                            }
                        }

                        var salePrice    = size.InitSalePrice ?? size.NewSalePrice;
                        var sfpSalePrice = size.InitSFPSalePrice ?? size.NewSFPSalePrice;

                        if (salePrice.HasValue ||
                            sfpSalePrice.HasValue)
                        {
                            //Get Default markets
                            var markets = MarketPriceEditViewModel.GetForStyleItemId(db,
                                                                                     dbFactory,
                                                                                     size.StyleItemId,
                                                                                     salePrice,
                                                                                     sfpSalePrice);

                            if ((SizePriceViewModel.SizeMarketApplyModes)size.MarketMode ==
                                SizePriceViewModel.SizeMarketApplyModes.OnlyAmazonUS)
                            {
                                markets = markets.Where(m => m.MarketplaceId == MarketplaceKeeper.AmazonComMarketplaceId).ToList();
                            }

                            //Save Default markets
                            if ((SizePriceViewModel.SizePriceApplyModes)size.ApplyMode ==
                                SizePriceViewModel.SizePriceApplyModes.Sale)
                            {
                                var results = MarketPriceEditViewModel.ApplySale(db,
                                                                                 log,
                                                                                 size.StyleItemId,
                                                                                 markets,
                                                                                 when,
                                                                                 by);

                                if (results.Any())
                                {
                                    var saleId = results[0].SaleId;
                                    sale = db.StyleItemSales.GetAll().FirstOrDefault(s => s.Id == saleId);
                                }
                            }
                        }


                        if ((SizePriceViewModel.SizePriceApplyModes)size.ApplyMode ==
                            SizePriceViewModel.SizePriceApplyModes.Permanent)
                        {
                            //Get Default markets
                            var markets = MarketPriceEditViewModel.GetForStyleItemId(db,
                                                                                     dbFactory,
                                                                                     size.StyleItemId,
                                                                                     salePrice,
                                                                                     sfpSalePrice);

                            if ((SizePriceViewModel.SizeMarketApplyModes)size.MarketMode ==
                                SizePriceViewModel.SizeMarketApplyModes.OnlyAmazonUS)
                            {
                                markets = markets.Where(m => m.MarketplaceId == MarketplaceKeeper.AmazonComMarketplaceId).ToList();
                            }

                            //NOTE: also mark exist sale as deleted
                            MarketPriceEditViewModel.ApplyPermanent(db,
                                                                    log,
                                                                    priceManager,
                                                                    size.StyleItemId,
                                                                    markets,
                                                                    when,
                                                                    by);

                            styleItemHistory.AddRecord(StyleItemHistoryTypes.AddPermanentSale, styleItem.Id,
                                                       new HistorySaleData()
                            {
                                SalePrice = salePrice
                            }, by);
                        }

                        if (sale != null)
                        {
                            //    if (size.NewSalePrice.HasValue)
                            //    {
                            //        log.Info("Updated sale price, saleId=" + sale.Id + ", to=" + size.NewSalePrice + ", SFP=" + size.NewSFPSalePrice);
                            //        MarketPriceEditViewModel.UpdateSalePrices(db,
                            //            size.StyleItemId,
                            //            sale.Id,
                            //            size.NewSalePrice.Value,
                            //            size.NewSFPSalePrice);
                            //    }

                            sale.SaleStartDate = size.SaleStartDate;
                            sale.SaleEndDate   = size.SaleEndDate;
                            sale.MaxPiecesMode = MaxPiecesOnSale.HasValue
                                ? (int)MaxPiecesOnSaleMode.ByStyle
                                : (int)MaxPiecesOnSaleMode.BySize;
                            sale.MaxPiecesOnSale = size.MaxPiecesOnSale ?? MaxPiecesOnSale;

                            db.Commit();

                            styleItemHistory.AddRecord(StyleItemHistoryTypes.AddSale, styleItem.Id,
                                                       new HistorySaleData()
                            {
                                SalePrice     = size.NewSalePrice,
                                SaleStartDate = size.SaleStartDate,
                                SaleEndDate   = size.SaleEndDate
                            }, by);
                        }

                        minMaxPriceChanged = styleItem.MinPrice != size.MinPrice ||
                                             styleItem.MaxPrice != size.MaxPrice;

                        if (minMaxPriceChanged)
                        {
                            styleItem.MinPrice = size.MinPrice;
                            styleItem.MaxPrice = size.MaxPrice;
                            db.Commit();
                        }

                        wasAnyMinMaxChanges = wasAnyMinMaxChanges || minMaxPriceChanged;
                    }
                }

                //NOTE: update all listing, ex. change price, start/end date, e.t.c.
                var styleListingIds = db.Listings.GetViewListingsAsDto(true)
                                      .Where(l => l.StyleId == StyleId)
                                      .Select(l => l.Id)
                                      .ToList();
                var dbListings = db.Listings.GetAll().Where(l => styleListingIds.Contains(l.Id)).ToList();
                foreach (var dbListing in dbListings)
                {
                    dbListing.PriceUpdateRequested = true;
                    if (wasAnyMinMaxChanges)
                    {
                        actionService.AddAction(db,
                                                SystemActionType.UpdateOnMarketProductPriceRule,
                                                dbListing.SKU,
                                                null,
                                                null,
                                                by);
                    }
                }
                db.Commit();
            }

            cache.RequestStyleIdUpdates(db,
                                        new List <long> {
                StyleId
            },
                                        UpdateCacheMode.IncludeChild,
                                        AccessManager.UserId);

            return(StyleId);
        }
Beispiel #19
0
        public void Process(Core.IUnitOfWork db,
                            DTO.OrderToTrackDTO shipping,
                            string status,
                            DateTime?statusDate,
                            IList <TrackingRecord> records,
                            DateTime when)
        {
            /*
             * NO AUTHORIZED RECIPIENT AVAILABLE
             *  Notice Left
             *  Notice Left (No Authorized Recipient Available)
             *  Notice Left (No Secure Location Available)
             *  Notice Left (Receptacle Full/Item Oversized)
             */
            /*
             * Please send message similar to Notice Left to orders with status “Available for pickup”.
             *  Like 115-0119209-8758666
             */
            var labelType  = shipping.MailInfoId.HasValue ? LabelFromType.Mail : LabelFromType.Batch;
            var shippingId = shipping.MailInfoId.HasValue ? shipping.MailInfoId.Value : shipping.ShipmentInfoId.Value;

            if (IsAccept(shipping, status, statusDate, records))
            {
                if (!db.OrderEmailNotifies.IsExist(shipping.OrderNumber, OrderEmailNotifyType.OutputNoticeLeft))
                {
                    _log.Info(String.Format("Order: {0}, has status: {1}",
                                            shipping.OrderNumber,
                                            status));

                    var sendEmailActionId = _actionService.AddAction(db,
                                                                     SystemActionType.SendEmail,
                                                                     shipping.OrderNumber,
                                                                     new SendEmailInput()
                    {
                        EmailType = EmailTypes.NoticeLeft,
                        OrderId   = shipping.OrderNumber,
                        Args      = new Dictionary <string, string>()
                        {
                            { "LabelType", labelType.ToString() },
                            { "ShippingOrderId", shippingId.ToString() }
                        }
                    },
                                                                     null,
                                                                     null);

                    _actionService.AddAction(db,
                                             SystemActionType.AddComment,
                                             shipping.OrderNumber,
                                             new AddCommentInput()
                    {
                        OrderId = shipping.OrderId,
                        Message = "[System] Notice Left email sent",
                        Type    = (int)CommentType.OutputEmail,
                    },
                                             sendEmailActionId,
                                             null);


                    db.OrderEmailNotifies.Add(new OrderEmailNotify()
                    {
                        Type        = (int)OrderEmailNotifyType.OutputNoticeLeft,
                        OrderNumber = shipping.OrderNumber,
                        CreateDate  = when,
                    });
                    db.Commit();
                }
                else
                {
                    _log.Info("Notice left already sent");
                }
            }
        }
        public void Process(IUnitOfWork db, EmailReadingResult result)
        {
            if (result.Status != EmailMatchingResultStatus.New ||
                !result.HasMatches)
            {
                return;
            }

            var subject       = result.Email.Subject ?? "";
            var refundRequest = subject.StartsWith("Refund initiated for order");

            if (refundRequest)
            {
                result.WasEmailProcessed = true; //NOTE: skipped comment added to other Rules
                _log.Info("ReturnRequsetEmailRule, WasEmailProcessed=" + result.WasEmailProcessed);

                var orderNumber = result.MatchedIdList.FirstOrDefault();
                _log.Info("Received Return authorization request, orderNumber=" + orderNumber);

                var order = db.Orders.GetByOrderNumber(orderNumber);
                //var orderItems = db.Listings.GetOrderItems(order.Id);
                //var orderShippings = db.OrderShippingInfos.GetByOrderIdAsDto(order.Id).Where(sh => sh.IsActive).ToList();

                //-- Refund Amount: $15.66
                var amountText = StringHelper.GetTextBetween(result.Email.Message, "Refund Amount: ", new string[] { "\r", "\n", " " });
                amountText = StringHelper.RemoveWhitespace(amountText ?? "").Replace("$", "");
                var amountValue = StringHelper.TryGetDecimal(amountText);
                if (!amountValue.HasValue ||
                    amountValue == 0)
                {
                    return;
                }

                if (_existanceCheck)
                {
                    var existRefunds = db.SystemActions.GetAll().Where(r => r.Tag == orderNumber &&
                                                                       r.Type == (int)SystemActionType.UpdateOnMarketReturnOrder).ToList();
                    if (existRefunds.Any())
                    {
                        foreach (var existRefund in existRefunds)
                        {
                            var data        = JsonConvert.DeserializeObject <ReturnOrderInput>(existRefund.InputData);
                            var existAmount = RefundHelper.GetAmount(data);
                            if (existAmount == amountValue)
                            {
                                //Already exist
                                if (existRefund.Status == (int)SystemActionStatus.Fail)
                                {
                                    _log.Info("Mark exist refund as done: " + amountValue + ", order: " + data.OrderNumber);
                                    existRefund.Status = (int)SystemActionStatus.Done;
                                    db.Commit();
                                }
                                else
                                {
                                    _log.Info("Already exist");
                                }
                                return;
                            }
                            else
                            {
                                //Not exist
                            }
                        }
                    }
                }

                _systemAction.AddAction(db,
                                        SystemActionType.UpdateOnMarketReturnOrder,
                                        order.AmazonIdentifier,
                                        new ReturnOrderInput()
                {
                    OrderId      = order.Id,
                    OrderNumber  = order.AmazonIdentifier,
                    RefundAmount = amountValue,
                    RefundReason = (int)RefundReasonCodes.Return
                },
                                        null,
                                        null,
                                        SystemActionStatus.Done);

                _log.Info("Refund added to DB, amount=" + amountValue);
            }
        }