Proje defteri / 2024
Otel Rezervasyon Sistemi
N-Tier çok katmanlı kurumsal mimariyle geliştirilmiş; oda arama, rezervasyon onay döngüsü ve admin doluluk yönetimini otomatikleştiren web platformu.
Proje Tanımı ve Kapsam
OtelZone, otel işletmelerinin rezervasyon, oda tahsis ve doluluk yönetimi operasyonlarını tek merkezden yönetmek üzere tasarlanmış kurumsal bir ASP.NET MVC web platformudur.
N-Tier (Çok Katmanlı Mimari) standartlarına göre yapılandırılmış sistem; misafirlerin tarih ve oda tipine göre müsaitlik araması yapmasını sağlarken, otel yetkililerine doluluk oranlarını ve rezervasyon akışlarını denetleme imkanı verir.

N-Tier Katmanlı Mimari
Proje, kurumsal yazılım standartlarına uygun olarak dört ana katmana ayrılmıştır:
- Sunum Katmanı (OtelZone.WebUI): Razor View şablonları, Bootstrap arayüz bileşenleri ve MVC controller yapılarından oluşur.
- İş Mantığı Katmanı (OtelZone.Business): Tarih çakışma kontrolleri, fiyatlandırma kuralları ve rezervasyon onay mantığını içerir.
- Veri Erişim Katmanı (OtelZone.DataAccess): Entity Framework Core DbContext ve repository yapılarıyla veritabanı sorgularını soyutlar.
- Varlık Katmanı (OtelZone.Entity): Otel, oda, misafir ve rezervasyon modellerini barındıran POCO sınıflarıdır.

İş Mantığı ve Servis Katmanı Kodu
Otel ve oda yönetimi işlemlerinde veri bütünlüğünü korumak ve mükerrer kayıtları engellemek için Business katmanında yer alan HotelService sınıfı kullanılır:
using Microsoft.EntityFrameworkCore;
using OtelZone.DataAccess.Context;
using OtelZone.Entity.Entities;
namespace OtelZone.Business.HotelService
{
public class HotelService : IHotelService
{
private readonly OtelZoneContext _context;
public HotelService(OtelZoneContext context)
{
_context = context;
}
public async Task<bool> OtelKaydet(string hotelName, string hotelAddress, short rating, string hotelDesc, string hotelImgUrl, int cityId, int districtId)
{
if (string.IsNullOrWhiteSpace(hotelAddress)) return false;
var existingHotel = await _context.Hotels
.FirstOrDefaultAsync(u => u.HotelAdress == hotelAddress);
if (existingHotel != null) return false;
var hotel = new Hotel
{
HotelName = hotelName,
HotelAdress = hotelAddress,
Rating = rating,
HotelDesc = hotelDesc,
HotelImgUrl = hotelImgUrl,
HotelIsActive = true,
CityId = cityId,
DistrictId = districtId
};
_context.Hotels.Add(hotel);
await _context.SaveChangesAsync();
return true;
}
}
}Müsaitlik ve Çakışma Önleme Mantığı
Rezervasyon sürecinde aynı odanın aynı tarihlerde birden fazla kişiye verilmesini (overbooking) engellemek için LINQ tabanlı tarih aralığı kontrolü uygulanır:
public async Task<bool> IsRoomAvailableAsync(int roomId, DateTime checkIn, DateTime checkOut)
{
return !await _context.Bookings.AnyAsync(b =>
b.RoomId == roomId &&
b.Status != BookingStatus.Cancelled &&
checkIn < b.CheckOutDate &&
checkOut > b.CheckInDate
);
}