public IList <TrackingState> TrackShipments(IList <TrackingNumberToCheckDto> trackingNumbers)
        {
            var results            = new List <TrackingState>();
            var trackingNumberList = trackingNumbers.Select(t => t.TrackingNumber).ToList();

            foreach (var trackingNumber in trackingNumberList)
            {
                _log.Info("Begin get CA track info=" + trackingNumber);
                var perOneTrackingResult = _api.GetTrackingField(new List <string>()
                {
                    trackingNumber
                });
                if (perOneTrackingResult.Status == CallStatus.Fail)
                {
                    _log.Info(String.Format("Error, tracking number={0}: {1}", trackingNumber,
                                            perOneTrackingResult.Message));
                    results.Add(new TrackingState()
                    {
                        TrackingNumber = trackingNumber,
                        Records        = new List <TrackingRecord>()
                        {
                            new TrackingRecord()
                            {
                                Message = TrackingHelper.BuildUndefinedMessage(perOneTrackingResult.Message),
                                Date    = _time.GetUtcTime(),
                            }
                        }
                    });
                }
                else
                {
                    foreach (var result in perOneTrackingResult.Data)
                    {
                        _log.Info("CA tracking result=" + result.TrackingNumber + ", last status=" +
                                  (result.Records != null && result.Records.Any()
                                      ? result.Records[0].Message + " at " + result.Records[0].Date
                                      : ""));
                    }
                    results.AddRange(perOneTrackingResult.Data);
                }
            }

            foreach (var info in results)
            {
                if (info.Records != null)
                {
                    info.Records.ForEach(r => r.Source = TrackingStatusSources.CanadaPost);
                }
            }

            return(results);
        }
        public IList <TrackingState> TrackShipments(IList <TrackingNumberToCheckDto> trackingNumbers)
        {
            var index    = 0;
            var stepSize = 10;
            var results  = new List <TrackingState>();

            while (index < trackingNumbers.Count)
            {
                var requestTrackingList = trackingNumbers.Select(t => t.TrackingNumber).Skip(index).Take(stepSize).ToList();
                var trackingResult      = _api.GetTrackingField(requestTrackingList); //If one tracking from batch request fail whole request fail
                if (trackingResult.Status == CallStatus.Success)
                {
                    results.AddRange(trackingResult.Data);
                }
                else
                {
                    //After batch request fail, make per item request
                    foreach (var trackingNumber in requestTrackingList)
                    {
                        var perOneTrackingResult = _api.GetTrackingField(new List <string>()
                        {
                            trackingNumber
                        });
                        if (perOneTrackingResult.Status == CallStatus.Fail)
                        {
                            _log.Info(String.Format("Error, tracking number={0}: {1}", trackingNumber,
                                                    perOneTrackingResult.Message));
                            results.Add(new TrackingState()
                            {
                                TrackingNumber = trackingNumber,
                                Records        = new List <TrackingRecord>()
                                {
                                    new TrackingRecord()
                                    {
                                        Message = TrackingHelper.BuildUndefinedMessage(perOneTrackingResult.Message),
                                        Date    = _time.GetUtcTime(),
                                    }
                                }
                            });
                        }
                        else
                        {
                            results.AddRange(perOneTrackingResult.Data);
                        }
                    }

                    _log.Info("Error: " + trackingResult.Message);
                }

                index += stepSize;
            }

            foreach (var info in results)
            {
                if (info.Records != null)
                {
                    info.Records.ForEach(r => r.Source = TrackingStatusSources.USPS);
                }
            }

            return(results);
        }