Пример #1
0
        public async Task <AmbassadorModel> GetAmbassadorAutoAssignAsync(OrderModel order)
        {
            AmbassadorModel closestAmbassador = null;

            DbGeography location = order.OrderRequestor.Location;

            closestAmbassador = await _db.AmbassadorModels.Include(p => p.User).Include(p => p.RefusedOrders)
                                .OrderBy(p => p.Location.Distance(location))
                                .FirstOrDefaultAsync(p => (p.Location.Distance(location) / 1000) <= 50d &&
                                                     p.User.EmailConfirmed &&
                                                     !p.RefusedOrders.Any(x => x.OrderId == order.Id) &&
                                                     !p.OrderModel.Any(o =>
                                                                       o.Status == OrderStatus.PreAssigned ||
                                                                       o.Status == OrderStatus.Pending ||
                                                                       o.Status == OrderStatus.Ready ||
                                                                       o.Status == OrderStatus.ArrangeDelivery));

            if (closestAmbassador == null)
            {
                HttpResponseMessage response = await CallAndreaniApiAsync();

                if (!response.IsSuccessStatusCode)
                {
                    return(closestAmbassador);
                }

                string content = await response.Content.ReadAsStringAsync();

                XDocument createXml = XDocument.Parse(content);

                IEnumerable <UbicacionAndreani> ubicaciones = createXml.Descendants("item").Select(p => new UbicacionAndreani
                {
                    Descripcion   = p.Element("Descripcion").Value,
                    Direccion     = p.Element("Direccion").Value,
                    HoradeTrabajo = p.Element("HoradeTrabajo").Value,
                    Latitud       = p.Element("Latitud").Value,
                    Longitud      = p.Element("Longitud").Value,
                    Mail          = p.Element("Mail").Value,
                    Numero        = p.Element("Numero").Value,
                    Responsable   = p.Element("Responsable").Value,
                    Resumen       = p.Element("Resumen").Value,
                    Sucursal      = p.Element("Sucursal").Value,
                    Telefono1     = p.Element("Telefono1").Value,
                    Telefono2     = p.Element("Telefono2").Value,
                    Telefono3     = p.Element("Telefono3").Value,
                    TipoSucursal  = p.Element("TipoSucursal").Value,
                    TipoTelefono1 = p.Element("TipoTelefono1").Value,
                    TipoTelefono2 = p.Element("TipoTelefono2").Value,
                    TipoTelefono3 = p.Element("TipoTelefono3").Value,
                    Location      = SiteHelper.GeneratePoint($"{p.Element("Latitud").Value},{p.Element("Longitud").Value}".Split(','))
                });

                var listAmbassadors = await _db.AmbassadorModels
                                      .Include(p => p.User)
                                      .Include(p => p.RefusedOrders)
                                      .Where(p => p.User.EmailConfirmed &&
                                             !p.RefusedOrders.Any(x => x.OrderId == order.Id) &&
                                             !p.OrderModel.Any(o => o.Status == OrderStatus.PreAssigned ||
                                                               o.Status == OrderStatus.Pending ||
                                                               o.Status == OrderStatus.Ready ||
                                                               o.Status == OrderStatus.ArrangeDelivery))
                                      .OrderBy(p => p.Location.Distance(p.Location))
                                      .ToListAsync();

                closestAmbassador = listAmbassadors.FirstOrDefault(p =>
                                                                   ubicaciones.Any(x => (x.Location.Distance(p.Location) / 1000) <= 20d));
            }

            return(closestAmbassador);
        }