예제 #1
0
        public IHttpActionResult update([FromBody] Advert advert, int id)
        {
            int user_id = Users.GetUserId(User);

            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }

            // Advert Images Validation
            var imagesList = advert.images.ToList();

            if (imagesList.FindAll(img => !img.deleted).Count > 20)
            {
                ExceptionThrow.Throw("Maksimum fotoğraf limitini aştınız.", System.Net.HttpStatusCode.BadRequest);
            }
            if (imagesList.FindAll(img => img.is_default && !img.deleted).Count == 0)
            {
                ExceptionThrow.Throw("Varsayılan fotoğraf seçin.", System.Net.HttpStatusCode.BadRequest);
            }
            if (imagesList.FindAll(img => !img.deleted).Count < 3)
            {
                ExceptionThrow.Throw("En az 3 fotoğraf yüklemelisiniz.", System.Net.HttpStatusCode.BadRequest);
            }
            if (imagesList.FindAll(img => img.is_default).Count > 1)
            {
                ExceptionThrow.Throw("En fazla 1 fotoğraf varsayılan olarak seçilebilir.", System.Net.HttpStatusCode.BadRequest);
            }

            if (db.advert.Where(a => a.id == id && a.user_id == user_id).FirstOrDefault() == null)
            {
                return(NotFound());
            }
            db.Entry(advert).State = System.Data.Entity.EntityState.Detached;

            AdvertPossibilities apos = db.advert_possibilities.Where(aposs => aposs.advert_id == id).First();

            db.Entry(advert.possibility).State = System.Data.Entity.EntityState.Detached;

            AdvertProperties ap = db.advert_properties.Where(app => app.advert_id == id).First();

            db.Entry(advert.properties).State = System.Data.Entity.EntityState.Detached;

            db.advert_avaiable_dates.RemoveRange(db.advert_avaiable_dates.Where(ad => ad.advert_id == id));
            db.advert_unavaiable_dates.RemoveRange(db.advert_unavaiable_dates.Where(ud => ud.advert_id == id));


            //Images
            imagesList.ForEach(i => {
                if (i.is_new && !db.advert_images.Any(ai => ai.advert_id == id && ai.image_id == i.id))
                {
                    AdvertImages ai = new AdvertImages()
                    {
                        advert_id  = id,
                        image_id   = i.id,
                        is_default = i.is_default
                    };
                    db.advert_images.Add(ai);
                }
                if (i.is_default)
                {
                    AdvertImages defaultImage = db.advert_images.Where(img => img.image_id == i.id && img.advert_id == id).FirstOrDefault();
                    if (defaultImage != null)
                    {
                        db.advert_images.Where(ai => ai.advert_id == id).ToList().ForEach(ai => ai.is_default = false);
                        defaultImage.is_default = true;
                    }
                }
                if (i.deleted)
                {
                    AdvertImages deletedImage = db.advert_images.Where(img => img.image_id == i.id && img.advert_id == id).FirstOrDefault();
                    if (deletedImage != null)
                    {
                        db.advert_images.Remove(deletedImage);
                    }
                }
            });


            db.SaveChanges();

            using (var dbContext = new DatabaseContext())
            {
                //Advert
                advert.id                     = id;
                advert.user_id                = user_id;
                advert.updated_date           = DateTime.Now;
                advert.state                  = false;
                dbContext.Entry(advert).State = System.Data.Entity.EntityState.Modified;
                dbContext.Entry(advert).Property("score").IsModified   = false;
                dbContext.Entry(advert).Property("views").IsModified   = false;
                dbContext.Entry(advert).Property("user_id").IsModified = false;

                //Possibilities
                advert.possibility.advert_id              = advert.id;
                advert.possibility.id                     = apos.id;
                advert.possibility.updated_date           = DateTime.Now;
                dbContext.Entry(advert.possibility).State = System.Data.Entity.EntityState.Modified;

                //Properties
                advert.properties.advert_id              = advert.id;
                advert.properties.id                     = ap.id;
                advert.properties.updated_date           = DateTime.Now;
                dbContext.Entry(advert.properties).State = System.Data.Entity.EntityState.Modified;

                //Unavaiable Dates
                if (advert.unavaiable_date != null)
                {
                    advert.unavaiable_date.ToList().ForEach(i => {
                        i.advert_id = advert.id;
                        dbContext.advert_unavaiable_dates.Add(i);
                    });
                }

                //Avaiable Dates
                if (advert.available_date != null)
                {
                    advert.available_date.ToList().ForEach(ad =>
                    {
                        for (DateTime date = ad.from_fulldate; date.Date <= ad.to_fulldate.Date; date = date.AddDays(1))
                        {
                            AdvertAvailableDate avaiableDate = new AdvertAvailableDate()
                            {
                                day       = date.Day,
                                month     = date.Month,
                                year      = date.Year,
                                fulldate  = date,
                                uniq      = String.Format("{0:MMddyyyy}", ad.from) + String.Format("{0:MMddyyyy}", ad.to),
                                advert_id = advert.id
                            };
                            dbContext.advert_avaiable_dates.Add(avaiableDate);
                        }
                    });
                }

                dbContext.SaveChanges();
            }

            return(Ok(advert));
        }
        public IHttpActionResult add([FromBody] _Rezervation _rezervation)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }

            // get user
            int   user_id = Users.GetUserId(User);
            Users user    = db.users.Where(u => u.id == user_id && u.state == true).FirstOrDefault();

            if (user == null)
            {
                ExceptionThrow.Throw("Lütfen hesabınızı doğrulayın.", HttpStatusCode.Forbidden);
            }

            // existence
            Advert advert = db.advert.Where(a => a.state == true && a.id == _rezervation.advert_id).FirstOrDefault();

            if (advert == null)
            {
                return(NotFound());
            }
            if (db.rezervations.Any(rez => rez.user_id == user_id && rez.advert_id == _rezervation.advert_id && rez.checkin == _rezervation.checkin && rez.checkout == _rezervation.checkout))
            {
                ExceptionThrow.Throw("Zaten aynı tarih için bir rezervasyon talebiniz bulunmakta.", HttpStatusCode.Forbidden);
            }

            if (user_id == advert.user_id)
            {
                ExceptionThrow.Throw("Lütfen farklı bir hesap ile deneyin.", HttpStatusCode.Forbidden);
            }

            // visitor validation
            AdvertProperties properties = db.advert_properties.Where(ap => ap.advert_id == advert.id).FirstOrDefault();

            if (properties == null)
            {
                return(NotFound());
            }

            if (properties.visitor < _rezervation.visitors.Count)
            {
                ExceptionThrow.Throw("Bu ilan için en fazla. " + properties.visitor + " misafir kabul edilebilmektedir.", HttpStatusCode.Forbidden);
            }

            // get owner
            Users owner = db.users.Where(u => u.id == advert.user_id).FirstOrDefault();

            if (owner == null)
            {
                return(NotFound());
            }

            // rezervation dates list
            var RezervationDates = new List <DateTime>();

            for (DateTime date = _rezervation.checkin; date.Date < _rezervation.checkout.Date; date = date.AddDays(1))
            {
                RezervationDates.Add(date);
            }

            // available dates validation
            List <AdvertAvailableDate> avaiableDates = db.advert_avaiable_dates.Where(aad => aad.advert_id == _rezervation.advert_id).ToList();

            if (avaiableDates.Count > 0)
            {
                RezervationDates.ForEach(rd =>
                {
                    if (avaiableDates.Find(a => a.fulldate == rd) == null)
                    {
                        ExceptionThrow.Throw("İlan belirtilen tarih için müsait değil.", HttpStatusCode.Forbidden);
                    }
                });
            }

            // unavailable dates validation
            if (db.advert_unavaiable_dates.Where(i => i.advert_id == _rezervation.advert_id && RezervationDates.Contains(i.fulldate)).Count() > 0)
            {
                ExceptionThrow.Throw("İlan belirtilen tarih için müsait değil.", HttpStatusCode.Forbidden);
            }

            // min layover date validation
            if ((_rezervation.checkout - _rezervation.checkin).TotalDays < advert.min_layover)
            {
                ExceptionThrow.Throw("Bu ilan için en az " + advert.min_layover + " günlük rezervasyon oluşturulabilir.", HttpStatusCode.Forbidden);
            }

            // create rezervation
            Rezervations rezervation = new Rezervations
            {
                advert_id    = _rezervation.advert_id,
                checkin      = _rezervation.checkin,
                checkout     = _rezervation.checkout,
                created_date = DateTime.Now,
                gsm          = user.gsm,
                name         = user.name,
                lastname     = user.lastname,
                visitor      = _rezervation.visitors.Count,
                user_id      = user.id,
                day_price    = advert.price,
                owner        = advert.user_id,
                note         = _rezervation.note
            };

            db.rezervations.Add(rezervation);
            db.SaveChanges();

            // create rezervations advert
            RezervationAdverts rezervation_advert = new RezervationAdverts
            {
                adress         = advert.adress,
                advert_id      = advert.id,
                cancel_time    = advert.cancel_time,
                city_id        = advert.city_id,
                town_id        = advert.town_id,
                title          = advert.title,
                description    = advert.description,
                entry_time     = advert.entry_time,
                exit_time      = advert.exit_time,
                latitude       = advert.latitude,
                longitude      = advert.longitude,
                rezervation_id = rezervation.id,
                created_date   = advert.created_date,
                user_id        = advert.user_id,
                advert_type_id = advert.advert_type_id
            };

            db.rezervation_adverts.Add(rezervation_advert);

            // create visitors
            _rezervation.visitors.ToList().ForEach(v =>
            {
                RezervationVisitors visitor = new RezervationVisitors
                {
                    created_date   = DateTime.Now,
                    fullname       = v.fullname,
                    gender         = v.gender,
                    rezervation_id = rezervation.id,
                    tc             = v.tc
                };
                db.rezervation_visitors.Add(visitor);
            });

            db.SaveChanges();

            // send notifications
            Notifications notify = new Notifications();

            notify.add(advert.user_id, "#" + advert.id + " nolu ilanınız için " + rezervation.days + " günlük rezervasyon talebi!", rezervation.id);

            // send sms
            NetGsm.Send(owner.gsm, "#" + advert.id + " nolu ilaniniz icin toplam " + rezervation.days + " günlük (" + rezervation.total_price + " TL) rezervasyon talebi oluşturuldu. - Menkule.com.tr");

            //send mail
            Mailgun.Send("rezervation", new Dictionary <string, object>()
            {
                { "fullname", System.Globalization.CultureInfo.CurrentCulture.TextInfo.ToTitleCase(user.name) + " " + System.Globalization.CultureInfo.CurrentCulture.TextInfo.ToTitleCase(user.lastname) }, { "advert_id", advert.id }, { "checkin", Convert.ToDateTime(rezervation.checkin).ToShortDateString() }, { "checkout", Convert.ToDateTime(rezervation.checkout).ToShortDateString() }, { "days", rezervation.days }, { "price", rezervation.total_price + " TL." }
            }, owner.email, "Yeni rezervasyon talebi");

            return(Ok());
        }