public override void ExecuteOnComplete(Order order)
        {
            var tzi = TimeZoneInfo.FindSystemTimeZoneById("Mountain Standard Time");
            var today = DateTime.UtcNow.AddHours(tzi.GetUtcOffset(DateTime.Now).Hours);

            var featuredDate = DateTime.Parse(
                this.Item.ProductOption, null,
                System.Globalization.DateTimeStyles.AssumeUniversal);

            //make sure the featured day is scheduled to exactly midnight.
            featuredDate = featuredDate.Date.AddHours(-tzi.GetUtcOffset(featuredDate.Date).Hours);

            using(var context = new RentlerContext())
            {
                var building = context.Buildings.FirstOrDefault(b => b.BuildingId == order.BuildingId);

                if(building == null)
                    throw new ArgumentNullException("Building");

                context.FeaturedListings.Add(new FeaturedListing
                {
                    BuildingId = building.BuildingId,
                    ScheduledDate = featuredDate,
                    Zip = building.Zip
                });

                context.SaveChanges();
            }
        }
Esempio n. 2
0
        public void AddFeatured(Building building, List<DateTime> days)
        {
            var tzi = TimeZoneInfo.FindSystemTimeZoneById("Mountain Standard Time");
            var today = DateTime.UtcNow.AddHours(tzi.GetUtcOffset(DateTime.Now).Hours);

            //make sure the featured days are scheduled to exactly midnight
            //of the day they've been purchased.
            for (int i = 0; i < days.Count; i++)
                days[i] = days[i].Date.AddHours(-tzi.GetUtcOffset(days[i].Date).Hours);

            using (var context = new RentlerContext())
            {
                foreach (var item in days)
                {
                    context.FeaturedListings.Add(new FeaturedListing
                    {
                        BuildingId = building.BuildingId,
                        ScheduledDate = item,
                        Zip = building.Zip
                    });
                }

                context.SaveChanges();
            }
        }
Esempio n. 3
0
        public UserCreditCard CreateCreditCardForUser(UserCreditCard card)
        {
            card = manager.CreateCustomerCard(card);

            if(card == null)
                return null;

            using(var context = new RentlerContext())
            {
                context.UserCreditCards.Add(card);
                context.SaveChanges();
            }

            return card;
        }
        public override void ExecuteOnComplete(Order order)
        {
            using (var context = new RentlerContext())
            {
                // get local date, to timestamp when the building was prioritized (so we can turn it off after 30 days)
                TimeZoneInfo mstTZ = TimeZoneInfo.FindSystemTimeZoneById("Mountain Standard Time");
                DateTime dateLocal = TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, mstTZ);

                var building = context.Buildings.FirstOrDefault(b => b.BuildingId == order.BuildingId);

                if (building == null)
                    throw new ArgumentNullException("Building");

                building.HasPriority = true;
                building.DatePrioritized = dateLocal;

                context.SaveChanges();
            }
        }
Esempio n. 5
0
        /// <summary>
        /// Updates the terms specific fields on Building
        /// </summary>
        /// <param name="username">owner of the building</param>
        /// <param name="building">the building</param>
        /// <returns>
        /// Status with the updated building
        /// </returns>
        public Status<Building> UpdatePropertyTerms(string username, Building building)
        {
            if (string.IsNullOrWhiteSpace(username))
                return Status.ValidationError<Building>(null, "username", "username is required");

            if (building == null)
                return Status.ValidationError<Building>(null, "building", "building is null");

            using (RentlerContext context = new RentlerContext())
            {
                try
                {
                    Building current = (from b in context.Buildings.Include("User")
                                        where b.IsDeleted == false &&
                                        b.BuildingId == building.BuildingId &&
                                        b.User.Username == username
                                        select b).SingleOrDefault();

                    if (current == null)
                        return Status.NotFound<Building>();

                    current.IsBackgroundCheckRequired = building.IsBackgroundCheckRequired;
                    current.IsCreditCheckRequired = building.IsCreditCheckRequired;
                    current.Price = building.Price;
                    current.Deposit = building.Deposit;
                    current.RefundableDeposit = building.RefundableDeposit;
                    current.DateAvailableUtc = building.DateAvailableUtc;
                    current.LeaseLengthCode = building.LeaseLengthCode;
                    current.IsSmokingAllowed = building.IsSmokingAllowed;
                    current.ArePetsAllowed = building.ArePetsAllowed;

                    // pets are not allowed so no fee can be charged
                    if (!building.ArePetsAllowed)
                        current.PetFee = decimal.Zero;
                    else
                        current.PetFee = building.PetFee;

                    // validate the building
                    var validation = Status.Validatate<Building>(current);
                    if (validation.StatusCode != 200)
                        return validation;

                    context.SaveChanges();

                    InvalidateCache(building.BuildingId);

                    return Status.OK<Building>(current);
                }
                catch (Exception ex)
                {
                    // log exception
                    return Status.Error<Building>(
                        "An unexpected error occurred while trying to update rental terms. Contact Rentler support for assistance.",
                        building
                    );
                }
            }
        }
Esempio n. 6
0
        /// <summary>
        /// Updates the promotional specific fields on Building
        /// </summary>
        /// <param name="username">owner of the building</param>
        /// <param name="building">the building</param>
        /// <returns>
        /// Status with the updated building
        /// </returns>
        public Status<Building> UpdatePropertyPromotions(string username, Building building,
			string ribbonId, IEnumerable<DateTime> featuredDates, string priorityListing)
        {
            if (building == null)
                return Status.ValidationError<Building>(null, "building", "building is null");

            using (RentlerContext context = new RentlerContext())
            {
                try
                {
                    Building current = (from b in context.Buildings
                                            .Include("User")
                                            .Include("TemporaryOrder")
                                        where b.IsDeleted == false &&
                                        b.BuildingId == building.BuildingId &&
                                        b.User.Username == username
                                        select b).SingleOrDefault();

                    if (current == null)
                        return Status.NotFound<Building>();

                    current.Title = building.Title;
                    current.Description = building.Description;

                    // validate the building
                    var validation = Status.Validatate<Building>(current);
                    if (validation.StatusCode != 200)
                        return validation;

                    // delete any old order
                    if (current.TemporaryOrder != null)
                        context.Orders.Remove(current.TemporaryOrder);

                    // add order with ribbon if items
                    if (!string.IsNullOrWhiteSpace(ribbonId) || featuredDates != null || !string.IsNullOrWhiteSpace(priorityListing))
                    {
                        Order order = new Order();
                        order.UserId = current.UserId;
                        order.BuildingId = current.BuildingId;
                        order.CreateDate = DateTime.UtcNow;
                        order.CreatedBy = "propertyAdapter";
                        order.OrderStatus = OrderStatus.New;

                        //calculate order total here
                        if (!string.IsNullOrWhiteSpace(ribbonId))
                            order.OrderTotal += Configuration.Products.GetProduct("ribbon")
                                .ToOrderItem(ribbonId, 1).Price;

                        if (featuredDates != null)
                            order.OrderTotal += Configuration.Products
                                .GetProduct("featureddate").ToOrderItem(
                                    DateTime.UtcNow.ToString("G"), 1).Price * featuredDates.Count();

                        if (!string.IsNullOrWhiteSpace(priorityListing))
                            order.OrderTotal += Configuration.Products
                                .GetProduct("prioritylisting").ToOrderItem(
                                    DateTime.UtcNow.ToString("G"), 1).Price;

                        context.Orders.Add(order);
                        context.SaveChanges();

                        current.TemporaryOrder = order;
                        current.TemporaryOrderId = order.OrderId;

                        // add ribbon
                        if (!string.IsNullOrWhiteSpace(ribbonId))
                        {
                            var ribbonItem = Configuration.Products.GetProduct("ribbon").ToOrderItem(ribbonId, 1);
                            ribbonItem.OrderId = order.OrderId;
                            context.OrderItems.Add(ribbonItem);
                        }

                        // add featured dates
                        if (featuredDates != null)
                        {
                            for (int i = 0; i < featuredDates.Count(); ++i)
                            {
                                // featured dates come through with no time, we we have to add it
                                DateTime date = featuredDates.ElementAt(i);
                                date = date.Add(DateTime.Now.TimeOfDay);

                                DateTime dateUtc = date.ToUniversalTime();
                                var featuredItem = Configuration.Products.GetProduct("featureddate").ToOrderItem(dateUtc.ToString("G"), 1);
                                featuredItem.OrderId = order.OrderId;
                                context.OrderItems.Add(featuredItem);
                            }
                        }

                        // add priority listing
                        if (!string.IsNullOrWhiteSpace(priorityListing))
                        {
                            var priorityItem =
                                Configuration.Products.GetProduct("prioritylisting")
                                .ToOrderItem(true.ToString(), 1);
                            priorityItem.OrderId = order.OrderId;
                            context.OrderItems.Add(priorityItem);
                        }
                    }

                    context.SaveChanges();

                    InvalidateCache(building.BuildingId);

                    return Status.OK<Building>(current);
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                    // log exception
                    return Status.Error<Building>(
                        "An unexpected error occurred while trying to save promotions. Contact Rentler support for assistance.",
                        building
                    );
                }
            }
        }
Esempio n. 7
0
        /// <summary>
        /// Gets the application for user. If the application doesn't
        /// exist then one is created.
        /// </summary>
        /// <param name="username">The username of the user.</param>
        /// <returns>
        /// A user application.
        /// </returns>
        public Status<UserApplication> GetApplicationForUser(string username)
        {
            using (var context = new RentlerContext())
            {
                // get the user
                User result = (from u in context.Users.Include("UserApplication")
                               where u.Username == username
                               select u).SingleOrDefault();

                if (result == null)
                    return Status.NotFound<UserApplication>();

                UserApplication application;

                if (result.UserApplication == null)
                {
                    application = new UserApplication();
                    application.UserId = result.UserId;
                    context.UserApplications.Add(application);
                    context.SaveChanges();
                }
                else
                {
                    application = result.UserApplication;
                }

                return Status.OK<UserApplication>(application);
            }
        }
Esempio n. 8
0
        /// <summary>
        /// Sets the application for user.
        /// </summary>
        /// <param name="username">The username of the user to set the application for.</param>
        /// <param name="userApplication">The user's application.</param>
        /// <returns>
        /// The user application that was saved.
        /// </returns>
        public Status<UserApplication> SaveApplicationForUser(
			string username, UserApplication userApplication)
        {
            var identity = CustomAuthentication.GetIdentity();

            if (!identity.IsAuthenticated)
                return Status.UnAuthorized<UserApplication>();

            using (var context = new RentlerContext())
            {
                try
                {
                    bool isNew = false;

                    var application = (from u in context.UserApplications
                                       where u.UserId == identity.UserId
                                       select u).SingleOrDefault();

                    if (application == null)
                    {
                        application = new UserApplication { UserId = identity.UserId };
                        isNew = true;
                    }

                    application.ConvictedExplaination = userApplication.ConvictedExplaination;
                    application.EmergencyContact = userApplication.EmergencyContact;
                    application.EmergencyContactAddressLine1 = userApplication.EmergencyContactAddressLine1;
                    application.EmergencyContactAddressLine2 = userApplication.EmergencyContactAddressLine2;
                    application.EmergencyContactCity = userApplication.EmergencyContactCity;
                    application.EmergencyContactPhone = userApplication.EmergencyContactPhone;
                    application.EmergencyContactState = userApplication.EmergencyContactState;
                    application.EmergencyContactZip = userApplication.EmergencyContactZip;
                    application.FirstName = userApplication.FirstName;
                    application.HasBeenConvicted = userApplication.HasBeenConvicted;
                    application.HasEverBeenUnlawfulDetainer = userApplication.HasEverBeenUnlawfulDetainer;
                    application.LastName = userApplication.LastName;
                    application.PresentAddressLine1 = userApplication.PresentAddressLine1;
                    application.PresentAddressLine2 = userApplication.PresentAddressLine2;
                    application.PresentCity = userApplication.PresentCity;
                    application.PresentEmployer = userApplication.PresentEmployer;
                    application.PresentEmployerPhone = userApplication.PresentEmployerPhone;
                    application.PresentLandlord = userApplication.PresentLandlord;
                    application.PresentLandlordPhone = userApplication.PresentLandlordPhone;
                    application.PresentPhone = userApplication.PresentPhone;
                    application.PresentState = userApplication.PresentState;
                    application.PresentZip = userApplication.PresentZip;
                    application.PreviousAddressLine1 = userApplication.PreviousAddressLine1;
                    application.PreviousAddressLine2 = userApplication.PreviousAddressLine2;
                    application.PreviousCity = userApplication.PreviousCity;
                    application.PreviousEmployer = userApplication.PreviousEmployer;
                    application.PreviousEmployerPhone = userApplication.PreviousEmployerPhone;
                    application.PreviousLandlord = userApplication.PreviousLandlord;
                    application.PreviousLandlordPhone = userApplication.PreviousLandlordPhone;
                    application.PreviousState = userApplication.PreviousState;
                    application.PreviousZip = userApplication.PreviousZip;
                    application.Ssn = userApplication.Ssn;
                    application.UpdateDateUtc = DateTime.UtcNow;
                    application.UpdatedBy = "accountadapter";
                    application.VehicleColor = userApplication.VehicleColor;
                    application.VehicleLicenseNumber = userApplication.VehicleLicenseNumber;
                    application.VehicleMake = userApplication.VehicleMake;
                    application.VehicleModel = userApplication.VehicleModel;
                    application.VehicleState = userApplication.VehicleState;
                    application.VehicleYear = userApplication.VehicleYear;

                    // new applications need to be added to the context
                    if (isNew)
                        context.UserApplications.Add(application);

                    context.SaveChanges();

                    return Status.OK<UserApplication>(application);
                }
                catch (Exception ex)
                {
                    // TODO: log exception
                    return Status.Error<UserApplication>("System was unable to create/update application", null);
                }
            }
        }
Esempio n. 9
0
        /// <summary>
        /// Gets the property that includes all of the temporary ordering
        /// information that is associated.
        /// </summary>
        /// <param name="buildingId">The building id.</param>
        /// <param name="username">The username.</param>
        /// <returns>
        /// A building with all the temporary ordering information.
        /// </returns>
        public Status<Building> GetPropertyPromoteInfo(long buildingId, string username)
        {
            if (string.IsNullOrWhiteSpace(username))
                return Status.ValidationError<Building>(null, "username", "The username is required");

            using (var context = new RentlerContext(false))
            {
                try
                {
                    var building = (from b in context.Buildings
                                        .Include("TemporaryOrder.OrderItems")
                                    where b.IsDeleted == false &&
                                    b.BuildingId == buildingId &&
                                    b.User.IsDeleted == false &&
                                    b.User.Username == username
                                    select b).SingleOrDefault();

                    // invalid building id
                    if (building == null)
                        return Status.NotFound<Building>();

                    // see if temporary order is still valid
                    if (building.TemporaryOrder != null)
                    {
                        bool hasChanges = false;

                        // we only care about featured date order items
                        var featuredOrderItems = building.TemporaryOrder.OrderItems.Where(i => i.ProductId == "featureddate");
                        if (featuredOrderItems != null)
                        {
                            for (int i = 0; i < featuredOrderItems.Count(); ++i)
                            {
                                var orderItem = featuredOrderItems.ElementAt(i);

                                // get date as is in db
                                DateTime featureUtc = DateTime.Parse(orderItem.ProductOption);
                                if (featureUtc.Date < DateTime.UtcNow.Date)
                                {
                                    // if the featured date has passed its invalid so remove it
                                    context.OrderItems.Remove(orderItem);
                                    --i;
                                    hasChanges = true;
                                }
                            }
                        }

                        if (building.TemporaryOrder.OrderItems.Count == 0)
                        {
                            context.Orders.Remove(building.TemporaryOrder);
                            // redundant but its here just in case we get a messed
                            // up temporary order with no order items
                            hasChanges = true;
                        }

                        if (hasChanges)
                            context.SaveChanges();
                    }

                    return Status.OK<Building>(building);
                }
                catch (Exception ex)
                {
                    return Status.Error<Building>(ex.Message, null);
                }
            }
        }
Esempio n. 10
0
        /// <summary>
        /// Removed the requested building
        /// </summary>
        /// <param name="buildingId">building identifier</param>
        /// <param name="username">owner of the building</param>
        /// <returns>
        /// status indicating whether building was successfully removed
        /// </returns>
        public Status<bool> DeleteBuilding(long buildingId, string username)
        {
            if (buildingId == 0)
                return Status.ValidationError<bool>(false, "buildingId", "buildingId is required");

            if (string.IsNullOrWhiteSpace(username))
                return Status.ValidationError<bool>(false, "username", "username is required");

            using (var context = new RentlerContext())
            {
                var building = (from b in context.Buildings.Include("User")
                                where b.IsDeleted == false &&
                                b.BuildingId == buildingId &&
                                b.User.Username == username
                                select b).SingleOrDefault();

                if (building == null)
                    return Status.NotFound<bool>();

                // soft delete building
                building.IsDeleted = true;

                try
                {
                    context.SaveChanges();

                    InvalidateCache(building.BuildingId);

                    return Status.OK<bool>(true);
                }
                catch (Exception ex)
                {
                    return Status.Error<bool>(
                        ex.Message,
                        false
                    );
                }
            }
        }
Esempio n. 11
0
        /// <summary>
        /// Creates the building.
        /// </summary>
        /// <param name="username">The username.</param>
        /// <param name="building">The building.</param>
        /// <returns></returns>
        public Status<Building> CreateBuilding(string username, Building building)
        {
            // validate the input
            if (string.IsNullOrWhiteSpace(username))
                return Status.ValidationError<Building>(null, "username", "username is required");
            if (building == null)
                return Status.ValidationError<Building>(null, "building", "building is null");

            // validate the building
            var validation = Status.Validatate<Building>(building);
            if (validation.StatusCode != 200)
                return validation;

            // normalize standard amenities
            if (building.BuildingAmenities != null)
            {
                var amenities = building.BuildingAmenities.Distinct().ToList();
                for (int x = 0; x < amenities.Count; ++x)
                {
                    if (!Amenities.Current.IsValidAmenity(amenities[x].AmenityId))
                    {
                        amenities.RemoveAt(x);
                        --x;
                    }
                }
                building.BuildingAmenities = amenities;
            }

            // normalize custom amenities
            if (building.CustomAmenities != null)
            {
                var custom = building.CustomAmenities.Distinct().ToList();
                // pascal case custom amenities
                for (int x = 0; x < custom.Count; ++x)
                {
                    if (string.IsNullOrEmpty(custom[x].Name))
                    {
                        custom.RemoveAt(x);
                        --x;
                        continue;
                    }
                    custom[x].Name = char.ToUpper(custom[x].Name[0]) + custom[x].Name.Substring(1);
                }
                building.CustomAmenities = custom;
            }

            //get the lat/lng location of the building
            Geocode(building);

            // add it
            using (RentlerContext context = new RentlerContext())
            {
                var user = (from u in context.Users.Include("ContactInfos")
                            where u.Username == username && !u.IsDeleted
                            select u).FirstOrDefault();

                if (user == null)
                    return Status.ValidationError<Building>(null, "username", "User doesn't exist");

                // try to make one
                if (building.ContactInfo == null)
                    return Status.ValidationError<Building>(null, "contactinfo", "No contact information specified");

                // validate the contactinfo
                var contactValidation = Status.Validatate<ContactInfo>(building.ContactInfo);
                if (contactValidation.StatusCode != 200)
                    return Status.ValidationError<Building>(null, "contactinfo", "The contact information is not valid");

                // if the contactinfoid isn't set
                if (building.ContactInfoId == 0)
                {
                    // add it
                    ContactInfo finalContact = building.ContactInfo;
                    user.ContactInfos.Add(finalContact);
                    context.SaveChanges();

                    // add it to the building
                    building.ContactInfoId = finalContact.ContactInfoId;
                }
                else
                {
                    var contact = user.ContactInfos.Where(u => u.ContactInfoId == building.ContactInfoId).FirstOrDefault();
                    if (contact == null)
                        return Status.ValidationError<Building>(null, "contactinfoid", "ContactInfoId is invalid");

                    // update the contact info
                    contact.CompanyName = building.ContactInfo.CompanyName;
                    contact.ContactInfoTypeCode = building.ContactInfo.ContactInfoTypeCode;
                    contact.Email = building.ContactInfo.Email;
                    contact.Name = building.ContactInfo.Name;
                    contact.PhoneNumber = building.ContactInfo.PhoneNumber;
                    contact.ShowEmailAddress = building.ContactInfo.ShowEmailAddress;
                    contact.ShowPhoneNumber = building.ContactInfo.ShowPhoneNumber;
                }

                // don't allow them to pass complex object. We handled it above.
                building.ContactInfo = null;

                // set defaults
                building.CreateDateUtc = DateTime.UtcNow;
                building.CreatedBy = "propertyadapter";
                building.UpdateDateUtc = DateTime.UtcNow;
                building.UpdatedBy = "propertyadapter";

                user.Buildings.Add(building);

                try
                {
                    context.SaveChanges();
                }
                catch (Exception e)
                {
                    // log exception
                    return Status.Error<Building>(
                        "An unexpected error occurred while trying to save the listing information. Contact Rentler support for assistance.",
                        building
                    );
                }

                return Status.OK<Building>(building);
            }
        }
Esempio n. 12
0
        public Status<bool> RemoveUserCreditCard(int userCreditCardId)
        {
            UserCreditCard card;

            using (var context = new RentlerContext())
            {
                card = (from c in context.UserCreditCards
                        where c.UserCreditCardId == userCreditCardId
                        select c).FirstOrDefault();

                if (card == null)
                    return Status.NotFound<bool>();

                card.IsDeleted = true;
                manager.UpdateCustomerCard(card);

                context.SaveChanges();

                return Status.OK(true);
            }
        }
Esempio n. 13
0
        public Status<Order> ProcessOrder(
            string username, int orderId, UserCreditCard card, bool saveCard)
        {
            bool isNewCard = card.UserCreditCardId == 0;

            if (isNewCard)
            {
                // we're adding the new card regardless but we don't know if its valid
                // if the user requested to save it we will make it active after the payment
                // is successful, otherwise it will remain inactive
                card.IsDeleted = true;

                var cardResult = AddUserCreditCard(username, card);

                if (cardResult.StatusCode != 200)
                {
                    var orderStatus = GetOrderForCheckout(username, orderId);

                    orderStatus.StatusCode = 500;
                    orderStatus.Errors = new ValidationResult[] {
                        new ValidationResult("An unexpected failure occurred: payment was not processed", new string[] { "Order" })
                    };

                    return orderStatus;
                }
            }
            else
            {
                //get the card
                var storedCard = GetUserCreditCard(username, card.UserCreditCardId);

                if (storedCard == null)
                {
                    var orderStatus = GetOrderForCheckout(username, orderId);

                    orderStatus.StatusCode = 500;
                    orderStatus.Errors = new ValidationResult[] {
                        new ValidationResult("Failed to locate credit card on file: payment was not processed", new string[] { "Order" })
                    };

                    return orderStatus;
                }

                //update the billing address if anything changed
                if (storedCard.Address1 != card.Address1 ||
                    storedCard.Address2 != card.Address2 ||
                    storedCard.City != card.City ||
                    storedCard.FirstName != card.FirstName ||
                    storedCard.LastName != card.LastName ||
                    storedCard.State != card.State ||
                    storedCard.Zip != card.Zip)
                {
                    storedCard.Address1 = card.Address1;
                    storedCard.Address2 = card.Address2;
                    storedCard.City = card.City;
                    storedCard.FirstName = card.FirstName;
                    storedCard.LastName = card.LastName;
                    storedCard.State = card.State;
                    storedCard.Zip = card.Zip;

                    var updateStatus = UpdateUserCreditCard(username, storedCard);

                    if (updateStatus.StatusCode != 200)
                    {
                        var orderStatus = GetOrderForCheckout(username, orderId);

                        orderStatus.StatusCode = 500;
                        orderStatus.Errors = new ValidationResult[] {
                            new ValidationResult("Failed to update card address: payment was not processed", new string[] { "Order" })
                        };

                        return orderStatus;
                    }
                }

                card = storedCard;
            }

            //grab the order
            var order = GetOrderForCheckout(username, orderId);

            //attach the credit card to the order for our records
            order.Result.UserCreditCardId = card.UserCreditCardId;

            if (order.StatusCode != 200)
                return order;

            //let's pay for stuff!

            CardPaymentResult result;

            if (App.StorePricing == "Penny")
                result = manager.AuthorizeCreditCardPayment(card, 0.01m);
            else
                result = manager.AuthorizeCreditCardPayment(card, order.Result.OrderTotal);

            //did it work?
            if (result.Approved)
            {
                order.Result.OrderStatus = OrderStatus.Succeeded;
            }
            else
            {
                order.StatusCode = 500;

                // the payment method used is not valid so it should not be attached to
                // the order. Clear it here and the change will be persisted later
                order.Result.UserCreditCardId = null;

                //gateway might be down
                if (result.ServiceUnavailable)
                {
                    order.Result.OrderStatus = OrderStatus.ServiceUnavailable;
                    order.Errors = new ValidationResult[] {
                        new ValidationResult("Payment service is unavailable. Please try again later.", new string[] { "Order" })
                    };
                }
                //or it was declined
                else
                {
                    order.Result.OrderStatus = OrderStatus.CardDeclined;
                    order.Errors = new ValidationResult[] {
                        new ValidationResult("Credit Card was declined", new string[] { "Order" })
                    };
                }
            }

            //update the order status
            using (var context = new RentlerContext())
            {

                var toUpdate = (from o in context.Orders
                                    .Include("Building")
                                where o.OrderId == order.Result.OrderId
                                select o).SingleOrDefault();

                toUpdate.OrderStatus = order.Result.OrderStatus;
                toUpdate.UserCreditCardId = order.Result.UserCreditCardId;

                //remove temporary order if we're good
                if (order.Result.OrderStatus == OrderStatus.Succeeded)
                {
                    toUpdate.Building.TemporaryOrderId = null;

                    // allow credit card to be used again if requested
                    if (isNewCard && saveCard)
                    {
                        context.Entry(toUpdate).Reference(o => o.UserCreditCard).Load();
                        toUpdate.UserCreditCard.IsDeleted = false;
                    }
                }

                context.SaveChanges();
            }

            // send receipt only if order was successful
            if (order.Result.OrderStatus == OrderStatus.Succeeded)
            {
                //send a receipt
                EmailOrderReceiptModel model = new EmailOrderReceiptModel()
                {
                    To = order.Result.User.Email,
                    Name = string.Format("{0} {1}", order.Result.User.FirstName, order.Result.User.LastName),
                    BuildingId = (order.Result.BuildingId.HasValue) ? order.Result.BuildingId.Value : 0,
                    OrderItems = order.Result.OrderItems.ToList(),
                    OrderTotal = order.Result.OrderTotal
                };
                mailer.Receipt(model);
            }

            return order;
        }
Esempio n. 14
0
        public Status<bool> FulfillCompletedOrder(string username, int orderId)
        {
            using (var context = new RentlerContext())
            {
                var order = (from o in context.Orders
                                 .Include("OrderItems")
                                 .Include("Building")
                             where o.OrderId == orderId &&
                                   (o.User.Username == username || o.User.Email == username)
                             select o).SingleOrDefault();

                if (order == null)
                    Status.NotFound<bool>();

                foreach (var item in order.OrderItems)
                {
                    var p = Rentler.Configuration.Products
                        .GetProduct(item.ProductId)
                        .FromOrderItem(item);

                    p.ExecuteOnComplete(order);
                }

                context.SaveChanges();

                return Status.OK(true);
            }
        }
Esempio n. 15
0
        /// <summary>
        /// Updates the profile of the specified user
        /// </summary>
        /// <param name="username">the username of the user</param>
        /// <param name="firstName">first name of user</param>
        /// <param name="lastName">last name of user</param>
        /// <param name="email">email of user</param>
        /// <returns>
        /// status result with this updated user
        /// </returns>
        public Status<User> UpdateProfile(string username, string firstName, string lastName, string email)
        {
            using (var context = new RentlerContext())
            {
                // get user to update
                var userStatus = GetUser(username, context);

                if (userStatus.StatusCode != 200)
                    return userStatus;

                var user = userStatus.Result;

                // email changed
                if (user.Email.ToLower() != email.ToLower())
                {
                    var dupEmail = context.Users
                        .Where(u => !u.IsDeleted && u.Email.ToLower() == email.ToLower())
                        .Count();

                    if (dupEmail > 0)
                        return Status.ValidationError<User>(null, "Email", "The email is already used");

                    // ok to update
                    user.Email = email;
                }

                user.FirstName = firstName;
                user.LastName = lastName;
                user.UpdatedBy = "AccountAdapter";
                user.UpdateDateUtc = DateTime.UtcNow;

                context.SaveChanges();

                return Status<User>.OK(user);
            }
        }
Esempio n. 16
0
        public Status<UserInterest> SendApplication(string username, int userInterestId, UserApplication application)
        {
            if (string.IsNullOrWhiteSpace(username))
                return Status.ValidationError<UserInterest>(null, "username", "The username is required");

            // validate UserApplication
            var appStatusValid = Status.Validatate<UserApplication>(application);

            if (appStatusValid.StatusCode != 200)
                return Status.ValidationError<UserInterest>(null, "application", "The application is not valid");

            // update user application
            var appStatusSave = SaveApplicationForUser(username, application);

            if (appStatusSave.StatusCode != 200)
                return Status.Error<UserInterest>("System was unable to update application", null);

            using (RentlerContext context = new RentlerContext())
            {
                try
                {
                    // get lead
                    var lead = (from i in context.UserInterests
                                where i.User.Username == username && i.UserInterestId == userInterestId
                                select i).SingleOrDefault();

                    if (lead == null)
                        return Status.NotFound<UserInterest>();

                    // update lead - ApplicationSubmitted = true
                    lead.ApplicationSubmitted = true;

                    context.SaveChanges();

                    EmailSendApplicationModel model = new EmailSendApplicationModel(lead);
                    mailer.SendApplication(model);

                    return Status.OK(lead);
                }
                catch (Exception ex)
                {
                    // log exception
                    return Status.Error<UserInterest>("System was unable to get lead", null);
                }
            }
        }
Esempio n. 17
0
        /// <summary>
        /// Activates the building.
        /// </summary>
        /// <param name="context">The context.</param>
        /// <param name="building">The building.</param>
        /// <returns></returns>
        private Status<Building> ActivateBuilding(RentlerContext context, Building building)
        {
            if (building == null)
                return Status.NotFound<Building>();

            if (!building.Bedrooms.HasValue)
                return Status.Error("Listing is not complete", building);
            ////confirm this is a valid listing
            //var listing = new Listing(building);
            //if (!listing.IsValidListing)
            //    return Status.Error("Listing is not complete", building);

            // set active
            building.IsActive = true;

            // if date activated is already set, only reset to now if it is more than 14 days old
            if (building.DateActivatedUtc.HasValue)
            {
                if (building.DateActivatedUtc <= DateTime.UtcNow.AddDays(-14))
                    building.DateActivatedUtc = DateTime.UtcNow;
            }
            else
                building.DateActivatedUtc = DateTime.UtcNow;

            try
            {
                context.SaveChanges();

                InvalidateCache(building.BuildingId);

                return Status.OK<Building>(building);
            }
            catch (Exception ex)
            {
                return Status.Error<Building>(ex.Message, building);
            }
        }
Esempio n. 18
0
        public Status<UserCreditCard> UpdateUserCreditCard(string username, UserCreditCard card)
        {
            if (string.IsNullOrWhiteSpace(username))
                return Status.ValidationError<UserCreditCard>(null, "username", "The username is required");

            if (card == null)
                return Status.ValidationError<UserCreditCard>(null, "card", "card is null");

            card = manager.UpdateCustomerCard(card);

            if (card.UserCreditCardId == 0)
                return AddUserCreditCard(username, card);

            using (RentlerContext context = new RentlerContext())
            {
                try
                {
                    var userCreditCard = (from uc in context.UserCreditCards
                                          where uc.User.IsDeleted == false &&
                                          uc.User.Username == username &&
                                          uc.UserCreditCardId == card.UserCreditCardId
                                          select uc).SingleOrDefault();

                    userCreditCard.Alias = card.Alias;
                    userCreditCard.AccountReference = card.AccountReference;
                    userCreditCard.CardName = card.CardName;
                    userCreditCard.CardNumber = card.CardNumber;
                    userCreditCard.ExpirationMonth = card.ExpirationMonth;
                    userCreditCard.ExpirationYear = card.ExpirationYear;
                    userCreditCard.Address1 = card.Address1;
                    userCreditCard.Address2 = card.Address2;
                    userCreditCard.City = card.City;
                    userCreditCard.Email = card.Email;
                    userCreditCard.FirstName = card.FirstName;
                    userCreditCard.LastName = card.LastName;
                    userCreditCard.Phone = card.Phone;
                    userCreditCard.State = card.State;
                    userCreditCard.Zip = card.Zip;
                    userCreditCard.IsDeleted = card.IsDeleted;
                    userCreditCard.UpdatedBy = "orderadapter";
                    userCreditCard.UpdateDate = DateTime.UtcNow;

                    context.SaveChanges();

                    return Status.OK<UserCreditCard>(card);
                }
                catch (Exception ex)
                {
                    return Status.Error<UserCreditCard>(ex.Message, card);
                }
            }
        }
Esempio n. 19
0
        /// <summary>
        /// Deactivates the building.
        /// </summary>
        /// <param name="context">The context.</param>
        /// <param name="building">The building.</param>
        /// <returns></returns>
        private Status<Building> DeactivateBuilding(RentlerContext context, Building building)
        {
            if (building == null)
                return Status.NotFound<Building>();

            building.IsActive = false;

            try
            {
                context.SaveChanges();

                InvalidateCache(building.BuildingId);

                return Status.OK<Building>(building);
            }
            catch (Exception ex)
            {
                return Status.Error<Building>(ex.Message, building);
            }
        }
Esempio n. 20
0
        public Status<UserCreditCard> AddUserCreditCard(string username, UserCreditCard card)
        {
            if (string.IsNullOrWhiteSpace(username))
                return Status.ValidationError<UserCreditCard>(null, "username", "The username is required");

            if (card == null)
                return Status.ValidationError<UserCreditCard>(null, "card", "card is null");

            card.CreatedBy = "orderadapter";
            card.CreateDate = DateTime.UtcNow;

            // validate the contactinfo
            var cardValidation = Status.Validatate<UserCreditCard>(card);
            if (cardValidation.StatusCode != 200)
                return Status.ValidationError<UserCreditCard>(card, "", "credit card is not valid");

            card.AccountReference = Guid.NewGuid();

            card = manager.CreateCustomerCard(card);

            if (card == null)
                return Status.Error("Problem creating card on payment service.", card);

            using (RentlerContext context = new RentlerContext())
            {
                try
                {
                    var user = (from u in context.Users
                                where u.IsDeleted == false &&
                                u.Username == username
                                select u).SingleOrDefault();

                    user.UserCreditCards.Add(card);
                    context.SaveChanges();

                    return Status.OK<UserCreditCard>(card);
                }
                catch (Exception ex)
                {
                    return Status.Error<UserCreditCard>(ex.Message, card);
                }
            }
        }
Esempio n. 21
0
        public Status<Building> CreateProperty(Building building)
        {
            var identity = CustomAuthentication.GetIdentity();

            if (!identity.IsAuthenticated)
                return Status.UnAuthorized<Building>();

            if (building == null)
                return Status.ValidationError<Building>(null, "building", "building is null");

            //get the lat/lng location of the building
            Geocode(building);

            using (RentlerContext context = new RentlerContext())
            {
                try
                {
                    building.UserId = identity.UserId;

                    // set defaults
                    building.CreateDateUtc = DateTime.UtcNow;
                    building.CreatedBy = "propertyadapter.createproperty";

                    context.Buildings.Add(building);
                    context.SaveChanges();

                    return Status.OK<Building>(building);
                }
                catch (Exception ex)
                {
                    // TODO: log exception

                    return Status.Error<Building>("An unexpected error occurred so the property was not created. Contact Rentler Support for assistance.", building);
                }
            }
        }
Esempio n. 22
0
        /// <summary>
        /// Registers the specified user.
        /// </summary>
        /// <param name="user">The user.</param>
        /// <param name="password">The password.</param>
        /// <returns></returns>
        public Status<User> RegisterUser(User user, string password)
        {
            user.CreateDateUtc = DateTime.UtcNow;
            user.UpdateDateUtc = DateTime.UtcNow;
            user.UpdatedBy = "AccountAdapter";

            // validate the object
            var result = Status.Validatate<User>(user);
            if (result.StatusCode != 200)
                return result;

            if (string.IsNullOrWhiteSpace(password))
                return Status.ValidationError<User>(null, "Password", "The password was not specified");

            using (var context = new RentlerContext())
            {
                try
                {
                    // check for dup email
                    var dupEmail = context.Users.Where(u => !u.IsDeleted && u.Email.ToLower() == user.Email.ToLower()).Count();
                    if (dupEmail > 0)
                    {
                        return Status.ValidationError<User>(null, "Email", "The email is already used");
                    }

                    // check for dup username
                    var dupUser = context.Users.Where(u => !u.IsDeleted && u.Username.ToLower() == user.Username.ToLower()).Count();
                    if (dupUser > 0)
                    {
                        return Status.ValidationError<User>(null, "Username", "The username is already used");
                    }

                    user.PasswordHash = FormsAuthentication.HashPasswordForStoringInConfigFile(password, "SHA1");

                    // create the user
                    context.Users.Add(user);
                    context.SaveChanges();

                    // notify user by email that their password was changed successfully.
                    EmailAccountRegisterModel model = new EmailAccountRegisterModel()
                    {
                        Name = string.Format("{0} {1}", user.FirstName, user.LastName),
                        To = user.Email
                    };
                    mailer.Register(model);

                    return Status<User>.OK(user);
                }
                catch (Exception ex)
                {
                    // TODO: log exception
                    return Status.Error<User>("System was unable to create user", null);
                }
            }
        }
Esempio n. 23
0
        public Status<bool> DeleteUserInterest(string username, int userInterestId)
        {
            if (string.IsNullOrWhiteSpace(username))
                return Status.ValidationError<bool>(false, "username", "The username is required");

            using (RentlerContext context = new RentlerContext())
            {
                try
                {
                    var lead = (from i in context.UserInterests
                                where i.Building.User.Username == username && i.UserInterestId == userInterestId
                                select i).SingleOrDefault();

                    if (lead == null)
                        return Status.NotFound<bool>();

                    context.UserInterests.Remove(lead);
                    context.SaveChanges();

                    return Status.OK(true);
                }
                catch (Exception ex)
                {
                    // TODO: log exception
                    return Status.Error<bool>("System was unable to remove the lead", false);
                }
            }
        }
Esempio n. 24
0
        /// <summary>
        /// Takes care of storing the user's credit card information.
        /// If it is a new card, it will create a new entry in the payment system
        /// and in our own storage. If it is just an update (e.g. the user changing their
        /// address information), it will act accordingly.
        /// </summary>
        /// <param name="card">The user's credit card.</param>
        public void UpdateCreditCardForUser(UserCreditCard card)
        {
            card = manager.UpdateCustomerCard(card);

            if(card.UserCreditCardId == 0)
                CreateCreditCardForUser(card);
            else
            {
                UserCreditCard toUpdate = null;

                using(var context = new RentlerContext())
                {
                    toUpdate = (from u in context.UserCreditCards
                                where u.UserId == card.UserId &&
                                      u.UserCreditCardId == card.UserCreditCardId
                                select u).SingleOrDefault();

                    if(toUpdate == null)
                        throw new ArgumentNullException();

                    toUpdate.Alias = card.Alias;
                    toUpdate.AccountReference = card.AccountReference;
                    toUpdate.CardName = card.CardName;
                    toUpdate.CardNumber = card.CardNumber;
                    toUpdate.ExpirationMonth = card.ExpirationMonth;
                    toUpdate.ExpirationYear = card.ExpirationYear;
                    toUpdate.Address1 = card.Address1;
                    toUpdate.Address2 = card.Address2;
                    toUpdate.City = card.City;
                    toUpdate.Email = card.Email;
                    toUpdate.FirstName = card.FirstName;
                    toUpdate.LastName = card.LastName;
                    toUpdate.Phone = card.Phone;
                    toUpdate.State = card.State;
                    toUpdate.Zip = card.Zip;
                    toUpdate.IsDeleted = card.IsDeleted;

                    context.SaveChanges();
                }
            }
        }
Esempio n. 25
0
        public Status<UserInterest> SendUserResponse(string username, int userInterestId, string response)
        {
            if (string.IsNullOrWhiteSpace(username))
                return Status.ValidationError<UserInterest>(null, "username", "The username is required");

            if (string.IsNullOrWhiteSpace(response))
                return Status.ValidationError<UserInterest>(null, "response", "Response is required");

            using (RentlerContext context = new RentlerContext())
            {
                try
                {
                    var lead = (from i in context.UserInterests
                                where i.Building.User.Username == username && i.UserInterestId == userInterestId
                                select i).SingleOrDefault();

                    if (lead == null)
                        return Status.NotFound<UserInterest>();

                    lead.ResponseMessage = response;
                    context.SaveChanges();

                    EmailRequestApplicationModel model = new EmailRequestApplicationModel(lead);
                    this.mailer.RequestApplication(model);

                    return Status.OK(lead);
                }
                catch (Exception ex)
                {
                    // log exception
                    return Status.Error<UserInterest>("System was unable to get lead", null);
                }
            }
        }
Esempio n. 26
0
        /// <summary>
        /// Resets the password of the specified user
        /// </summary>
        /// <param name="email">user's email</param>
        /// <returns></returns>
        public Status<User> ResetPassword(string email)
        {
            using (var context = new RentlerContext())
            {
                try
                {
                    var user = (from u in context.Users
                                where !u.IsDeleted && u.Email == email
                                select u).FirstOrDefault();

                    if (user == null)
                        return Status.ValidationError<User>(null, "Email", "No user with this email exists");

                    // generate a random password 8 char long
                    string newPassword = FormsAuthentication
                        .HashPasswordForStoringInConfigFile(
                            DateTime.Now.ToString() + user.Username,
                            "SHA1")
                        .Substring(0, 8);

                    // hash the random password and update user with it
                    user.PasswordHash = FormsAuthentication
                        .HashPasswordForStoringInConfigFile(newPassword, "SHA1");
                    context.SaveChanges();

                    EmailForgotPasswordModel model = new EmailForgotPasswordModel()
                    {
                        To = user.Email,
                        Username = user.Username,
                        NewPassword = newPassword
                    };
                    mailer.ForgotPassword(model);

                    return Status.OK<User>(user);
                }
                catch (Exception ex)
                {
                    // TODO: log exception
                    return Status.Error<User>("System was unable to reset password", null);
                }
            }
        }
Esempio n. 27
0
        /// <summary>
        /// Takes care of storing the user's bank account information.
        /// If it is a new card, it will create a new entry in the payment system
        /// and in our own storage. If it is just an update (e.g. the user changing their
        /// address information), it will act accordingly.
        /// </summary>
        /// <param name="bank">The user's bank account.</param>
        public void UpdateBankForUser(UserBank bank)
        {
            bank = manager.UpdateCustomerBank(bank);

            if(bank.UserBankId == 0)
                CreateBankForUser(bank);
            else
            {
                using(var context = new RentlerContext())
                {
                    var toUpdate = (from u in context.UserBanks
                                    where u.UserId == bank.UserId &&
                                    u.UserBankId == bank.UserBankId
                                    select u).SingleOrDefault();

                    if(toUpdate == null)
                        throw new ArgumentNullException();

                    toUpdate.AccountName = bank.AccountName;
                    toUpdate.AccountNumber = bank.AccountNumber;
                    toUpdate.AccountType = bank.AccountType;
                    toUpdate.PayerAlias = bank.PayerAlias;
                    toUpdate.PayeeAlias = bank.PayeeAlias;
                    toUpdate.RoutingNumber = bank.RoutingNumber;
                    toUpdate.Address1 = bank.Address1;
                    toUpdate.Address2 = bank.Address2;
                    toUpdate.City = bank.City;
                    toUpdate.Email = bank.Email;
                    toUpdate.FirstName = bank.FirstName;
                    toUpdate.LastName = bank.LastName;
                    toUpdate.Phone = bank.Phone;
                    toUpdate.State = bank.State;
                    toUpdate.Zip = bank.Zip;
                    toUpdate.IsDeleted = bank.IsDeleted;

                    context.SaveChanges();
                }
            }
        }
Esempio n. 28
0
        public Status<Building> UpdateProperty(Building building)
        {
            var identity = CustomAuthentication.GetIdentity();

            if (!identity.IsAuthenticated)
                return Status.UnAuthorized<Building>();

            if (building == null)
                return Status.ValidationError<Building>(null, "building", "building is null");

            // address could have changed, if so we need to get new lat lon
            Geocode(building);

            using (RentlerContext context = new RentlerContext())
            {
                try
                {
                    var presentBuilding = (from b in context.Buildings
                                           where b.UserId == identity.UserId &&
                                           b.BuildingId == building.BuildingId
                                           select b).SingleOrDefault();

                    presentBuilding.PropertyTypeCode = building.PropertyTypeCode;
                    presentBuilding.Address1 = building.Address1;
                    presentBuilding.Address2 = building.Address2;
                    presentBuilding.City = building.City;
                    presentBuilding.State = building.State;
                    presentBuilding.Zip = building.Zip;
                    presentBuilding.Latitude = building.Latitude;
                    presentBuilding.Longitude = building.Longitude;

                    presentBuilding.UpdateDateUtc = DateTime.UtcNow;
                    presentBuilding.UpdatedBy = "propertyadapter.updateproperty";

                    context.SaveChanges();
                    InvalidateCache(presentBuilding.BuildingId);

                    return Status.OK<Building>(presentBuilding);
                }
                catch (Exception)
                {
                    // log exception
                    return Status.Error<Building>("An unexpected error occurred so the requested property changes were not completed. Contact Rentler Support for assistance.", building);
                }
            }
        }
Esempio n. 29
0
        /// <summary>
        /// Updates the listing information specific fields on Building
        /// </summary>
        /// <param name="username">owner of the building</param>
        /// <param name="building">the building</param>
        /// <returns>
        /// Status with the updated building
        /// </returns>
        public Status<Building> UpdatePropertyListingInfo(Listing building)
        {
            var identity = CustomAuthentication.GetIdentity();

            if (!identity.IsAuthenticated)
                return Status.UnAuthorized<Building>();

            if (building == null)
                return Status.ValidationError<Building>(null, "building", "building is null");

            // normalize standard amenities
            if (building.BuildingAmenities != null)
            {
                var amenities = building.BuildingAmenities.Distinct().ToList();
                for (int x = 0; x < amenities.Count; ++x)
                {
                    if (!Amenities.Current.IsValidAmenity(amenities[x].AmenityId))
                    {
                        amenities.RemoveAt(x);
                        --x;
                    }
                }
                building.BuildingAmenities = amenities;
            }

            // normalize custom amenities
            if (building.CustomAmenities != null)
            {
                var custom = building.CustomAmenities.Distinct().ToList();
                // pascal case custom amenities
                for (int x = 0; x < custom.Count; ++x)
                {
                    if (string.IsNullOrEmpty(custom[x].Name))
                    {
                        custom.RemoveAt(x);
                        --x;
                        continue;
                    }
                    custom[x].Name = char.ToUpper(custom[x].Name[0]) + custom[x].Name.Substring(1);
                }
                building.CustomAmenities = custom;
            }

            // update it
            using (RentlerContext context = new RentlerContext())
            {
                try
                {
                    var current = (from b in context.Buildings
                                        .Include("BuildingAmenities")
                                        .Include("CustomAmenities")
                                        .Include("User.ContactInfos")
                                        .Include("ContactInfo")
                                   where b.IsDeleted == false &&
                                   b.BuildingId == building.BuildingId &&
                                   b.UserId == identity.UserId
                                   select b).SingleOrDefault();

                    if (current == null)
                        return Status.NotFound<Building>();

                    // update properties
                    current.Acres = building.Acres;
                    current.SquareFeet = building.SquareFeet;
                    current.YearBuilt = building.YearBuilt;
                    current.Bedrooms = building.Bedrooms;
                    current.Bathrooms = building.Bathrooms;

                    if (building.BuildingAmenities != null)
                    {
                        // building amenities
                        foreach (var a in building.BuildingAmenities)
                        {
                            // has this amenity already been added?
                            if (!current.BuildingAmenities.Any(ba => ba.AmenityId == a.AmenityId))
                                current.BuildingAmenities.Add(a);
                        }

                        for (int i = 0; i < current.BuildingAmenities.Count; ++i)
                        {
                            // make sure each current amenity is still wanted
                            if (!building.BuildingAmenities.Any(ba => ba.AmenityId == current.BuildingAmenities.ElementAt(i).AmenityId))
                            {
                                current.BuildingAmenities.Remove(current.BuildingAmenities.ElementAt(i));
                                --i;
                            }
                        }
                    }

                    if (building.CustomAmenities != null)
                    {
                        // custom amenities
                        foreach (var a in building.CustomAmenities)
                        {
                            // has this amenity already been added?
                            if (!current.CustomAmenities.Any(ca => ca.Name == a.Name))
                                current.CustomAmenities.Add(a);
                        }

                        for (int i = 0; i < current.CustomAmenities.Count; ++i)
                        {
                            // make sure each current amenity is still wanted
                            if (!building.CustomAmenities.Any(ca => ca.Name == current.CustomAmenities.ElementAt(i).Name))
                            {
                                current.CustomAmenities.Remove(current.CustomAmenities.ElementAt(i));
                                --i;
                            }
                        }
                    }

                    // try to make one
                    if (building.ContactInfo == null)
                        return Status.ValidationError<Building>(null, "contactinfo", "No contact information specified");

                    // validate the contactinfo
                    var contactValidation = Status.Validatate<ContactInfo>(building.ContactInfo);
                    if (contactValidation.StatusCode != 200)
                        return Status.ValidationError<Building>(null, "contactinfo", "The contact information is not valid");

                    // if the contactinfoid isn't set
                    if (building.ContactInfo.ContactInfoId == 0)
                    {
                        // add it
                        ContactInfo finalContact = building.ContactInfo;
                        current.User.ContactInfos.Add(finalContact);
                        context.SaveChanges();

                        // add it to the building
                        current.ContactInfoId = finalContact.ContactInfoId;
                    }
                    else
                    {
                        var contact = current.User.ContactInfos.Where(u => u.ContactInfoId == building.ContactInfo.ContactInfoId).FirstOrDefault();
                        if (contact == null)
                            return Status.ValidationError<Building>(null, "contactinfoid", "ContactInfoId is invalid");

                        // update the contact info
                        contact.CompanyName = building.ContactInfo.CompanyName;
                        contact.ContactInfoTypeCode = building.ContactInfo.ContactInfoTypeCode;
                        contact.Email = building.ContactInfo.Email;
                        contact.Name = building.ContactInfo.Name;
                        contact.PhoneNumber = building.ContactInfo.PhoneNumber;
                        contact.ShowEmailAddress = building.ContactInfo.ShowEmailAddress;
                        contact.ShowPhoneNumber = building.ContactInfo.ShowPhoneNumber;

                        current.ContactInfoId = contact.ContactInfoId;
                    }

                    // set defaults
                    current.UpdateDateUtc = DateTime.UtcNow;
                    current.UpdatedBy = "propertyadapter.updatepropertylistinginfo";

                    //invalidate L2 cache
                    InvalidateCache(building.BuildingId);

                    context.SaveChanges();

                    return Status.OK<Building>(current);
                }
                catch (Exception e)
                {
                    // TODO: log exception
                    return Status.Error<Building>(e.Message, null);
                }
            }
        }
Esempio n. 30
0
        /// <summary>
        /// Changes the password of the specified user
        /// </summary>
        /// <param name="username">the username of the user</param>
        /// <param name="oldPassword">old password for user</param>
        /// <param name="newPassword">new password for user</param>
        /// <param name="confirmPassword">confirmed new password for user</param>
        /// <returns></returns>
        public Status<User> ChangePassword(string username, string oldPassword, string newPassword, string confirmPassword)
        {
            if (confirmPassword != newPassword)
                return Status<User>.ValidationError<User>(null, "ConfirmPassword", "Passwords do not match");

            using (var context = new RentlerContext())
            {
                // get user whose password needs to be reset
                var userStatus = GetUser(username, context);

                if (userStatus.StatusCode != 200)
                    return userStatus;

                var user = userStatus.Result;

                if (user.PasswordHash != FormsAuthentication.HashPasswordForStoringInConfigFile(oldPassword, "SHA1"))
                    return Status<User>.ValidationError<User>(null, "OldPassword", "Old Password is incorrect");

                try
                {
                    // reset password
                    user.PasswordHash = FormsAuthentication.HashPasswordForStoringInConfigFile(newPassword, "SHA1");
                    context.SaveChanges();

                    // notify user by email that their password was changed successfully.
                    EmailChangePasswordModel model = new EmailChangePasswordModel()
                    {
                        Name = string.Format("{0} {1}", user.FirstName, user.LastName),
                        To = user.Email
                    };
                    mailer.ChangePassword(model);

                    return Status<User>.OK(user);
                }
                catch (Exception ex)
                {
                    // TODO: log exception
                    return Status.Error<User>("System was unable to change password", null);
                }
            }
        }