예제 #1
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
            });
        }
예제 #2
0
        public void OrderValidationStepInitial(IUnitOfWork db,
                                               ITime time,
                                               CompanyDTO company,
                                               DTOMarketOrder marketOrder,
                                               IList <ListingOrderDTO> orderItems,
                                               Order dbOrder)
        {
            //var upgradeChecker = new UpgradeOrderChecker(_log, _time);
            //var result = upgradeChecker.Check(db, marketOrder, orderItems);
            //upgradeChecker.ProcessResult(result, dbOrder);



            var duplicateChecker = new DuplicateChecker(_log, _emailService, _time);
            var result           = duplicateChecker.Check(db, marketOrder, orderItems);

            duplicateChecker.ProcessResult(result, dbOrder);


            var insureChecker = new InsureChecker(_log, _orderHistory);

            result = insureChecker.Check(db, marketOrder);
            insureChecker.ProcessResult(result, dbOrder);


            var primeChecker = new PrimeChecker(_log);

            result = primeChecker.Check(db, marketOrder);
            primeChecker.ProcessResult(result, dbOrder);


            var dhlChecker = new DhlChecker(_log);

            result = dhlChecker.Check(db, marketOrder, orderItems);
            dhlChecker.ProcessResult(result, dbOrder);


            var blackListChecker = new BlackListChecker(_log, _time);

            result = blackListChecker.Check(db, marketOrder);
            blackListChecker.ProcessResult(result, dbOrder);


            var restockChecker = new RestockChecker(_log, _time);

            result = restockChecker.Check(db, marketOrder, orderItems);
            restockChecker.ProcessResult(result, dbOrder);


            var signConfirmationByOrderCostChecker = new SignConfirmationByOrderCostChecker(_log, _time, db);

            result = signConfirmationByOrderCostChecker.Check(
                marketOrder,
                orderItems);
            signConfirmationByOrderCostChecker.ProcessResult(result, dbOrder);

            var replaceFrenchChecker = new ReplaceFrenchCharsChecker(_log, _time);

            result = replaceFrenchChecker.Check(db,
                                                marketOrder,
                                                orderItems,
                                                (AddressValidationStatus)dbOrder.AddressValidationStatus);
            replaceFrenchChecker.ProcessResult(result, dbOrder);

            //var signConfirmationByServiceTypeChecker = new SignConfirmationByServiceTypeChecker(_log, db, _emailService, _time);
            //result = signConfirmationByServiceTypeChecker.Check(marketOrder,
            //    orderItems);
            //signConfirmationByServiceTypeChecker.ProcessResult(result, dbOrder, marketOrder, orderItems);


            //var signConfirmationRemoveBuyerAskedBeforeChecker = new SignConfirmationRemoveBuyerAskedBeforeChecker(_log, db, _emailService, _time);
            //result = signConfirmationRemoveBuyerAskedBeforeChecker.Check(marketOrder,
            //    orderItems);
            //signConfirmationRemoveBuyerAskedBeforeChecker.ProcessResult(result, dbOrder, marketOrder, orderItems);


            var oversoldChecker = new OversoldChecker(_log, _time, _emailService, _settings);

            result = oversoldChecker.Check(db, marketOrder, orderItems);
            oversoldChecker.ProcessResult(result, dbOrder);

            var oversoldOnHoldChecker = new OnHoldOversoldChecker(_log, _time, _emailService);

            result = oversoldOnHoldChecker.Check(db, marketOrder, orderItems);
            oversoldOnHoldChecker.ProcessResult(result, dbOrder);


            CheckAddressStep(db, dbOrder, marketOrder.GetAddressDto());


            var recipientNameChecker = new RecipientNameChecker(_log,
                                                                _emailService,
                                                                _time,
                                                                () => CheckAddressStep(db, dbOrder, marketOrder.GetAddressDto()));

            result = recipientNameChecker.Check(db,
                                                marketOrder,
                                                orderItems,
                                                (AddressValidationStatus)dbOrder.AddressValidationStatus);
            recipientNameChecker.ProcessResult(result, dbOrder);
            //NOTE: recheck address if name was corected
            if (result.IsSuccess)
            {
                CheckAddressStep(db, dbOrder, marketOrder.GetAddressDto());
            }


            var zipCodeChecker = new ZipCodeChecker(_log, _time);

            result = zipCodeChecker.Check(db,
                                          marketOrder,
                                          orderItems,
                                          (AddressValidationStatus)dbOrder.AddressValidationStatus);
            zipCodeChecker.ProcessResult(result, dbOrder);

            var shippingStateChecker = new ShippingStateChecker(_log, _time);

            result = shippingStateChecker.Check(db,
                                                marketOrder,
                                                orderItems,
                                                (AddressValidationStatus)dbOrder.AddressValidationStatus);
            shippingStateChecker.ProcessResult(result, dbOrder);

            var phoneNumberChecker = new PhoneNumberChecker(_log, _emailService, _time);

            result = phoneNumberChecker.Check(db,
                                              marketOrder,
                                              orderItems,
                                              (AddressValidationStatus)dbOrder.AddressValidationStatus);
            phoneNumberChecker.ProcessResult(result, dbOrder);


            var dismissFFAddressChecker = new DismissFFAddressChecker(_log, _emailService, db, _time);

            result = dismissFFAddressChecker.Check(db,
                                                   marketOrder,
                                                   orderItems,
                                                   (AddressValidationStatus)dbOrder.AddressValidationStatus);
            dismissFFAddressChecker.ProcessResult(result, dbOrder);


            //var addressNotServedByUSPSChecker = new AddressNotServedByUSPSChecker(_log, _htmlScraper, _emailService, _time);
            //result = addressNotServedByUSPSChecker.Check(db,
            //    marketOrder,
            //    orderItems,
            //    (AddressValidationStatus)dbOrder.AddressValidationStatus);
            //addressNotServedByUSPSChecker.ProcessResult(result, dbOrder);


            var internationalExpressChecker = new InternationalExpressChecker(_log, _time);

            result = internationalExpressChecker.Check(marketOrder);
            internationalExpressChecker.ProcessResult(db, result, dbOrder);


            var sameDayChecker = new SameDayChecker(_log, _time);

            result = sameDayChecker.Check(marketOrder);
            sameDayChecker.ProcessResult(db, result, dbOrder);


            var noWeightChecker = new NoWeightChecker(_log, _emailService, _time, company);

            result = noWeightChecker.Check(db, marketOrder, orderItems);
            noWeightChecker.ProcessResult(result, dbOrder);


            dbOrder.CheckedDate  = _time.GetAppNowTime();
            dbOrder.CheckedTimes = dbOrder.CheckedTimes + 1;

            db.Commit();
        }
        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);
        }
        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");
            }

            //International order has issue with PersonName
            if (!AddressHelper.IsStampsValidPersonName(order.FinalPersonName) &&
                (order.AddressValidationStatus == (int)AddressValidationStatus.InvalidRecipientName ||
                 ShippingUtils.IsInternationalState(order.FinalShippingState) ||
                 ShippingUtils.IsInternational(order.FinalShippingCountry)))
            {
                //If can resolved using BuyerName
                var nameKeywords = (order.FinalPersonName ?? "").Split(", .".ToCharArray()).Where(n => n.Length > 2).ToArray();
                if (!nameKeywords.Any())
                {
                    nameKeywords = (order.FinalPersonName ?? "").Split(", .".ToCharArray()).ToArray();
                }

                if (AddressHelper.IsStampsValidPersonName(order.BuyerName)
                    //NOTE: #1 Exclude prefix Mr., initials, like a.cheszes
                    //NOTE: #2 Include when name has only one letter
                    && StringHelper.ContrainOneOfKeywords(order.BuyerName, nameKeywords))
                {
                    db.OrderComments.Add(new OrderComment()
                    {
                        OrderId = order.Id,
                        Message = "[System] Incomplete recipient name was replaced with buyer name: "
                                  + order.FinalPersonName + "=>" + order.BuyerName,
                        Type       = (int)CommentType.Address,
                        CreateDate = _time.GetAppNowTime()
                    });

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

                    return(new CheckResult()
                    {
                        IsSuccess = true,
                        AdditionalData = new[] { order.PersonName }
                    });
                }
                //Send email
                else
                {
                    var emailInfo = new IncompleteNameEmailInfo(_emailService.AddressService,
                                                                null,
                                                                order.OrderId,
                                                                (MarketType)order.Market,
                                                                order.GetAddressDto(),
                                                                items,
                                                                order.BuyerName,
                                                                order.BuyerEmail);

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

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

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

                    db.Commit();

                    return(new CheckResult()
                    {
                        IsSuccess = false,
                        AdditionalData = new List <string>()
                        {
                            "OnHold"
                        }
                    });
                }
            }

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