Example #1
0
        public IEnumerable <ShipmentProgress> Track(string id)
        {
            var ret = new List <ShipmentProgress>();

            var result = string.Empty;

            try
            {
                result = this.httpClient.GetStringAsync(this.apiUrl + id).Result;
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex);
                ret.Add(new ShipmentProgress
                {
                    Status    = ShipmentStatus.Invalid,
                    Message   = "Invalid number",
                    UpdatedAt = DateTime.Now,
                });

                return(ret);
            }


            var json = JArray.Parse(result).First;

            var history = json["statusHistory"];

            //            {
            //                "description": "Die Sendung wurde zugestellt. ",
            //  "dateTime": "31.07.2019 12:14"
            //}
            //            {
            //                "description": "Die Sendung befindet sich in der Zustellung.",
            //  "dateTime": "31.07.2019 08:35"
            //            }
            //            {
            //                "description": "Die Sendung ist im Hermes Verteilzentrum LC Berlin eingetroffen.",
            //  "dateTime": "30.07.2019 10:55"
            //            }
            //            {
            //                "description": "Die Sendung wurde im Hermes Logistikzentrum sortiert.",
            //  "dateTime": "30.07.2019 10:55"
            //            }
            //            {
            //                "description": "Die Sendung ist im Hermes Verteilzentrum LC Berlin eingetroffen.",
            //  "dateTime": "29.07.2019 17:37"
            //            }
            //            {
            //                "description": "Die Sendung wurde im Hermes Logistikzentrum sortiert.",
            //  "dateTime": "29.07.2019 17:37"
            //            }
            //            {
            //                "description": "Die Sendung wurde Hermes elektronisch angekündigt.",
            //  "dateTime": "29.07.2019 07:54"
            //            }

            foreach (var entry in history)
            {
                var desc = entry["description"].ToString().Trim();
                var time = entry["dateTime"].ToString().Trim();

                var dt = DateTime.ParseExact(time, "dd.MM.yyyy HH:mm", null);

                var match = Regex.Match(desc, "Die Sendung ist im Hermes Verteilzentrum (.*?) eingetroffen");

                var location = match.Groups.Count > 1 ? match.Groups[1].Value : "";

                var status = desc switch
                {
                    "Die Sendung wurde Hermes elektronisch angekündigt." => ShipmentStatus.Transit,
                    "Die Sendung wurde zugestellt." => ShipmentStatus.Done,
                    "Die Sendung befindet sich in der Zustellung." => ShipmentStatus.Delivery,
                    "Die Sendung wurde im Hermes Logistikzentrum sortiert." => ShipmentStatus.Transit,
                    _ when desc.Contains("Die Sendung ist im Hermes Verteilzentrum") => ShipmentStatus.Transit,
                    _ => throw new Exception("No valid status found.")
                };

                var progress = new ShipmentProgress
                {
                    Status    = status,
                    Location  = location,
                    Message   = desc,
                    UpdatedAt = dt,
                };

                ret.Add(progress);
            }

            ret.Reverse();

            return(ret);
        }
    }
Example #2
0
        public IEnumerable <ShipmentProgress> Track(string id)
        {
            var ret = new List <ShipmentProgress>();

            string result;

            try
            {
                result = this.httpClient.GetStringAsync(this.apiUrl + id).GetAwaiter().GetResult();
            }
            catch (HttpRequestException ex)
            {
                if (ex.Message.Contains("404") || ex.Message.Contains("400"))
                {
                    ret.Add(new ShipmentProgress
                    {
                        Status    = ShipmentStatus.Invalid,
                        UpdatedAt = DateTime.Now,
                        Message   = "Invalid tracking id.",
                    });
                    return(ret);
                }
                else if (ex.Message.Contains("429"))
                {
                    ret.Add(new ShipmentProgress
                    {
                        Status    = ShipmentStatus.Unknown,
                        UpdatedAt = DateTime.Now,
                        Message   = "API ERROR: TOO MANY REQUESTS",
                    });
                    return(ret);
                }
                throw ex;
            }

            var json = JObject.Parse(result);

            var history = json["shipments"][0]["events"];

            foreach (var entry in history)
            {
                var time     = entry["timestamp"].ToString();
                var location = entry["location"]?["address"]?["addressLocality"]?.ToString();
                var message  = entry["status"].ToString();

                //Console.WriteLine(message);
                //Console.WriteLine(entry["message"].ToString());

                var statusCode = entry["statusCode"].ToString() switch
                {
                    "transit" when message.Contains("Die Sendung wurde in das Zustellfahrzeug geladen.") => ShipmentStatus.Delivery,
                    "transit" => ShipmentStatus.Transit,
                    "delivered" => ShipmentStatus.Done,
                    "pre-transit" => ShipmentStatus.Transit,
                    "unknown" => ShipmentStatus.Transit,
                    "failure" => ShipmentStatus.Transit,
                    _ => throw new Exception("Status not found."),
                };

                if (statusCode == ShipmentStatus.Done)
                {
                    location = string.Empty;
                }

                var progress = new ShipmentProgress
                {
                    Message   = message,
                    Location  = location ?? string.Empty,
                    UpdatedAt = DateTime.Parse(time),
                    Status    = statusCode,
                };

                ret.Add(progress);
            }

            ret.Reverse();

            return(ret);
        }