public CheckResult Check(IUnitOfWork db, DTOMarketOrder order, IList <ListingOrderDTO> items)
        {
            var today          = _time.GetAppNowTime();
            var futureShipDate = items.Where(l => l.RestockDate.HasValue).Max(l => l.RestockDate);

            if (futureShipDate.HasValue && futureShipDate.Value > today.Date)
            {
                db.OrderNotifies.Add(
                    ComposeNotify(order.Id,
                                  (int)OrderNotifyType.FutureShipping,
                                  1,
                                  DateHelper.ToDateString(futureShipDate.Value.Date),
                                  _time.GetAppNowTime()));

                return(new CheckResult()
                {
                    IsSuccess = false
                });
            }

            return(new CheckResult()
            {
                IsSuccess = true
            });
        }
Example #2
0
 public void OnNotFoundAllListings(DTOMarketOrder marketOrder,
                                   IList <ListingOrderDTO> sourceOrderItems)
 {
     _emailService.SendSystemEmailToAdmin(
         "Listing items weren't found for order, orderId: " + marketOrder.OrderId + ", market: " + marketOrder.Market + " - " + marketOrder.MarketplaceId,
         "Items: " + String.Join(",", sourceOrderItems.Select(i => "SKU: " + i.SKU).ToList()));
 }
Example #3
0
        public bool CreateIfNotExistFromOrderDto(DTOMarketOrder order, DateTime when)
        {
            var wasCreated = false;

            if (!String.IsNullOrEmpty(order.BuyerEmail))
            {
                var dbBuyer = GetAll().FirstOrDefault(b => b.Email == order.BuyerEmail);
                if (dbBuyer != null)
                {
                    dbBuyer.LastOrderDate = order.OrderDate;
                    dbBuyer.Name          = order.BuyerName;
                }
                else
                {
                    dbBuyer = new Buyer()
                    {
                        Email = order.BuyerEmail,
                        Name  = order.BuyerName,

                        LastOrderDate = order.OrderDate,
                        CreateDate    = when
                    };
                    Add(dbBuyer);
                    wasCreated = true;
                }
                unitOfWork.Commit();
            }
            return(wasCreated);
        }
        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
            });
        }
Example #5
0
        public CheckResult Check(IUnitOfWork db,
                                 DTOMarketOrder order,
                                 IList <ListingOrderDTO> items,
                                 AddressValidationStatus addressValidationStatus)
        {
            if (order.Id == 0)
            {
                throw new ArgumentOutOfRangeException("order.Id", "Should be non zero");
            }

            if (order.OrderStatus == OrderStatusEnumEx.Pending)
            {
                throw new ArgumentException("order.OrderStatus", "Not supported status Pending");
            }


            if (addressValidationStatus >= AddressValidationStatus.Invalid)
            {
                var address     = order.GetAddressDto();
                var isFFAddress = AddressHelper.IsFFAddress(address);

                if (isFFAddress)
                {
                    return(new CheckResult()
                    {
                        IsSuccess = true
                    });
                }
            }

            return(new CheckResult()
            {
                IsSuccess = false
            });
        }
Example #6
0
        public CheckResult Check(IUnitOfWork db,
                                 DTOMarketOrder order,
                                 IList <ListingOrderDTO> items,
                                 AddressValidationStatus addressValidationStatus)
        {
            if (order.Id == 0)
            {
                throw new ArgumentOutOfRangeException("order.Id", "Should be non zero");
            }

            if (order.OrderStatus == OrderStatusEnumEx.Pending)
            {
                throw new ArgumentException("order.OrderStatus", "Not supported status Pending");
            }

            if (ShippingUtils.IsLatvia(order.FinalShippingCountry))
            {
                if ((order.ShippingZip ?? "").Contains("LV-"))
                {
                    return(new CheckResult()
                    {
                        IsSuccess = true,
                        AdditionalData = new[] { (order.ShippingZip ?? "").Replace("LV-", "LV") }
                    });
                }
            }

            return(new CheckResult()
            {
                IsSuccess = false
            });
        }
        public CheckResult Check(IUnitOfWork db, DTOMarketOrder order)
        {
            //NOTE: not standard it is DHL (should be w/o insurance)
            if (order.InitialServiceType != ShippingUtils.StandardServiceName)
            {
                return(new CheckResult()
                {
                    IsSuccess = false
                });
            }

            var countryName = order.ShippingCountry;
            var country     = db.Countries.GetFiltered(c => c.CountryCode2 == countryName)
                              .FirstOrDefault();
            var isInusred = country != null && country.IsInsure;

            if (isInusred)
            {
                _log.Info("Insured by Country Code");
            }
            return(new CheckResult()
            {
                IsSuccess = isInusred
            });
        }
Example #8
0
 public CheckResult Check(IUnitOfWork db, DTOMarketOrder marketOrder)
 {
     return(new CheckResult()
     {
         IsSuccess = marketOrder.OrderType == (int)OrderTypeEnum.Prime
     });
 }
        public IList <BuyerBlackListDto> GetSimular(DTOMarketOrder order)
        {
            var query = from b in unitOfWork.GetSet <ViewBuyerBlackList>()
                        where b.BuyerEmail == order.BuyerEmail
                        select b;

            return(AsDto(query).ToList());
        }
        public bool CreateIfNotExistFromOrderDto(DTOMarketOrder order, DateTime when)
        {
            var customer = order.GetCustomerInfo();
            var result   = CreateIfNotExistOrUpdate(customer);

            order.CustomerId = customer.Id;

            return(result);
        }
Example #11
0
        public void ShippingValidationStep(IUnitOfWork db,
                                           IList <ListingOrderDTO> orderItems,
                                           IList <ListingOrderDTO> sourceOrderItems,
                                           IList <OrderShippingInfoDTO> shippings,
                                           DTOMarketOrder marketOrder,
                                           Order dbOrder)
        {
            var exceededChecker = new ExceededShippingCostChecker(_log,
                                                                  _actionService,
                                                                  _priceService,
                                                                  _stampsRateApi,
                                                                  _returnAddress,
                                                                  _time);
            var resultIsExceededShippingCost = exceededChecker.Check(db,
                                                                     dbOrder.Id,
                                                                     sourceOrderItems,
                                                                     shippings,
                                                                     marketOrder);

            exceededChecker.ProcessResult(resultIsExceededShippingCost, db, dbOrder);

            var lowerPriceChecker = new LowerItemPriceChecker(_log,
                                                              new PriceService(_dbFactory),
                                                              _time);
            var resultIsLowerItemPrice = lowerPriceChecker.Check(db,
                                                                 dbOrder.Id,
                                                                 sourceOrderItems,
                                                                 shippings,
                                                                 marketOrder);

            lowerPriceChecker.ProcessResult(resultIsExceededShippingCost, db, dbOrder);

            var primeChecker = new PrimeShippingChecker(_log,
                                                        _emailService,
                                                        _time);
            var resultPrimeShipping = primeChecker.Check(db,
                                                         dbOrder.Id,
                                                         orderItems,
                                                         shippings,
                                                         marketOrder);

            primeChecker.ProcessResult(resultPrimeShipping, db, dbOrder);


            var replacePhoneChecker = new ReplacePhoneChecker(_log,
                                                              _emailService,
                                                              _time,
                                                              _company);
            var resultReplacePhone = replacePhoneChecker.Check(db,
                                                               marketOrder,
                                                               orderItems);

            replacePhoneChecker.ProcessResult(resultReplacePhone, dbOrder);
        }
Example #12
0
        public CheckResult Check(IUnitOfWork db, DTOMarketOrder order, IList <ListingOrderDTO> items)
        {
            var result = DuplicateValidatorCheck(db, order, items);

            _log.Info("CheckDuplicate, result=" + result.IsSuccess + ", message=" + result.Message);

            if (!result.IsSuccess)
            {
                db.OrderNotifies.Add(
                    ComposeNotify(order.Id,
                                  (int)OrderNotifyType.Duplicate,
                                  1,
                                  result.Message,
                                  _time.GetAppNowTime()));

                db.Commit();

                var emailInfo = new DuplicateEmailInfo(_emailService.AddressService,
                                                       order.CustomerOrderId,
                                                       (MarketType)order.Market,
                                                       new DuplicateOrdersDTO
                {
                    Items        = items,
                    OrderNumbers = result.AdditionalData
                },
                                                       order.BuyerName,
                                                       order.BuyerEmail);

                _emailService.SendEmail(emailInfo, CallSource.Service);
                _log.Info("Send duplicated order email, orderId=" + order.Id);

                db.OrderEmailNotifies.Add(new OrderEmailNotify()
                {
                    OrderNumber = order.OrderId,
                    Reason      = "System emailed, found duplicate",
                    Type        = (int)OrderEmailNotifyType.OutputDuplicateAlertEmail,
                    CreateDate  = _time.GetUtcTime(),
                });

                db.OrderComments.Add(new OrderComment()
                {
                    OrderId    = order.Id,
                    Message    = "[System] Duplicate order alert email sent",
                    Type       = (int)CommentType.OutputEmail,
                    CreateDate = _time.GetAppNowTime(),
                    UpdateDate = _time.GetAppNowTime()
                });

                db.Commit();
            }
            return(result);
        }
Example #13
0
        public void OrderValidationStepAlwaysInitial(IUnitOfWork db,
                                                     ITime time,
                                                     DTOMarketOrder marketOrder,
                                                     IList <ListingOrderDTO> orderItems,
                                                     Order dbOrder)
        {
            var upgradeShippingService = new UpgradeShippingServiceChecker(_log, _time);
            var result = upgradeShippingService.Check(db, marketOrder, orderItems);

            upgradeShippingService.ProcessResult(result, dbOrder);

            db.Commit();
        }
Example #14
0
        public void OrderValidationStepAlways(IUnitOfWork db,
                                              ITime time,
                                              IMarketApi api,
                                              CompanyDTO company,
                                              DTOMarketOrder marketOrder,
                                              IList <ListingOrderDTO> orderItems,
                                              IList <OrderShippingInfoDTO> shippings,
                                              Order dbOrder)
        {
            var hasCancellationChecker = new HasCancellationChecker(_log, _actionService, _time);
            var result = hasCancellationChecker.Check(db, marketOrder, orderItems);

            hasCancellationChecker.ProcessResult(result, dbOrder);
        }
Example #15
0
 public void OrderValidationStepFinal(IUnitOfWork db,
                                      ITime time,
                                      CompanyDTO company,
                                      DTOMarketOrder marketOrder,
                                      IList <ListingOrderDTO> orderItems,
                                      IList <OrderShippingInfoDTO> shippings,
                                      Order dbOrder)
 {
     //NOTE: Disabled auto set signature confirmation
     //var signConfirmationSendEmailChecker = new SignConfirmationSendEmailChecker(_log, db, _emailService, _time);
     //var result = signConfirmationSendEmailChecker.Check(marketOrder,
     //    dbOrder,
     //    orderItems,
     //    shippings);
     //signConfirmationSendEmailChecker.ProcessResult(result, dbOrder, marketOrder, orderItems);
 }
Example #16
0
        public CheckResult Check(IUnitOfWork db, DTOMarketOrder order)
        {
            var result = BlackListValidatorCheck(db, order);

            if (result.IsSuccess)
            {
                db.OrderNotifies.Add(
                    ComposeNotify(order.Id,
                                  (int)OrderNotifyType.BlackList,
                                  1,
                                  result.Message,
                                  _time.GetAppNowTime()));
                db.Commit();
            }
            return(result);
        }
Example #17
0
        private CheckResult BlackListValidatorCheck(IUnitOfWork db, DTOMarketOrder order)
        {
            var blackListRecords = db.BuyerBlackLists.GetSimular(order);

            if (blackListRecords.Any())
            {
                return new CheckResult()
                       {
                           IsSuccess = true,
                           Message   = blackListRecords[0].OrderId
                       }
            }
            ;
            return(new CheckResult()
            {
                IsSuccess = false
            });
        }
Example #18
0
 public CheckResult Check(DTOMarketOrder order, IList<ListingOrderDTO> items)
 {
     //NOTE: Temp disabled currenlty no need
     //var address = order.GetAddressDto();
     ////if ((order.ShipmentProviderType == (int)ShipmentProviderType.Stamps
     ////    || order.ShipmentProviderType == (int)ShipmentProviderType.Amazon)
     //    //|| order.ShipmentProviderType == (int)ShipmentProviderType.None)
     //    //&& !String.IsNullOrEmpty(address.FinalCountry)
     //    //&& !ShippingUtils.IsInternational(address.FinalCountry)
     //    //&& ShippingUtils.IsServiceSameDay(order.InitialServiceType))            
     //{
     //    var sum = items.Sum(i => i.ItemPrice - (i.PromotionDiscount ?? 0));
     //    var currency = PriceHelper.GetCurrencyAbbr((MarketType)order.Market, order.MarketplaceId);
     //    var sumInUSD = PriceHelper.ConvertToUSD(sum, currency);
     //    if (sumInUSD > 200)
     //        return new CheckResult() { IsSuccess = true };
     //}
     return new CheckResult() { IsSuccess = false };
 }
Example #19
0
        public CheckResult Check(DTOMarketOrder order)
        {
            CheckResult result = new CheckResult()
            {
                IsSuccess = false
            };

            var serviceType = order.InitialServiceType;

            if (ShippingUtils.IsServiceSameDay(serviceType))
            {
                return(new CheckResult()
                {
                    IsSuccess = true
                });
            }

            return(result);
        }
Example #20
0
 public CheckResult Check(IUnitOfWork db,
                          DTOMarketOrder marketOrder,
                          IList <ListingOrderDTO> orderItems)
 {
     if (marketOrder.ShipmentProviderType == (int)ShipmentProviderType.Dhl)
     {
         if (orderItems.All(i => i.Weight > 0) &&
             orderItems.Sum(i => i.Weight) > 48)    //3Lb
         {
             return(new CheckResult()
             {
                 IsSuccess = true
             });
         }
     }
     return(new CheckResult()
     {
         IsSuccess = false
     });
 }
Example #21
0
        public CheckResult Check(IUnitOfWork db,
                                 DTOMarketOrder order,
                                 IList <ListingOrderDTO> orderItems)
        {
            var canUpgrade = false;

            if (orderItems != null && orderItems.Any(oi => oi.OnMarketTemplateName == AmazonTemplateHelper.OversizeTemplate) &&
                order.InitialServiceType == ShippingUtils.StandardServiceName &&
                (order.Market == (int)MarketType.Amazon ||
                 order.Market == (int)MarketType.AmazonAU ||
                 order.Market == (int)MarketType.AmazonEU))
            {
                order.InitialServiceType = ShippingUtils.ExpeditedServiceName;
                canUpgrade = true;
            }

            return(new CheckResult()
            {
                IsSuccess = canUpgrade
            });
        }
        public CheckResult Check(DTOMarketOrder order)
        {
            CheckResult result = new CheckResult()
            {
                IsSuccess = false
            };

            var serviceType = order.InitialServiceType;

            if ((ShippingUtils.IsServiceTwoDays(serviceType) ||
                 ShippingUtils.IsServiceNextDay(serviceType)) &&
                ShippingUtils.IsInternational(order.ShippingCountry))
            {
                return(new CheckResult()
                {
                    IsSuccess = true
                });
            }

            return(result);
        }
        public CheckResult Check(IUnitOfWork db,
                                 DTOMarketOrder order,
                                 IList <ListingOrderDTO> items)
        {
            if (order.Id == 0)
            {
                throw new ArgumentOutOfRangeException("order.Id", "Should be non zero");
            }

            if (order.OrderStatus != OrderStatusEnumEx.Pending)
            {
                if (order.ShipmentProviderType == (int)ShipmentProviderType.FedexOneRate)
                {
                    if (String.IsNullOrEmpty(order.FinalShippingPhone))
                    {
                        if (order.IsManuallyUpdated)
                        {
                            order.ManuallyShippingPhone = _company.Phone;
                        }
                        else
                        {
                            order.ShippingPhone = _company.Phone;
                        }

                        return(new CheckResult()
                        {
                            IsSuccess = true,
                            AdditionalData = new List <string>()
                            {
                                _company.Phone
                            }
                        });
                    }
                }
            }
            return(new CheckResult()
            {
                IsSuccess = false
            });
        }
Example #24
0
        private CheckResult DuplicateValidatorCheck(IUnitOfWork db, DTOMarketOrder marketOrder, IList <ListingOrderDTO> orderItems)
        {
            var duplicateOrders    = new List <string>();
            var orderWithSameBuyer = db.Orders.GetOrdersWithSimilarDateAndBuyerAndAddress(marketOrder);

            if (orderWithSameBuyer.Any())
            {
                _log.Info("Similar orders, count=" + orderWithSameBuyer.Count);
                foreach (var order in orderWithSameBuyer)
                {
                    var items = db.Listings.GetOrderItems(order.Id);

                    if (items.Any() && items.Count == orderItems.Count)
                    {
                        if (orderItems.All(oItem => items.Any(i => i.ListingId == oItem.ListingId)))
                        {
                            duplicateOrders.Add(order.OrderId);
                            break;
                        }
                        if (orderItems.All(oItem => items.Any(i => i.StyleItemId == oItem.StyleItemId)))
                        {
                            duplicateOrders.Add(order.OrderId);
                            break;
                        }
                    }
                }
            }

            if (duplicateOrders.Any())
            {
                _log.Info("Possible duplicates for order: " + marketOrder.OrderId + "; duplicates: " + string.Join(", ", duplicateOrders));
            }

            return(new CheckResult()
            {
                IsSuccess = !duplicateOrders.Any(),
                Message = duplicateOrders.Any() ? duplicateOrders[0] : String.Empty,
                AdditionalData = duplicateOrders
            });
        }
        public IList <DTOOrder> GetOrdersWithSimilarDateAndBuyerAndAddress(DTOMarketOrder orderDto)
        {
            if (orderDto == null)
            {
                throw new ArgumentNullException("orderDto");
            }

            var fromDate = orderDto.OrderDate.Value.AddHours(-24);
            var toDate   = orderDto.OrderDate.Value.AddHours(24);

            //1. Retriving similar orders. Сравниваем по имени, адресу доставки, заказанной пижаме, размер
            var query = from o in unitOfWork.Orders.GetAll()
                        where o.OrderDate > fromDate &&
                        o.OrderDate < toDate &&
                        o.OrderStatus != OrderStatusEnumEx.Canceled &&
                        o.OrderStatus != OrderStatusEnumEx.Pending
                        //&& o.OrderStatus.ToLower() == "unshipped" &&
                        && o.PersonName == orderDto.PersonName &&
                        o.ShippingCountry == orderDto.ShippingCountry &&
                        o.ShippingAddress1 == orderDto.ShippingAddress1 &&
                        o.ShippingAddress2 == orderDto.ShippingAddress2 &&
                        o.ShippingCity == orderDto.ShippingCity &&
                        o.ShippingState == orderDto.ShippingState &&
                        o.ShippingZip == orderDto.ShippingZip &&
                        o.ShippingZipAddon == orderDto.ShippingZipAddon &&
                        o.ShippingPhone == orderDto.ShippingPhone &&
                        o.AmazonIdentifier != orderDto.OrderId  //exclude itself
                        select new DTOOrder
            {
                Id          = o.Id,
                OrderId     = o.AmazonIdentifier,
                OrderStatus = o.OrderStatus,
                OrderDate   = o.OrderDate
            };

            return(query.ToList());
        }
Example #26
0
        public CheckResult Check(IUnitOfWork db,
                                 DTOMarketOrder order,
                                 IList <ListingOrderDTO> items,
                                 AddressValidationStatus addressValidationStatus)
        {
            if (order.Id == 0)
            {
                throw new ArgumentOutOfRangeException("order.Id", "Should be non zero");
            }

            if (order.OrderStatus == OrderStatusEnumEx.Pending)
            {
                throw new ArgumentException("order.OrderStatus", "Not supported status Pending");
            }

            if (ShippingUtils.IsCanada(order.FinalShippingCountry))
            {
                var state = order.FinalShippingState;
                if ((state ?? "").Length > 2)
                {
                    var stateAbbr = db.States.GetCodeByName(state);
                    if (!String.IsNullOrEmpty(stateAbbr))
                    {
                        return(new CheckResult()
                        {
                            IsSuccess = true,
                            AdditionalData = new[] { stateAbbr }
                        });
                    }
                }
            }

            return(new CheckResult()
            {
                IsSuccess = false
            });
        }
Example #27
0
        public CheckResult Check(IUnitOfWork db,
                                 long orderId,
                                 IList <ListingOrderDTO> orderItems,
                                 IList <OrderShippingInfoDTO> shippings,
                                 DTOMarketOrder marketOrder)
        {
            if (!orderItems.Any() || !shippings.Any())
            {
                return new CheckResult()
                       {
                           IsSuccess = false
                       }
            }
            ;

            if (marketOrder.UpgradeLevel > 0)
            {
                return new CheckResult()
                       {
                           IsSuccess = false
                       }
            }
            ;

            if (marketOrder.Market == (int)MarketType.Groupon)
            {
                return new CheckResult()
                       {
                           IsSuccess = false
                       }
            }
            ;

            CultureInfo culture = CultureInfo.CreateSpecificCulture("en-US");

            culture.NumberFormat.CurrencyNegativePattern = 1;

            decimal paidShppingCost = orderItems.Sum(i => i.ShippingPrice);
            string  currency        = orderItems.First().ShippingPriceCurrency;

            paidShppingCost = PriceHelper.RougeConvertToUSD(currency, paidShppingCost);
            if (marketOrder.OrderType == (int)OrderTypeEnum.Prime)
            {
                paidShppingCost += orderItems.Sum(oi => AmazonPrimeHelper.GetShippingAmount(oi.Weight));
            }

            decimal?actualShippingsCost = null;

            if (shippings != null && shippings.Any(sh => sh.IsActive))
            {
                actualShippingsCost = shippings.Where(sh => sh.IsActive &&
                                                      sh.ShippingMethodId != ShippingUtils.FedexSmartPost).Sum(sh => sh.StampsShippingCost ?? 0);
            }

            _log.Info("CheckIsExceededShippingCost: paid=" + paidShppingCost + " < actual=" + actualShippingsCost);


            if (shippings != null)
            {
                //"Excessive shipping cost. Because priority flat went up I get lots of “excesive” in cases like. We need to ignore those cases…"
                var activeShipping = shippings.FirstOrDefault(sh => sh.IsActive);
                if (activeShipping != null &&
                    activeShipping.ShippingMethod != null &&
                    activeShipping.ShippingMethod.Id == ShippingUtils.PriorityFlatShippingMethodId)
                {
                    return new CheckResult()
                           {
                               IsSuccess = false
                           }
                }
                ;
            }

            #region New Checking
            //price/1.17-shipping price-product cost-2 > -exc

            if (actualShippingsCost != null)
            {
                decimal totalThreashold = 0;
                decimal totalCost       = 0;
                bool    allHaveCost     = true;
                foreach (var item in orderItems)
                {
                    decimal?styleThreashold = null;

                    if (item.StyleId.HasValue)
                    {
                        var featureValue = db.StyleFeatureTextValues.GetFeatureValueByStyleIdByFeatureId(
                            item.StyleId.Value, StyleFeatureHelper.EXCESSIVE_SHIPMENT);
                        if (featureValue != null && !String.IsNullOrEmpty(featureValue.Value))
                        {
                            styleThreashold = StringHelper.TryGetDecimal(featureValue.Value);
                        }
                        var cost = db.StyleItemCaches.GetAllAsDto().Select(i => new { i.Id, i.Cost }).FirstOrDefault(i => i.Id == item.StyleItemId)?.Cost;
                        if (cost.HasValue)
                        {
                            totalCost += cost.Value * item.QuantityOrdered;
                        }
                        else
                        {
                            allHaveCost = false;
                        }
                    }
                    if (styleThreashold.HasValue)
                    {
                        totalThreashold += styleThreashold.Value * item.QuantityOrdered;
                    }
                }

                if (allHaveCost)
                {
                    var totalPaid = PriceHelper.RougeConvertToUSD(currency, orderItems.Sum(i => i.ShippingPrice + i.ItemPrice));

                    //Please ignore income disparity<1 like 180-111-825-1659 / 381-205-041-7263
                    if (totalThreashold < 1)
                    {
                        totalThreashold = 1;
                    }

                    var isValid = totalPaid / 1.17M - actualShippingsCost - totalCost - 2 > -totalThreashold;
                    if (!isValid)
                    {
                        var excpectIncome = totalPaid / 1.17M - actualShippingsCost.Value - totalCost - 2;

                        _log.Info(String.Format("Added Income disparity, income: {0}, totalPaid: {1}, actualShippingCost: {2}, totalCost: {3}",
                                                excpectIncome.ToString("C", culture),
                                                totalPaid,
                                                actualShippingsCost,
                                                totalCost));

                        var message = String.Format("Income disparity, income: {0}",
                                                    excpectIncome.ToString("C", culture));

                        db.OrderComments.Add(new OrderComment()
                        {
                            OrderId    = orderId,
                            Message    = message,
                            Type       = (int)CommentType.System,
                            CreateDate = _time.GetAppNowTime(),
                        });
                        db.Commit();

                        return(new CheckResult()
                        {
                            IsSuccess = true
                        });
                    }
                }
            }

            #endregion

            #region Old Checking
            //TASK: When order has 2 robes, and they sent as 2 First class (like 102-1792536-3635439) don’t show Excess ship. cost
            if (shippings.Where(sh => sh.IsActive).All(sh => sh.ShippingMethodId == ShippingUtils.AmazonFirstClassShippingMethodId ||
                                                       sh.ShippingMethodId == ShippingUtils.FirstClassShippingMethodId ||
                                                       sh.ShippingMethodId == ShippingUtils.DhlEComSMParcelGroundShippingMethodId ||
                                                       sh.ShippingMethodId == ShippingUtils.DhlEComSMParcelExpeditedShippingMethodId))
            {
                if (orderItems.All(
                        i => ItemStyleHelper.GetFromItemStyleOrTitle(i.ItemStyle, i.Title) == ItemStyleType.Robe))
                {
                    return(new CheckResult()
                    {
                        IsSuccess = false
                    });
                }
            }

            //NOTE: used default threashold: $1
            //NOTE: if price disparity <$2 it's ok
            var threshold = 2.0M;

            //TASK: When order has 2 or more items and service "Standard" made threashold $2
            if (orderItems.Sum(oi => oi.QuantityOrdered) >= 2 &&
                ShippingUtils.IsServiceStandard(marketOrder.InitialServiceType))
            {
                threshold = 2.5M;
            }

            var withEmptyThreashold    = 0;
            var withNotEmptyThreashold = 0;
            foreach (var item in orderItems)
            {
                decimal?styleThreashold = null;
                if (item.StyleId.HasValue)
                {
                    var featureValue = db.StyleFeatureTextValues.GetFeatureValueByStyleIdByFeatureId(
                        item.StyleId.Value, StyleFeatureHelper.EXCESSIVE_SHIPMENT);
                    if (featureValue != null && !String.IsNullOrEmpty(featureValue.Value))
                    {
                        styleThreashold = StringHelper.TryGetDecimal(featureValue.Value);
                    }
                }
                if (styleThreashold.HasValue)
                {
                    threshold += styleThreashold.Value * item.QuantityOrdered;
                    withNotEmptyThreashold++;
                }
                else
                {
                    withEmptyThreashold++;
                }
            }
            //if (withEmptyThreashold > 0)
            //    threshold += 1.0M;

            //if (withNotEmptyThreashold == 0)
            //    threshold = 1.0M;

            if (actualShippingsCost > 0 && paidShppingCost > 0 && paidShppingCost + threshold < actualShippingsCost)
            {
                bool    isOverchargeSkipped        = false;
                decimal totalIntlListingPriceInUSD = 0M;
                decimal totalUsListingPrice        = 0;
                if (ShippingUtils.IsInternational(marketOrder.FinalShippingCountry))
                {
                    #region Calc US Shipping Cost
                    decimal?actualUsShippingCost = 0M;

                    var shippingService = ShippingUtils.StandardServiceName; //ShippingUtils.InitialShippingServiceIncludeUpgrade(marketOrder.InitialServiceType.Replace("i:", ""), //convert to local
                    //marketOrder.UpgradeLevel);
                    decimal?paidUsShippingCost = ShippingUtils.GetRougePaidUSShippingAmount(shippingService, orderItems.Sum(i => i.QuantityOrdered));

                    var usRates = RateHelper.GetRougeChipestUSRate(_log,
                                                                   _stampsRateProvider,
                                                                   _fromAddress,
                                                                   marketOrder,
                                                                   shippingService,
                                                                   orderItems,
                                                                   orderItems);

                    if (usRates.Any())
                    {
                        actualUsShippingCost = usRates.Sum(r => r.Amount);
                    }
                    #endregion

                    foreach (var orderItem in orderItems)
                    {
                        totalIntlListingPriceInUSD += PriceHelper.RougeConvertToUSD(orderItem.ItemPriceCurrency, orderItem.ItemPrice);
                        var usListingPrice = GetUSListingPrice(db, orderItem);
                        if (usListingPrice == null)
                        {
                            totalUsListingPrice = 0;
                            break;
                        }
                        totalUsListingPrice += (usListingPrice * orderItem.QuantityOrdered) ?? 0;
                    }

                    decimal?usEarnedValue      = ((totalUsListingPrice) + (paidUsShippingCost ?? 0) - (actualUsShippingCost ?? 0));
                    decimal?marketEarnedValue  = (totalIntlListingPriceInUSD + paidShppingCost - actualShippingsCost.Value);
                    decimal?howMachEarnedValue = null;
                    if (actualUsShippingCost.HasValue &&
                        paidUsShippingCost.HasValue &&
                        totalUsListingPrice > 0 &&
                        actualShippingsCost.HasValue)
                    {
                        howMachEarnedValue = (totalIntlListingPriceInUSD + paidShppingCost - actualShippingsCost.Value) -
                                                                                                                            //how much we have earned now
                                             (totalUsListingPrice + paidUsShippingCost.Value - actualUsShippingCost.Value); //how much we have earned if we sell it in US

                        isOverchargeSkipped = howMachEarnedValue > -threshold;                                              //NOTE: Threashold
                    }

                    if (!isOverchargeSkipped)
                    {
                        //var message = internationalOverchargeSkip ? "No Excessive Shipping cost" : "Excessive Shipping cost";
                        var message = "";
                        if (totalUsListingPrice > 0)
                        {
                            message = String.Format("Income disparity: {0}+{1}-{2}={3} vs {4} => income diff.: {5}",
                                                    //MarketHelper.GetShortName((int)marketOrder.Market, marketOrder.MarketplaceId),
                                                    (totalUsListingPrice).ToString("C", culture),
                                                    (paidUsShippingCost ?? 0).ToString("C", culture),
                                                    (actualUsShippingCost ?? 0).ToString("C", culture),
                                                    usEarnedValue?.ToString("C", culture),
                                                    marketEarnedValue?.ToString("C", culture),
                                                    (howMachEarnedValue ?? 0).ToString("C", culture));
                        }
                        else
                        {
                            isOverchargeSkipped = true; //SKIP
                            message             = "Excessive Shipping validation: no similar US listing";
                        }

                        db.OrderComments.Add(new OrderComment()
                        {
                            OrderId    = orderId,
                            Message    = message,
                            Type       = (int)CommentType.System,
                            CreateDate = _time.GetAppNowTime(),
                        });
                        db.Commit();
                    }
                }
                else
                {
                    //сделай пока $3.02 threashold
                    var localThreshold = Math.Max(threshold, 3.02M);
                    if (paidShppingCost + localThreshold < actualShippingsCost)
                    {
                        var message = String.Format("Paid shipping ({0}) lower shipping cost ({1}) more than threshold ({2})",
                                                    (paidShppingCost).ToString("C", culture),
                                                    (actualShippingsCost ?? 0).ToString("C", culture),
                                                    (localThreshold).ToString("C", culture));
                        db.OrderComments.Add(new OrderComment()
                        {
                            OrderId    = orderId,
                            Message    = message,
                            Type       = (int)CommentType.System,
                            CreateDate = _time.GetAppNowTime(),
                        });
                    }
                    else
                    {
                        //NOTE: Temp Do Nothing
                        isOverchargeSkipped = true;
                    }
                }

                if (!isOverchargeSkipped)
                {
                    db.OrderNotifies.Add(
                        ComposeNotify(orderId,
                                      (int)OrderNotifyType.OverchargedShpppingCost,
                                      1,
                                      paidShppingCost + "<" + actualShippingsCost,
                                      _time.GetAppNowTime()));
                    db.Commit();
                }

                if (!isOverchargeSkipped)
                {
                    foreach (var orderItem in orderItems)
                    {
                        if (orderItem.SourceListingId.HasValue)
                        {
                            var listing = db.Listings.Get(orderItem.SourceListingId.Value);
                            if (listing != null)
                            {
                                SystemActionHelper.RequestPriceRecalculation(db, _actionService, listing.Id, null);
                                if (listing.Market == (int)MarketType.Walmart) //NOTE: need to update Second Day flag
                                {
                                    SystemActionHelper.RequestItemUpdate(db, _actionService, listing.Id, null);
                                }
                            }
                        }
                    }
                }

                return(new CheckResult()
                {
                    IsSuccess = !isOverchargeSkipped
                });
            }
            #endregion

            return(new CheckResult()
            {
                IsSuccess = false
            });
        }
Example #28
0
        public CheckResult Check(IUnitOfWork db,
                                 DTOMarketOrder order,
                                 IList <ListingOrderDTO> items,
                                 AddressValidationStatus addressValidationStatus)
        {
            if (order.Id == 0)
            {
                throw new ArgumentOutOfRangeException("order.Id", "Should be non zero");
            }

            if (order.OrderStatus == OrderStatusEnumEx.Pending)
            {
                throw new ArgumentException("order.OrderStatus", "Not supported status Pending");
            }

            if (order.IsManuallyUpdated)
            {
                order.ManuallyPersonName = ReplaceFrench(order.ManuallyPersonName);
            }
            else
            {
                order.PersonName = ReplaceFrench(order.PersonName);
            }

            if (order.IsManuallyUpdated)
            {
                order.ManuallyShippingAddress1 = ReplaceFrench(order.ManuallyShippingAddress1);
            }
            else
            {
                order.ShippingAddress1 = ReplaceFrench(order.ShippingAddress1);
            }

            if (order.IsManuallyUpdated)
            {
                order.ManuallyShippingAddress2 = ReplaceFrench(order.ManuallyShippingAddress2);
            }
            else
            {
                order.ShippingAddress2 = ReplaceFrench(order.ShippingAddress2);
            }

            if (order.IsManuallyUpdated)
            {
                order.ManuallyShippingState = ReplaceFrench(order.ManuallyShippingState);
            }
            else
            {
                order.ShippingState = ReplaceFrench(order.ShippingState);
            }

            if (order.IsManuallyUpdated)
            {
                order.ManuallyShippingCity = ReplaceFrench(order.ManuallyShippingCity);
            }
            else
            {
                order.ShippingCity = ReplaceFrench(order.ShippingCity);
            }

            return(new CheckResult()
            {
                IsSuccess = false
            });
        }
        public Order CreateFromDto(DTOMarketOrder dto, DateTime?when)
        {
            var order = new Order
            {
                Market             = dto.Market,
                SalesChannel       = dto.SalesChannel,
                MarketplaceId      = dto.MarketplaceId,
                FulfillmentChannel = dto.FulfillmentChannel,

                AmazonIdentifier  = dto.OrderId,
                MarketOrderId     = dto.MarketOrderId,
                CustomerOrderId   = dto.CustomerOrderId,
                SalesRecordNumber = dto.SalesRecordNumber,

                SubOrderNumber        = dto.SubOrderNumber,
                SubOrderAmountPercent = dto.SubOrderAmountPercent,

                DropShipperId   = dto.DropShipperId,
                AutoDSSelection = dto.AutoDSSelection,

                PaymentMethod = dto.PaymentMethod,
                PaymentInfo   = dto.PaymentInfo,

                DiscountAmount    = dto.DiscountAmount,
                DiscountDesc      = dto.DiscountDesc,
                TaxAmount         = dto.TaxAmount,
                TaxRate           = dto.TaxRate,
                DiscountTax       = dto.DiscountTax,
                ShippingTaxAmount = dto.ShippingTaxAmount,

                OrderType = dto.OrderType,

                OrderStatus = dto.OrderStatus,
                OrderDate   = dto.OrderDate,

                EarliestShipDate = dto.EarliestShipDate,
                LatestShipDate   = dto.LatestShipDate,

                EstDeliveryDate    = dto.EarliestDeliveryDate,
                LatestDeliveryDate = dto.LatestDeliveryDate,
                PersonName         = dto.PersonName,

                TotalPaid    = dto.TotalPaid,
                ShippingPaid = dto.ShippingPaid,

                TotalPrice         = dto.TotalPrice,
                TotalPriceCurrency = dto.TotalPriceCurrency,

                ShippingPrice          = dto.ShippingPrice,
                ShippingDiscountAmount = dto.ShippingDiscountAmount,

                Quantity = dto.Quantity,

                BuyerName  = dto.BuyerName,
                BuyerEmail = dto.BuyerEmail,

                ShippingCountry         = dto.ShippingCountry,
                ShippingAddress1        = dto.ShippingAddress1,
                ShippingAddress2        = dto.ShippingAddress2,
                ShippingCity            = dto.ShippingCity,
                ShippingState           = dto.ShippingState,
                ShippingZip             = dto.ShippingZip,
                ShippingZipAddon        = dto.ShippingZipAddon,
                ShippingPhone           = dto.ShippingPhone,
                AddressValidationStatus = dto.AddressValidationStatus,

                ShippingCalculationStatus = 0,
                InitialServiceType        = dto.InitialServiceType,
                ShipmentProviderType      = dto.ShipmentProviderType,

                SourceOrderStatus     = dto.SourceOrderStatus,
                SourceShippingService = dto.SourceShippingService,
                SourceShippedDate     = dto.SourceShippedDate,
                PaidDate = dto.PaidDate,
                MarketLastUpdatedDate = dto.MarketLastUpdatedDate,

                IsSignConfirmation = dto.IsSignConfirmation,
                IsInsured          = dto.IsInsured,

                OnHold = dto.OnHold,

                CreateDate = when,
                UpdateDate = when
            };

            Add(order);
            unitOfWork.Commit();
            return(order);
        }
        public CheckResult Check(IUnitOfWork db,
                                 DTOMarketOrder order,
                                 IList <ListingOrderDTO> items,
                                 AddressValidationStatus addressValidationStatus)
        {
            //NOTE: Skipping valid addresses
            if (addressValidationStatus < AddressValidationStatus.Invalid)
            {
                return(new CheckResult()
                {
                    IsSuccess = true
                });
            }

            var checkUSPSService   = new PersonatorAddressCheckService(_log, _htmlScraper, null);
            var address            = order.GetAddressDto();
            var addressCheckResult = checkUSPSService.ScrappingCheckAddress(address);
            var result             = new CheckResult()
            {
                IsSuccess = !addressCheckResult.IsNotServedByUSPSNote
            };

            _log.Info("AddressNotServedByUSPSChecker, hasNote=" + addressCheckResult.IsNotServedByUSPSNote);

            if (addressCheckResult.IsNotServedByUSPSNote)
            {
                var existNotifier = db.OrderEmailNotifies.IsExist(order.OrderId,
                                                                  OrderEmailNotifyType.OutputAddressNotServedByUSPSEmail);

                if (!existNotifier)
                {
                    var emailInfo = new AddressNotServedByUSPSEmailInfo(_emailService.AddressService,
                                                                        null,
                                                                        order.OrderId,
                                                                        (MarketType)order.Market,
                                                                        address,
                                                                        order.BuyerName,
                                                                        order.BuyerEmail,
                                                                        order.EarliestShipDate ?? (order.OrderDate ?? DateTime.Today).AddDays(1));

                    _emailService.SendEmail(emailInfo, CallSource.Service);
                    _log.Info("Send address not served by USPS email, orderId=" + order.Id);

                    db.OrderEmailNotifies.Add(new OrderEmailNotify()
                    {
                        OrderNumber = order.OrderId,
                        Reason      = "Address isn’t served by USPS",
                        Type        = (int)OrderEmailNotifyType.OutputAddressNotServedByUSPSEmail,
                        CreateDate  = _time.GetUtcTime(),
                    });
                }

                db.OrderComments.Add(new OrderComment()
                {
                    OrderId    = order.Id,
                    Message    = "Address isn’t served by USPS. Address verification email sent.",
                    Type       = (int)CommentType.OutputEmail,
                    CreateDate = _time.GetAppNowTime(),
                    UpdateDate = _time.GetAppNowTime()
                });

                db.Commit();
            }
            return(result);
        }