public void ProcessExistingItems(IUnitOfWork db, IMarketApi api, List <ItemDTO> items)
        {
            _log.Debug("Begin process existing items");

            var index = 0;

            //var logUpdatedItems = new List<string>();
            foreach (var dtoItem in items)
            {
                try
                {
                    Item dbItem    = null;
                    var  dbListing = db.Listings.GetBySKU(dtoItem.SKU, api.Market, api.MarketplaceId);
                    if (dbListing != null)
                    {
                        dbItem = db.Items.Get(dbListing.ItemId);
                    }

                    if (dbItem == null)
                    {
                        _log.Fatal("ProcessExistingItems. Can't find item in DB with SKU=" + dtoItem.SKU);
                        continue;
                    }

                    if (dtoItem.IsExistOnAmazon == true)
                    {
                        _log.Info("Filled by Amazon (exist item), asin=" + dtoItem.ASIN + ", SKU=" + dtoItem.SKU + ", parentASIN=" + dtoItem.ParentASIN);

                        SetItemFieldsIfExistOnAmazon(db, dtoItem, dbItem);

                        SetListingFieldsIfExistOnAmazon(db, dbListing, dtoItem);
                    }
                    else
                    {
                        if (dtoItem.IsExistOnAmazon == false) //NOTE: skip when =NULL
                        {
                            SetItemFieldsIfNotExistOnAmazon(db, dbItem);
                        }

                        _syncInfo.AddWarning(dtoItem.ASIN, "Item is not filled by Amazon (exist item)");
                        _log.Warn("Item is not filled by Amazon, item=" + dtoItem.ASIN);
                    }
                }
                catch (Exception ex)
                {
                    _syncInfo.AddError(dtoItem.ASIN, "Error while updating item", ex);
                    _log.Error(string.Format("Error while updating item {0}", dtoItem.ASIN), ex);
                }
                index++;

                if (index % 100 == 0)
                {
                    db.Commit();
                    db.ReCreate();
                }
            }
            db.Commit();
            //_syncInfo.AddEntities(SyncMessageStatus.Success, logUpdatedItems, "Updated by Amazon (exist items)");
            _log.Debug("End process items");
        }
Ejemplo n.º 2
0
        protected SyncResult SyncAllNewOrders(CancellationToken?token,
                                              ILogService log,
                                              IMarketApi api,
                                              MarketType market,

                                              Func <ILogService, IMarketApi, ISyncInformer, string, IList <ListingOrderDTO> > getOrderItemsFromMarketFunc,

                                              ISyncInformer syncInfo,
                                              IList <IShipmentApi> rateProviders,
                                              IQuantityManager quantityManager,
                                              ISettingsService settings,
                                              IEmailService emailService,
                                              IOrderValidatorService validatorService,
                                              ICacheService cacheService,

                                              ICompanyAddressService companyAddress,
                                              DateTime syncMissedFrom,
                                              ITime time)
        {
            try
            {
                log.Info("Get missed orders");
                var statusList = new List <string> {
                    OrderStatusEnumEx.Canceled,
                    OrderStatusEnumEx.Shipped,
                    OrderStatusEnumEx.Unshipped,
                    OrderStatusEnumEx.Pending
                };                               //NOTE: On API level there status will be converted on eBay status

                var allOrders = api.GetOrders(log, syncMissedFrom, statusList).ToList();

                if (allOrders.Any())
                {
                    var result = ProcessNewOrdersPack(token,
                                                      log,
                                                      api,

                                                      getOrderItemsFromMarketFunc,

                                                      rateProviders,
                                                      validatorService,
                                                      syncInfo,
                                                      settings,
                                                      quantityManager,
                                                      emailService,
                                                      cacheService,

                                                      companyAddress,
                                                      allOrders,
                                                      time);

                    if (!result.IsSuccess)
                    {
                        syncInfo.AddWarning("", "The orders pack processing has failed");
                        return(new SyncResult()
                        {
                            IsSuccess = false
                        });
                    }

                    return(result);
                }

                return(new SyncResult()
                {
                    IsSuccess = true,
                    ProcessedOrders = new List <SyncResultOrderInfo>()
                });
            }
            catch (Exception ex)
            {
                syncInfo.AddError(null, "Error when storing new unshipped orders", ex);
                log.Error("Error when storing new unshipped orders", ex);
                return(new SyncResult()
                {
                    IsSuccess = false
                });
            }
        }
Ejemplo n.º 3
0
        protected SyncResult UpdateExistingUnshippedOrders(CancellationToken?token,
                                                           ILogService log,
                                                           IMarketApi api,

                                                           Func <ILogService, IMarketApi, ISyncInformer, string, IList <ListingOrderDTO> > getOrderItemsFromMarketFunc,

                                                           ISyncInformer syncInfo,
                                                           IList <IShipmentApi> rateProviders,
                                                           IQuantityManager quantityManager,
                                                           IEmailService emailService,
                                                           IOrderValidatorService validatorService,

                                                           IList <string> excludeOrderIdList,

                                                           ICompanyAddressService companyAddress,
                                                           ITime time)
        {
            IList <Order> ordersToUpdate = new List <Order>();

            try
            {
                using (var db = new UnitOfWork(log))
                {
                    var existOrders = db.Orders.GetOrdersByStatus(api.Market,
                                                                  api.MarketplaceId,
                                                                  new[] {
                        OrderStatusEnumEx.Pending,
                        OrderStatusEnumEx.Unshipped,
                        OrderStatusEnumEx.PartiallyShipped
                    }
                                                                  ).ToList();

                    if (excludeOrderIdList != null)
                    {
                        ordersToUpdate = existOrders.Where(o => !excludeOrderIdList.Contains(o.AmazonIdentifier)).ToList();
                    }
                    else
                    {
                        ordersToUpdate = existOrders;
                    }

                    log.Info("Orders to update count:" + ordersToUpdate.Count
                             + " (existing in DB=" + existOrders.Count
                             + ", exclude list=" + (excludeOrderIdList != null ? excludeOrderIdList.Count.ToString() : "[null]") + ")");

                    var index = 0;
                    var step  = 50;
                    while (index < ordersToUpdate.Count)
                    {
                        var ordersToProcess = ordersToUpdate.Skip(index).Take(step).ToList();
                        log.Info("Start process orders from api, from=" + index + ", count=" + ordersToProcess.Count);

                        if (!ProcessExistOrdersPack(token,
                                                    log,
                                                    api,

                                                    getOrderItemsFromMarketFunc,

                                                    syncInfo,
                                                    db,

                                                    rateProviders,
                                                    quantityManager,
                                                    emailService,
                                                    validatorService,

                                                    companyAddress,
                                                    ordersToProcess,
                                                    time))
                        {
                            syncInfo.AddWarning("", "The pending orders pack processing has failed");
                            //Break cycle if pack processing is fail, something wrong (m.b. unavailable Db, m.b. parallel sync)
                            return(new SyncResult()
                            {
                                IsSuccess = false
                            });
                        }
                        index += step;
                        syncInfo.PingSync();
                    }
                }
                return(new SyncResult()
                {
                    IsSuccess = true,
                    ProcessedOrders = ordersToUpdate.Select(o => new SyncResultOrderInfo()
                    {
                        OrderId = o.AmazonIdentifier,
                        OrderStatus = o.OrderStatus
                    }).ToList()
                });
            }
            catch (Exception ex)
            {
                LogError(log, syncInfo, ex, "", "Error when updating existing orders");
                return(new SyncResult()
                {
                    IsSuccess = false
                });
            }
        }
Ejemplo n.º 4
0
        protected SyncResult SyncAllUnshippedOrders(CancellationToken?cancel,
                                                    ILogService log,
                                                    IMarketApi api,

                                                    Func <ILogService, IMarketApi, ISyncInformer, string, IList <ListingOrderDTO> > getOrderItemsFromMarketFunc,

                                                    ISyncInformer syncInfo,
                                                    IList <IShipmentApi> rateProviders,
                                                    IQuantityManager quantityManager,
                                                    ISettingsService settings,
                                                    IEmailService emailService,
                                                    IOrderValidatorService validatorService,
                                                    ICacheService cacheService,

                                                    ICompanyAddressService companyAddress,
                                                    DateTime syncMissedFrom,
                                                    ITime time)
        {
            try
            {
                log.Info("Get missed orders");

                SyncResult result     = new SyncResult();
                var        statusList = new List <string> {
                    OrderStatusEnumEx.Unshipped, OrderStatusEnumEx.PartiallyShipped, OrderStatusEnumEx.Canceled
                };
                var unshippedOrders = api.GetOrders(log, syncMissedFrom, statusList).ToList();

                if (unshippedOrders.Any())
                {
                    result = ProcessNewOrdersPack(cancel,
                                                  log,
                                                  api,

                                                  getOrderItemsFromMarketFunc,

                                                  rateProviders,
                                                  validatorService,
                                                  syncInfo,
                                                  settings,
                                                  quantityManager,
                                                  emailService,
                                                  cacheService,

                                                  companyAddress,
                                                  unshippedOrders,
                                                  time);

                    if (!result.IsSuccess)
                    {
                        syncInfo.AddWarning("", "The orders pack processing has failed");
                        return(new SyncResult()
                        {
                            IsSuccess = false
                        });
                    }
                }

                return(new SyncResult()
                {
                    IsSuccess = true,
                    //NOTE: Return all unshipped orders for correct calculation total orders on Amazon
                    //unprocessed orders actual didn't updated (we can safely skip processing of it)
                    ProcessedOrders = result.ProcessedOrders,
                    SkippedOrders = result.SkippedOrders,

                    /*unshippedOrders.Select(o => new SyncResultOrderInfo()
                     * {
                     *  OrderId = o.OrderId,
                     *  OrderStatus = o.OrderStatus
                     * }).ToList()*/
                });
            }
            catch (Exception ex)
            {
                syncInfo.AddError(null, "Error when storing new unshipped orders", ex);
                log.Error("Error when storing new unshipped orders", ex);
                return(new SyncResult()
                {
                    IsSuccess = false
                });
            }
        }
Ejemplo n.º 5
0
        /// <summary>
        /// Requested new pending orders (from last exist pending order date)
        /// </summary>
        /// <returns></returns>
        protected SyncResult StoreNewPendingOrders(CancellationToken?token,
                                                   ILogService log,
                                                   IMarketApi api,

                                                   Func <ILogService, IMarketApi, ISyncInformer, string, IList <ListingOrderDTO> > getOrderItemsFromMarketFunc,

                                                   IList <IShipmentApi> rateProviders,
                                                   IOrderValidatorService validatorService,
                                                   IEmailService emailService,
                                                   ISyncInformer syncInfo,
                                                   ISettingsService settings,
                                                   IQuantityManager quantityManager,
                                                   ICacheService cacheService,

                                                   ICompanyAddressService companyAddress,
                                                   ITime time)
        {
            try
            {
                using (var db = new UnitOfWork(_log))
                {
                    var lastPending = db.Orders
                                      .GetFiltered(o => o.OrderStatus == OrderStatusEnumEx.Pending &&
                                                   o.Market == (int)api.Market &&
                                                   o.MarketplaceId == api.MarketplaceId)
                                      .OrderBy(o => o.Id).FirstOrDefault();

                    var date = lastPending != null && lastPending.OrderDate.HasValue ? lastPending.OrderDate : null;
                    log.Info(date != null ? "Last pending order date: " + date.Value : "No pending orders!");

                    var updatedAfter = date ?? DateHelper.GetAmazonNowTime().AddDays(-1);
                    log.Info(string.Format("Process Orders created since {0}", updatedAfter));

                    var statusList = new List <string> {
                        OrderStatusEnum.Pending.Str()
                    };

                    var pendingOrders = api.GetOrders(log, updatedAfter, statusList).ToList();
                    log.Info("Total pending orders:" + pendingOrders.Count());

                    syncInfo.PingSync();

                    var result = ProcessNewOrdersPack(token,
                                                      log,
                                                      api,
                                                      getOrderItemsFromMarketFunc,

                                                      rateProviders,
                                                      validatorService,
                                                      syncInfo,
                                                      settings,
                                                      quantityManager,
                                                      emailService,
                                                      cacheService,

                                                      companyAddress,
                                                      pendingOrders,
                                                      time);

                    if (!result.IsSuccess)
                    {
                        syncInfo.AddWarning("", "The orders pack processing has failed");
                        return(new SyncResult()
                        {
                            IsSuccess = false
                        });
                    }

                    return(result);
                }
            }
            catch (Exception ex)
            {
                syncInfo.AddError(null, "Error when storing new orders", ex);
                log.Error("Error when storing new orders", ex);
                return(new SyncResult()
                {
                    IsSuccess = false
                });
            }
        }