public async Task <ActionResult> Order(Model.Models.Order order)
        {
            var listing = await _listingService.FindAsync(order.ListingID);

            var ordersListing = await _orderService.Query(x => x.ListingID == order.ListingID).SelectAsync();

            if ((order.ToDate.Value - order.FromDate.Value).Days < 2)
            {
                TempData[TempDataKeys.UserMessageAlertState] = "bg-danger";
                TempData[TempDataKeys.UserMessage]           = "[[[The minium quantity for order is two nights]]]";

                return(RedirectToAction("Listing", "Listing", new { id = order.ListingID }));
            }
            if (order.ToDate < order.FromDate)
            {
                TempData[TempDataKeys.UserMessageAlertState] = "bg-danger";
                TempData[TempDataKeys.UserMessage]           = "[[[The date of check out can't be less than the check in date]]]";

                return(RedirectToAction("Listing", "Listing", new { id = order.ListingID }));
            }
            if ((order.Children + order.Adults) > listing.Max_Capacity)
            {
                TempData[TempDataKeys.UserMessageAlertState] = "bg-danger";
                TempData[TempDataKeys.UserMessage]           = string.Format("La maxima capacidad de pasajeros es de  {0}", listing.Max_Capacity);

                return(RedirectToAction("Listing", "Listing", new { id = order.ListingID }));
            }

            if (listing == null)
            {
                return(new HttpNotFoundResult());
            }

            // Redirect if not authenticated
            if (!User.Identity.IsAuthenticated)
            {
                if (Session["fechas"] != null)
                {
                    SearchListingModel fecha = (SearchListingModel)Session["fechas"];
                    fecha.FromDate = order.FromDate;
                    fecha.ToDate   = order.ToDate;

                    fecha.Niños      = order.Children;
                    fecha.Passengers = order.Adults;

                    Session["fechas"] = fecha;
                }
                return(RedirectToAction("Login", "Account", new { ReturnUrl = Url.Action("Listing", "Listing", new { id = order.ListingID }), FromDate = order.FromDate, ToDate = order.ToDate, Adults = order.Adults, Children = order.Children }));
            }
            var userCurrent = User.Identity.User();

            //validar que los dias no esten reservados
            List <DateTime> FechasCocinadas = new List <DateTime>();

            for (DateTime date = order.FromDate.Value; date < order.ToDate.Value; date = date.Date.AddDays(1))
            {
                FechasCocinadas.Add(date);
            }
            foreach (Model.Models.Order ordenesArrendadas in ordersListing.Where(x => x.Status != (int)Enum_OrderStatus.Cancelled))
            {
                for (DateTime date = ordenesArrendadas.FromDate.Value; date < ordenesArrendadas.ToDate.Value; date = date.Date.AddDays(1))
                {
                    if (FechasCocinadas.Contains(date))
                    {
                        TempData[TempDataKeys.UserMessageAlertState] = "bg-danger";
                        TempData[TempDataKeys.UserMessage]           = "[[[You can not book with these selected dates!]]]";
                        return(RedirectToAction("Listing", "Listing", new { id = listing.ID }));
                    }
                }
            }

            // Check if payment method is setup on user or the platform
            var descriptors = _pluginFinder.GetPluginDescriptors <IHookPlugin>(LoadPluginsMode.InstalledOnly, "Payment").Where(x => x.Enabled);

            if (descriptors.Count() == 0)
            {
                TempData[TempDataKeys.UserMessageAlertState] = "bg-danger";
                TempData[TempDataKeys.UserMessage]           = "[[[The provider has not setup the payment option yet, please contact the provider.]]]";

                return(RedirectToAction("Listing", "Listing", new { id = order.ListingID }));
            }

            if (!User.IsInRole("Administrator"))
            {
                if (listing.UserID != userCurrent.Id)
                {
                    //foreach (var descriptor in descriptors)
                    //{
                    //    var controllerType = descriptor.Instance<IHookPlugin>().GetControllerType();
                    //    var controller = ContainerManager.GetConfiguredContainer().Resolve(controllerType) as IPaymentController;

                    //    if (!controller.HasPaymentMethod(listing.UserID))
                    //    {
                    //        TempData[TempDataKeys.UserMessageAlertState] = "bg-danger";
                    //        TempData[TempDataKeys.UserMessage] = string.Format("[[[The provider has not setup the payment option for {0} yet, please contact the provider.]]]", descriptor.FriendlyName);

                    //        return RedirectToAction("Listing", "Listing", new { id = order.ListingID });
                    //    }
                    //}
                    if (order.ID == 0)
                    {
                        order.ObjectState   = Repository.Pattern.Infrastructure.ObjectState.Added;
                        order.Created       = DateTime.Now;
                        order.Modified      = DateTime.Now;
                        order.Status        = (int)Enum_OrderStatus.Created;
                        order.UserProvider  = listing.UserID;
                        order.UserReceiver  = userCurrent.Id;
                        order.ListingTypeID = order.ListingTypeID;
                        order.Currency      = listing.Currency;
                        order.OrderType     = 3;
                        order.Price         = 0;
                        order.Quantity      = 0;
                        var listingPrice = await _listingPriceService.Query(x => x.ListingID == order.ListingID).SelectAsync();

                        var precioEnero   = listingPrice.FirstOrDefault(x => x.FromDate.Month.Equals(01));
                        var precioFebrero = listingPrice.FirstOrDefault(x => x.FromDate.Month.Equals(02));

                        for (DateTime date = order.FromDate.Value; date <= order.ToDate.Value.AddDays(-1); date = date.Date.AddDays(1))
                        {
                            if (date >= precioEnero.FromDate && date <= precioEnero.ToDate)
                            {
                                order.Price    = order.Price + precioEnero.Price;
                                order.Quantity = order.Quantity + 1;
                            }
                            else if (date >= precioFebrero.FromDate && date <= precioFebrero.ToDate)
                            {
                                order.Price    = order.Price + precioFebrero.Price;
                                order.Quantity = order.Quantity + 1;
                            }
                            else
                            {
                                order.Price    = order.Price + listing.Price;
                                order.Quantity = order.Quantity + 1;
                            }
                        }

                        var servicio = order.Price * 0.04;
                        order.Total = order.Price + listing.CleanlinessPrice + servicio;

                        order.Description = HttpContext.ParseAndTranslate(
                            string.Format("{0} #{1} ([[[From]]] {2} [[[To]]] {3})",
                                          listing.Title,
                                          listing.ID,
                                          order.FromDate.Value.ToShortDateString(),
                                          order.ToDate.Value.ToShortDateString()));

                        _orderService.Insert(order);

                        var provider = await _aspNetUserService.FindAsync(order.UserProvider);

                        //await EnviarCorreo(confirmacion, provider.Email);
                    }
                    await _unitOfWorkAsync.SaveChangesAsync();

                    ClearCache();
                    return(RedirectToAction("ConfirmOrder", "Payment", new { id = order.ID }));
                }
                else
                {
                    order.OrderType = 2;
                    if (order.ID == 0)
                    {
                        order.ObjectState   = Repository.Pattern.Infrastructure.ObjectState.Added;
                        order.Created       = DateTime.Now;
                        order.Modified      = DateTime.Now;
                        order.Status        = (int)Enum_OrderStatus.Pending;
                        order.UserProvider  = listing.UserID;
                        order.UserReceiver  = userCurrent.Id;
                        order.ListingTypeID = order.ListingTypeID;
                        order.Currency      = listing.Currency;

                        if (order.ToDate.HasValue && order.FromDate.HasValue)
                        {
                            order.Description = HttpContext.ParseAndTranslate(
                                string.Format("{0} #{1} ([[[From]]] {2} [[[To]]] {3})",
                                              listing.Title,
                                              listing.ID,
                                              order.FromDate.Value.ToShortDateString(),
                                              order.ToDate.Value.ToShortDateString()));

                            order.Quantity = order.ToDate.Value.Subtract(order.FromDate.Value.Date).Days;
                            order.Price    = 0;
                        }
                        else if (order.Quantity.HasValue)
                        {
                            order.Description = string.Format("{0} #{1}", listing.Title, listing.ID);
                            order.Quantity    = order.Quantity.Value - 1;
                            order.Price       = 0;
                        }
                        else
                        {
                            // Default
                            order.Description = string.Format("{0} #{1}", listing.Title, listing.ID);
                            order.Quantity    = 1;
                            order.Price       = 0;
                        }

                        _orderService.Insert(order);
                    }

                    await _unitOfWorkAsync.SaveChangesAsync();

                    ClearCache();
                    TempData[TempDataKeys.UserMessage] = string.Format("[[[Has bloqueado correctamenter tu propiedad entre las fechas {0} y {1}]]]", order.FromDate.Value.ToString("dd-MM-yyyy"), order.ToDate.Value.ToString("dd-MM-yyyy"));
                    return(RedirectToAction("Listing", "Listing", new { id = listing.ID }));
                }
            }
            else
            {
                order.OrderType = 1;
                if (order.ID == 0)
                {
                    order.ObjectState   = Repository.Pattern.Infrastructure.ObjectState.Added;
                    order.Created       = DateTime.Now;
                    order.Modified      = DateTime.Now;
                    order.Status        = (int)Enum_OrderStatus.Pending;
                    order.UserProvider  = listing.UserID;
                    order.UserReceiver  = userCurrent.Id;
                    order.ListingTypeID = order.ListingTypeID;
                    order.Currency      = listing.Currency;

                    if (order.ToDate.HasValue && order.FromDate.HasValue)
                    {
                        order.Description = HttpContext.ParseAndTranslate(
                            string.Format("{0} #{1} ([[[From]]] {2} [[[To]]] {3})",
                                          listing.Title,
                                          listing.ID,
                                          order.FromDate.Value.ToShortDateString(),
                                          order.ToDate.Value.ToShortDateString()));

                        order.Quantity = order.ToDate.Value.Subtract(order.FromDate.Value.Date).Days;
                        order.Price    = 0;
                    }
                    else if (order.Quantity.HasValue)
                    {
                        order.Description = string.Format("{0} #{1}", listing.Title, listing.ID);
                        order.Quantity    = order.Quantity.Value - 1;
                        order.Price       = 0;
                    }
                    else
                    {
                        // Default
                        order.Description = string.Format("{0} #{1}", listing.Title, listing.ID);
                        order.Quantity    = 1;
                        order.Price       = 0;
                    }

                    _orderService.Insert(order);
                }

                await _unitOfWorkAsync.SaveChangesAsync();

                ClearCache();
                TempData[TempDataKeys.UserMessage] = "[[[The maintenance was scheduled successfully!]]]";
                return(RedirectToAction("Listing", "Listing", new { id = listing.ID }));
            }
        }
        public async Task <ActionResult> ListingUpdate(Listing listing, FormCollection form, IEnumerable <HttpPostedFileBase> files, int[] idcama, int[] cantidad)
        {
            if (CacheHelper.Categories.Count == 0)
            {
                TempData[TempDataKeys.UserMessageAlertState] = "bg-danger";
                TempData[TempDataKeys.UserMessage]           = "[[[There are not categories available yet.]]]";

                return(RedirectToAction("Listing", new { id = listing.ID }));
            }
            int  actualiza          = 0;
            bool updateCount        = false;
            int  nextPictureOrderId = 0;

            var user = await _aspNetUserService.FindAsync(listing.UserID);

            // Add new listing
            if (listing.ID == 0)
            {
                listing.ObjectState   = Repository.Pattern.Infrastructure.ObjectState.Added;
                listing.IP            = Request.GetVisitorIP();
                listing.ListingTypeID = 1;
                listing.Title         = "";
                listing.Expiration    = DateTime.MaxValue.AddDays(-1);
                listing.ContactName   = user.FullName;
                listing.ContactEmail  = user.Email;
                listing.ShowPhone     = false;
                listing.ShowEmail     = false;
                listing.UserID        = user.Id;
                updateCount           = true;

                if (listing.Children == false)
                {
                    listing.Children = true;
                }
                else
                {
                    listing.Children = false;
                }

                _listingService.Insert(listing);
                listing.Currency = "CLP";
            }
            else
            {
                // Update listing
                var listingExisting = await _listingService.FindAsync(listing.ID);

                listingExisting.Title       = listing.ID.ToString();
                listingExisting.Description = listing.Description;
                listingExisting.CategoryID  = listing.CategoryID;

                listingExisting.Enabled = listing.Enabled;
                listingExisting.Active  = listing.Active;
                listingExisting.Premium = listing.Premium;

                var propietario = UserManager.FindById(listing.UserID);
                listingExisting.ContactEmail = propietario.Email;
                listingExisting.ContactName  = propietario.FullName;
                listingExisting.ContactPhone = propietario.PhoneNumber;

                listingExisting.Latitude  = listing.Latitude;
                listingExisting.Longitude = listing.Longitude;
                listingExisting.Location  = listing.Location;

                listingExisting.ShowPhone = listing.ShowPhone;
                listingExisting.ShowEmail = listing.ShowEmail;

                listingExisting.Beds  = listing.Beds;
                listingExisting.Rooms = listing.Rooms;

                if (listing.Children == false)
                {
                    listingExisting.Children = true;
                }
                else
                {
                    listingExisting.Children = false;
                }


                listingExisting.UserID = listing.UserID;

                listingExisting.Price    = listing.Price;
                listingExisting.Currency = listing.Currency;

                listingExisting.Tv               = listing.Tv;
                listingExisting.TV_cable         = listing.TV_cable;
                listingExisting.Wifi             = listing.Wifi;
                listingExisting.Grill            = listing.Grill;
                listingExisting.Dishwasher       = listing.Dishwasher;
                listingExisting.Elevator         = listing.Elevator;
                listingExisting.ShortDescription = listing.ShortDescription;
                listingExisting.SafetyMesh       = listing.SafetyMesh;
                listingExisting.Smoker           = listing.Smoker;
                listingExisting.Pets             = listing.Pets;
                listingExisting.Terrace          = listing.Terrace;
                //listingExisting.DescribeCondominium = listing.DescribeCondominium;
                listingExisting.FirstLine        = listing.FirstLine;
                listingExisting.FloorNumber      = listing.FloorNumber;
                listingExisting.M2               = listing.M2;
                listingExisting.Max_Capacity     = listing.Max_Capacity;
                listingExisting.NroOfParking     = listing.NroOfParking;
                listingExisting.Suite            = listing.Suite;
                listingExisting.Washer           = listing.Washer;
                listingExisting.Warranty         = listing.Warranty;
                listingExisting.CleanlinessPrice = listing.CleanlinessPrice;
                listingExisting.Address          = listing.Address;
                listingExisting.Stay             = listing.Stay;

                //listingExisting.ListingTypeID = listing.ListingTypeID;

                listingExisting.ObjectState = Repository.Pattern.Infrastructure.ObjectState.Modified;

                _listingService.Update(listingExisting);
                actualiza = 1;
            }

            // Delete existing fields on item
            var customFieldItemQuery = await _customFieldListingService.Query(x => x.ListingID == listing.ID).SelectAsync();

            var customFieldIds = customFieldItemQuery.Select(x => x.ID).ToList();

            foreach (var customFieldId in customFieldIds)
            {
                await _customFieldListingService.DeleteAsync(customFieldId);
            }

            // Elimina las camas

            var listacama = await _detailBedService.Query(x => x.ListingID == listing.ID).SelectAsync();

            var lista = listacama.Select(x => x.ID).ToList();

            foreach (var id in lista)
            {
                await _detailBedService.DeleteAsync(id);
            }


            // Get custom fields
            var customFieldCategoryQuery = await _customFieldCategoryService.Query(x => x.CategoryID == listing.CategoryID).Include(x => x.MetaField.ListingMetas).SelectAsync();

            var customFieldCategories = customFieldCategoryQuery.ToList();

            // Update custom fields
            foreach (var metaCategory in customFieldCategories)
            {
                var field       = metaCategory.MetaField;
                var controlType = (BeYourMarket.Model.Enum.Enum_MetaFieldControlType)field.ControlTypeID;

                string controlId = string.Format("customfield_{0}_{1}_{2}", metaCategory.ID, metaCategory.CategoryID, metaCategory.FieldID);

                var formValue = form[controlId];

                if (string.IsNullOrEmpty(formValue))
                {
                    continue;
                }

                formValue = formValue.ToString();

                var itemMeta = new ListingMeta()
                {
                    ListingID   = listing.ID,
                    Value       = formValue,
                    FieldID     = field.ID,
                    ObjectState = Repository.Pattern.Infrastructure.ObjectState.Added
                };

                _customFieldListingService.Insert(itemMeta);
            }

            await _unitOfWorkAsync.SaveChangesAsync();


            // Update photos
            if (Request.Files.Count > 0)
            {
                var itemPictureQuery = _listingPictureservice.Queryable().Where(x => x.ListingID == listing.ID);
                if (itemPictureQuery.Count() > 0)
                {
                    nextPictureOrderId = itemPictureQuery.Max(x => x.Ordering);
                }
            }

            if (files != null && files.Count() > 0)
            {
                foreach (HttpPostedFileBase file in files)
                {
                    if ((file != null) && (file.ContentLength > 0) && !string.IsNullOrEmpty(file.FileName))
                    {
                        // Picture picture and get id
                        var picture = new Picture();
                        picture.MimeType = "image/jpeg";
                        _pictureService.Insert(picture);
                        await _unitOfWorkAsync.SaveChangesAsync();

                        // Format is automatically detected though can be changed.
                        ISupportedImageFormat format = new JpegFormat {
                            Quality = 90
                        };
                        Size size = new Size(500, 0);

                        //https://naimhamadi.wordpress.com/2014/06/25/processing-images-in-c-easily-using-imageprocessor/
                        // Initialize the ImageFactory using the overload to preserve EXIF metadata.
                        using (ImageFactory imageFactory = new ImageFactory(preserveExifData: true))
                        {
                            var path = Path.Combine(Server.MapPath("~/images/listing"), string.Format("{0}.{1}", picture.ID.ToString("00000000"), "jpg"));

                            // Load, resize, set the format and quality and save an image.
                            imageFactory.Load(file.InputStream)
                            .Resize(size)
                            .Format(format)
                            .Save(path);
                        }

                        var itemPicture = new ListingPicture();
                        itemPicture.ListingID = listing.ID;
                        itemPicture.PictureID = picture.ID;
                        itemPicture.Ordering  = nextPictureOrderId;

                        _listingPictureservice.Insert(itemPicture);

                        nextPictureOrderId++;
                    }
                }
            }
            //INSERTANDO CAMAS
            if (idcama != null)
            {
                List <int> listaid = new List <int>();
                for (int i = 0; i < idcama.Length; i++)
                {
                    if (listaid.Count != 0) //entra aca cuando no es la primera recorrida
                    {
                        if (!listaid.Contains(idcama[i]))
                        {
                            DetailBed detallecama = new DetailBed();
                            detallecama.TypeOfBedID = idcama[i];
                            detallecama.Quantity    = cantidad[i];
                            detallecama.ListingID   = listing.ID;
                            _detailBedService.Insert(detallecama);
                            listaid.Add(idcama[i]);
                        }
                    }
                    else //entra primero por no tener ninguna cama en la listaid
                    {
                        DetailBed detallecama = new DetailBed();
                        detallecama.TypeOfBedID = idcama[i];
                        detallecama.Quantity    = cantidad[i];
                        detallecama.ListingID   = listing.ID;
                        listaid.Add(idcama[i]);
                        _detailBedService.Insert(detallecama);
                    }
                }
            }   //fin insertando cama

            await _unitOfWorkAsync.SaveChangesAsync();

            if (actualiza == 0)
            {
                listing.Title = listing.ID.ToString();
                _listingService.Update(listing);
                await _unitOfWorkAsync.SaveChangesAsync();
            }

            // Update statistics count
            if (updateCount)
            {
                _sqlDbService.UpdateCategoryItemCount(listing.CategoryID);
                _dataCacheService.RemoveCachedItem(CacheKeys.Statistics);
            }

            return(RedirectToAction("Listings"));
        }