commit 4b3b7f97d9c17554ff0db79cf64a6ccd7519893a Author: Mikołaj Kaczmarek <12432719+AN0DA@users.noreply.github.com> Date: Sun Jun 22 10:22:08 2025 +0200 1.0 diff --git a/mongo.pdf b/mongo.pdf new file mode 100644 index 0000000..e0001f3 Binary files /dev/null and b/mongo.pdf differ diff --git a/mongo.tex b/mongo.tex new file mode 100644 index 0000000..c4c5c01 --- /dev/null +++ b/mongo.tex @@ -0,0 +1,570 @@ +\documentclass{article} +\usepackage{fontspec} +\usepackage{polyglossia} +\usepackage{geometry} +\usepackage{graphicx} +\usepackage{minted} +\usepackage{xcolor} +\usepackage{hyperref} +\usepackage{tabularx} +\usepackage{enumitem} + +% Ustawienia języka polskiego +\setmainlanguage{polish} +\setotherlanguage{english} + +\setlength{\parindent}{0pt} +\renewcommand{\baselinestretch}{1.2} + +\geometry{a4paper, margin=2.5cm} + +% Ustawienia dla pakietu minted +\usemintedstyle{vs} +\setminted{ + fontsize=\normalsize, + breaklines=true, + breakanywhere=true, + frame=single, + framesep=2mm, + linenos=true, + tabsize=2 +} + +\begin{document} + + \begin{center} + {\LARGE \textbf{ZTBD - sprawozdanie z projektu}} + \\[1.5em] + {\large 2025-05-24}\\[2em] + \end{center} + + \section*{Podstawowe informacje} + + \begin{tabular}{ll} + \textbf{Autorzy projektu:} & Mikołaj Kaczmarek (124942) \\ + & Piotr Wilma (124832) \\ + \textbf{Temat:} & Hotel \\ + \textbf{Wybrany zakres (ocena):} & 5,0 \\ + \textbf{Baza danych:} & \texttt{ztbd124942} \\ + \end{tabular} + + + \section{Wprowadzenie} + + Projekt obejmuje stworzenie bazy danych MongoDB dla hotelu. + System zarządzania hotelem wymaga przechowywania danych o gościach, pokojach, rezerwacjach, pracownikach oraz usługach dodatkowych. + Opracowana baza danych umożliwia śledzenie aktualnego stanu rezerwacji, zarządzanie dostępnością pokoi oraz realizację dodatkowych zamówień gości hotelowych. + Rozwiązanie takie znajduje zastosowanie w każdym obiekcie hotelowym potrzebującym wszechstronnego systemu do zarządzania codzienną działalnością. + + Główne funkcjonalności realizowane przez bazę danych obejmują: + \begin{itemize} + \item Przechowywanie informacji o gościach wraz z ich danymi kontaktowymi + \item Zarządzanie pokojami hotelowymi i ich atrybutami + \item Obsługę rezerwacji z informacją o terminach pobytu i statusie płatności + \item Ewidencję pracowników hotelu z przypisaniem do działów + \item Katalog usług dodatkowych oraz zamówień na te usługi + \end{itemize} + + + \section{Schemat bazy - kolekcje} + + Opracowana baza danych składa się z 6 kolekcji, łącznie zawierających 30 dokumentów. + Poniżej przedstawiono szczegółowy opis każdej kolekcji wraz z przykładowymi dokumentami. + + \caption{Struktura bazy danych systemu hotelowego w MongoDB} + + \subsection{Kolekcja: guests} + + \textbf{Opis:} Przechowuje dane gości hotelowych wraz z informacjami kontaktowymi i dodatkowymi atrybutami. + + \textbf{Liczba dokumentów:} 5 + + \textbf{Struktura dokumentu:} + + \begin{minted}{javascript} +{ + _id: ObjectId("..."), + firstName: String, + lastName: String, + email: String, + phoneNumber: String, + address: { + street: String, + city: String, + postalCode: String, + country: String + }, + dateOfBirth: Date, + loyaltyPoints: Number, + registrationDate: Date +} + \end{minted} + + \textbf{Przykładowy dokument:} + + \begin{minted}{javascript} +{ + _id: ObjectId("..."), + firstName: "Jan", + lastName: "Kowalski", + email: "jan.kowalski@email.com", + phoneNumber: "+48123456789", + address: { + street: "Kwiatowa 12", + city: "Warszawa", + postalCode: "01-234", + country: "Polska" + }, + dateOfBirth: ISODate("1985-05-15T00:00:00Z"), + loyaltyPoints: 120, + registrationDate: ISODate("2020-03-10T00:00:00Z") +} + \end{minted} + + \subsection{Kolekcja: rooms} + + \textbf{Opis:} Zawiera informacje o pokojach hotelowych, ich typach, wyposażeniu i statusie dostępności. + + \textbf{Liczba dokumentów:} 5 + + \textbf{Struktura dokumentu:} + + \begin{minted}{javascript} +{ + _id: ObjectId("..."), + roomNumber: String, + floor: Number, + type: String, + capacity: Number, + pricePerNight: Number, + amenities: [String], + status: String, + lastRenovation: Date +} + \end{minted} + + \textbf{Przykładowy dokument:} + + \begin{minted}{javascript} +{ + _id: ObjectId("..."), + roomNumber: "301", + floor: 3, + type: "Suite", + capacity: 4, + pricePerNight: 600.00, + amenities: ["TV", "WiFi", "Minibar", "Klimatyzacja", + "Sejf", "Ekspres do kawy", "Jacuzzi"], + status: "Dostępny", + lastRenovation: ISODate("2022-02-15T00:00:00Z") +} + \end{minted} + + \subsection{Kolekcja: reservations} + + \textbf{Opis:} Przechowuje informacje o rezerwacjach gości, zawiera referencje do kolekcji guests i rooms. + + \textbf{Liczba dokumentów:} 5 + + \textbf{Struktura dokumentu:} + + \begin{minted}{javascript} +{ + _id: ObjectId("..."), + guestId: ObjectId("..."), + roomId: ObjectId("..."), + checkInDate: Date, + checkOutDate: Date, + numberOfGuests: Number, + totalPrice: Number, + paymentStatus: String, + specialRequests: [String], + bookingDate: Date, + status: String +} + \end{minted} + + \textbf{Przykładowy dokument:} + + \begin{minted}{javascript} +{ + _id: ObjectId("..."), + guestId: ObjectId("..."), + roomId: ObjectId("..."), + checkInDate: ISODate("2023-05-10T00:00:00Z"), + checkOutDate: ISODate("2023-05-15T00:00:00Z"), + numberOfGuests: 2, + totalPrice: 1250.00, + paymentStatus: "Opłacone", + specialRequests: ["Późne zameldowanie", "Dodatkowa poduszka"], + bookingDate: ISODate("2023-04-15T00:00:00Z"), + status: "Potwierdzona" +} + \end{minted} + + \subsection{Kolekcja: employees} + + \textbf{Opis:} Zawiera dane pracowników hotelu wraz z informacjami o stanowisku, wynagrodzeniu i harmonogramie pracy. + + \textbf{Liczba dokumentów:} 5 + + \textbf{Struktura dokumentu:} + + \begin{minted}{javascript} +{ + _id: ObjectId("..."), + firstName: String, + lastName: String, + position: String, + email: String, + phoneNumber: String, + dateOfBirth: Date, + hireDate: Date, + salary: Number, + department: String, + workSchedule: [String], + address: { + street: String, + city: String, + postalCode: String, + country: String + } +} + \end{minted} + + \textbf{Przykładowy dokument:} + + \begin{minted}{javascript} +{ + _id: ObjectId("..."), + firstName: "Tomasz", + lastName: "Nowicki", + position: "Szef kuchni", + email: "tomasz.nowicki@hotel.com", + phoneNumber: "+48567890123", + dateOfBirth: ISODate("1975-03-10T00:00:00Z"), + hireDate: ISODate("2018-06-01T00:00:00Z"), + salary: 7500.00, + department: "Restauracja", + workSchedule: ["Poniedziałek", "Wtorek", "Środa", "Niedziela"], + address: { + street: "Słoneczna 8", + city: "Pruszków", + postalCode: "05-800", + country: "Polska" + } +} + \end{minted} + + \subsection{Kolekcja: services} + + \textbf{Opis:} Zawiera katalog usług dodatkowych oferowanych przez hotel. + + \textbf{Liczba dokumentów:} 5 + + \textbf{Struktura dokumentu:} + + \begin{minted}{javascript} +{ + _id: ObjectId("..."), + name: String, + description: String, + price: Number, + category: String, + availability: [String], + location: String, + requiresReservation: Boolean +} + \end{minted} + + \textbf{Przykładowy dokument:} + + \begin{minted}{javascript} +{ + _id: ObjectId("..."), + name: "Masaż relaksacyjny", + description: "60-minutowy masaż relaksacyjny", + price: 200.00, + category: "SPA", + availability: ["Poniedziałek", "Środa", "Piątek", "Sobota"], + location: "Hotelowe SPA", + requiresReservation: true +} + \end{minted} + + \subsection{Kolekcja: serviceOrders} + + \textbf{Opis:} Przechowuje zamówienia na usługi dodatkowe składane przez gości hotelowych. + + \textbf{Liczba dokumentów:} 5 + + \textbf{Struktura dokumentu:} + + \begin{minted}{javascript} +{ + _id: ObjectId("..."), + guestId: ObjectId("..."), + reservationId: ObjectId("..."), + serviceId: ObjectId("..."), + orderDate: Date, + quantity: Number, + totalPrice: Number, + status: String, + comments: String +} + \end{minted} + + \textbf{Przykładowy dokument:} + + \begin{minted}{javascript} +{ + _id: ObjectId("..."), + guestId: ObjectId("..."), + reservationId: ObjectId("..."), + serviceId: ObjectId("..."), + orderDate: ISODate("2023-06-18T00:00:00Z"), + quantity: 1, + totalPrice: 300.00, + status: "Potwierdzone", + comments: "Kolacja na 20:00, rocznica ślubu" +} + \end{minted} + + + \section{Referencje między dokumentami} + + W bazie danych zaimplementowano następujące referencje między dokumentami: + + \begin{enumerate} + \item \textbf{Rezerwacje (reservations) - Goście (guests)} + \begin{itemize} + \item Atrybut \texttt{guestId} w kolekcji \texttt{reservations} zawiera referencję do identyfikatora dokumentu z kolekcji \texttt{guests} + \item Modeluje relację: "Gość dokonuje rezerwacji" (jeden gość może mieć wiele rezerwacji) + \end{itemize} + + \item \textbf{Rezerwacje (reservations) - Pokoje (rooms)} + \begin{itemize} + \item Atrybut \texttt{roomId} w kolekcji \texttt{reservations} zawiera referencję do identyfikatora dokumentu z kolekcji \texttt{rooms} + \item Modeluje relację: "Rezerwacja dotyczy konkretnego pokoju" (jeden pokój może mieć wiele rezerwacji w różnych terminach) + \end{itemize} + + \item \textbf{Zamówienia usług (serviceOrders) - Goście (guests)} + \begin{itemize} + \item Atrybut \texttt{guestId} w kolekcji \texttt{serviceOrders} zawiera referencję do identyfikatora dokumentu z kolekcji \texttt{guests} + \item Modeluje relację: "Gość zamawia usługę dodatkową" (jeden gość może złożyć wiele zamówień) + \end{itemize} + + \item \textbf{Zamówienia usług (serviceOrders) - Rezerwacje (reservations)} + \begin{itemize} + \item Atrybut \texttt{reservationId} w kolekcji \texttt{serviceOrders} zawiera referencję do identyfikatora dokumentu z kolekcji \texttt{reservations} + \item Modeluje relację: "Zamówienie usługi jest przypisane do konkretnej rezerwacji" (jedna rezerwacja może mieć wiele zamówień usług) + \end{itemize} + + \item \textbf{Zamówienia usług (serviceOrders) - Usługi (services)} + \begin{itemize} + \item Atrybut \texttt{serviceId} w kolekcji \texttt{serviceOrders} zawiera referencję do identyfikatora dokumentu z kolekcji \texttt{services} + \item Modeluje relację: "Zamówienie dotyczy konkretnej usługi" (jedna usługa może być zamawiana wielokrotnie) + \end{itemize} + \end{enumerate} + + + \section{Zapytania} + + \subsection{Zapytania wyszukujące (find)} + + \subsubsection{Dostępne pokoje o pojemności większej niż 2 osoby} + + \begin{minted}{javascript} +// Zapytanie wyszukujące dostępne pokoje o pojemności większej niż 2 osoby +db.rooms.find( + { + status: "Dostępny", + capacity: { $gt: 2 } + } +) + \end{minted} + + Zapytanie zwraca wszystkie pokoje, które są obecnie dostępne i mogą pomieścić więcej niż 2 osoby. + Wykorzystuje operator porównujący \texttt{\$gt} (greater than). + + \subsubsection{Rezerwacje rozpoczynające się w określonym przedziale czasowym} + + \begin{minted}{javascript} +// Zapytanie wyszukujące rezerwacje z zameldowaniem w czerwcu 2023 +db.reservations.find( + { + checkInDate: { + $gte: new Date("2023-06-01"), + $lt: new Date("2023-07-01") + } + } +) + \end{minted} + + Zapytanie zwraca wszystkie rezerwacje z datą zameldowania w czerwcu 2023. + Wykorzystuje operatory porównujące \texttt{\$gte} (greater than or equal) i \texttt{\$lt} (less than). + + \subsection{Zapytania grupujące (aggregate)} + + \subsubsection{Średnia cena i liczba rezerwacji według typu pokoju} + + \begin{minted}{javascript} +// Zapytanie grupujące - statystyki rezerwacji wg typu pokoju +db.reservations.aggregate([ + { + $lookup: { + from: "rooms", + localField: "roomId", + foreignField: "_id", + as: "room" + } + }, + { + $unwind: "$room" + }, + { + $group: { + _id: "$room.type", + averagePrice: { $avg: "$totalPrice" }, + totalReservations: { $sum: 1 }, + totalRevenue: { $sum: "$totalPrice" } + } + }, + { + $sort: { + totalRevenue: -1 + } + }, + { + $project: { + roomType: "$_id", + averagePrice: { $round: ["$averagePrice", 2] }, + totalReservations: 1, + totalRevenue: 1, + _id: 0 + } + } +]) + \end{minted} + + Zapytanie łączy dane z kolekcji rezerwacji i pokoi, a następnie grupuje je według typu pokoju. + Dla każdego typu pokoju obliczane są: średnia cena rezerwacji, liczba rezerwacji i całkowity przychód. + Wyniki są sortowane według przychodu malejąco. + Wykorzystane operatory to \texttt{\$group}, \texttt{\$lookup}, \texttt{\$sort} i \texttt{\$project}. + + \subsubsection{Analiza zamówień usług dodatkowych według kategorii} + + \begin{minted}{javascript} +// Zapytanie grupujące - analiza zamówień usług wg kategorii +db.serviceOrders.aggregate([ + { + $lookup: { + from: "services", + localField: "serviceId", + foreignField: "_id", + as: "serviceDetails" + } + }, + { + $unwind: "$serviceDetails" + }, + { + $match: { + status: { $in: ["Potwierdzone", "Zrealizowane"] } + } + }, + { + $group: { + _id: "$serviceDetails.category", + totalOrders: { $sum: 1 }, + totalRevenue: { $sum: "$totalPrice" }, + averageQuantity: { $avg: "$quantity" } + } + }, + { + $sort: { + totalOrders: -1 + } + }, + { + $limit: 5 + }, + { + $project: { + category: "$_id", + totalOrders: 1, + totalRevenue: { $round: ["$totalRevenue", 2] }, + averageQuantity: { $round: ["$averageQuantity", 2] }, + _id: 0 + } + } +]) + \end{minted} + + Zapytanie analizuje zamówienia usług dodatkowych, łącząc dane z kolekcji zamówień i usług. + Filtruje zamówienia o statusie "Potwierdzone" lub "Zrealizowane", grupuje je według kategorii usługi i oblicza statystyki: liczbę zamówień, całkowity przychód i średnią ilość zamówionych usług. + Wyniki są sortowane według liczby zamówień i ograniczone do 5 najlepszych kategorii. + Wykorzystane operatory to \texttt{\$lookup}, \texttt{\$match}, \texttt{\$group}, \texttt{\$sort}, \texttt{\$limit} i \texttt{\$project}. + + \subsection{Zapytanie zliczające (count)} + + \begin{minted}{javascript} +// Zapytanie zliczające pokoje wg statusu dostępności +db.rooms.countDocuments( + { + status: "Dostępny", + pricePerNight: { $lt: 500 } + } +) + \end{minted} + + Zapytanie zwraca liczbę pokoi, które są obecnie dostępne i kosztują mniej niż 500 zł za noc. + Wykorzystuje metodę \texttt{countDocuments} z parametrem query. + + \subsection{Zapytanie o wartości unikalne (distinct)} + + \begin{minted}{javascript} +// Zapytanie o unikalne kraje pochodzenia gości +db.guests.distinct( + "address.country", + { + loyaltyPoints: { $gt: 50 } + } +) + \end{minted} + + Zapytanie zwraca listę unikalnych krajów pochodzenia gości, którzy posiadają więcej niż 50 punktów lojalnościowych. + Wykorzystuje metodę \texttt{distinct} z parametrem query. + + + \section{Indeksy} + + W celu optymalizacji zapytań w bazie danych utworzono następujące indeksy: + + \begin{minted}{javascript} +// Indeks dla szybkiego wyszukiwania pokoi po numerze +db.rooms.createIndex({ roomNumber: 1 }, { unique: true }) + +// Indeks dla szybkiego wyszukiwania gości po nazwisku i imieniu +db.guests.createIndex({ lastName: 1, firstName: 1 }) + +// Indeks dla szybkiego wyszukiwania rezerwacji wg dat +db.reservations.createIndex({ checkInDate: 1, checkOutDate: 1 }) + +// Indeks dla szybszego łączenia rezerwacji z pokojami +db.reservations.createIndex({ roomId: 1 }) + +// Indeks dla szybszego łączenia rezerwacji z gośćmi +db.reservations.createIndex({ guestId: 1 }) + +// Indeks dla szybkiego wyszukiwania usług wg kategorii i ceny +db.services.createIndex({ category: 1, price: 1 }) + +// Indeks dla szybszego łączenia zamówień usług z usługami +db.serviceOrders.createIndex({ serviceId: 1 }) + \end{minted} + + Indeksy przyspieszają operacje wyszukiwania i łączenia danych, szczególnie w przypadku złożonych zapytań agregujących. + Na przykład, indeks \texttt{roomNumber} zapewnia szybkie wyszukiwanie pokoju po jego numerze, a indeksy na polach \texttt{guestId} i \texttt{roomId} w kolekcji \texttt{reservations} przyspieszają operacje łączenia danych z różnych kolekcji. + +\end{document} diff --git a/skrypt.js b/skrypt.js new file mode 100644 index 0000000..6faef14 --- /dev/null +++ b/skrypt.js @@ -0,0 +1,441 @@ +use ztbd124942; + +// 1. Kolekcja: Goście +db.guests.insertMany([ + { + firstName: "Jan", + lastName: "Kowalski", + email: "jan.kowalski@email.com", + phoneNumber: "+48123456789", + address: { + street: "Kwiatowa 12", + city: "Warszawa", + postalCode: "01-234", + country: "Polska" + }, + dateOfBirth: new Date("1985-05-15"), + loyaltyPoints: 120, + registrationDate: new Date("2020-03-10") + }, + { + firstName: "Anna", + lastName: "Nowak", + email: "anna.nowak@email.com", + phoneNumber: "+48234567891", + address: { + street: "Polna 7", + city: "Kraków", + postalCode: "30-001", + country: "Polska" + }, + dateOfBirth: new Date("1990-11-22"), + loyaltyPoints: 45, + registrationDate: new Date("2021-01-15") + }, + { + firstName: "Thomas", + lastName: "Schmidt", + email: "thomas.schmidt@email.com", + phoneNumber: "+49123456789", + address: { + street: "Hauptstrasse 8", + city: "Berlin", + postalCode: "10115", + country: "Niemcy" + }, + dateOfBirth: new Date("1978-07-30"), + loyaltyPoints: 230, + registrationDate: new Date("2019-06-20") + }, + { + firstName: "Maria", + lastName: "Garcia", + email: "maria.garcia@email.com", + phoneNumber: "+34612345678", + address: { + street: "Calle Mayor 15", + city: "Barcelona", + postalCode: "08001", + country: "Hiszpania" + }, + dateOfBirth: new Date("1992-03-12"), + loyaltyPoints: 85, + registrationDate: new Date("2021-09-05") + }, + { + firstName: "John", + lastName: "Smith", + email: "john.smith@email.com", + phoneNumber: "+441234567890", + address: { + street: "High Street 42", + city: "London", + postalCode: "SW1A 1AA", + country: "Wielka Brytania" + }, + dateOfBirth: new Date("1980-12-05"), + loyaltyPoints: 175, + registrationDate: new Date("2020-07-18") + } + ]); + +// 2. Kolekcja: Pokoje hotelowe +db.rooms.insertMany([ + { + roomNumber: "101", + floor: 1, + type: "Standard", + capacity: 2, + pricePerNight: 250.00, + amenities: ["TV", "WiFi", "Minibar", "Klimatyzacja"], + status: "Dostępny", + lastRenovation: new Date("2021-03-15") + }, + { + roomNumber: "102", + floor: 1, + type: "Standard", + capacity: 2, + pricePerNight: 250.00, + amenities: ["TV", "WiFi", "Minibar", "Klimatyzacja"], + status: "Dostępny", + lastRenovation: new Date("2021-03-20") + }, + { + roomNumber: "201", + floor: 2, + type: "Deluxe", + capacity: 3, + pricePerNight: 400.00, + amenities: ["TV", "WiFi", "Minibar", "Klimatyzacja", "Sejf", "Ekspres do kawy"], + status: "Zajęty", + lastRenovation: new Date("2022-01-10") + }, + { + roomNumber: "301", + floor: 3, + type: "Suite", + capacity: 4, + pricePerNight: 600.00, + amenities: ["TV", "WiFi", "Minibar", "Klimatyzacja", "Sejf", "Ekspres do kawy", "Jacuzzi"], + status: "Dostępny", + lastRenovation: new Date("2022-02-15") + }, + { + roomNumber: "302", + floor: 3, + type: "Apartament", + capacity: 5, + pricePerNight: 900.00, + amenities: ["TV", "WiFi", "Minibar", "Klimatyzacja", "Sejf", "Ekspres do kawy", "Jacuzzi", "Sauna"], + status: "Dostępny", + lastRenovation: new Date("2022-02-20") + } + ]); + +// 3. Kolekcja: Usługi dodatkowe +db.services.insertMany([ + { + name: "Śniadanie", + description: "Bufet śniadaniowy w godzinach 7:00-10:00", + price: 50.00, + category: "Gastronomia", + availability: ["Poniedziałek", "Wtorek", "Środa", "Czwartek", "Piątek", "Sobota", "Niedziela"], + location: "Restauracja hotelowa", + requiresReservation: false + }, + { + name: "Masaż relaksacyjny", + description: "60-minutowy masaż relaksacyjny", + price: 200.00, + category: "SPA", + availability: ["Poniedziałek", "Środa", "Piątek", "Sobota"], + location: "Hotelowe SPA", + requiresReservation: true + }, + { + name: "Transfer z lotniska", + description: "Transport z lotniska do hotelu", + price: 120.00, + category: "Transport", + availability: ["Poniedziałek", "Wtorek", "Środa", "Czwartek", "Piątek", "Sobota", "Niedziela"], + location: "Lotnisko", + requiresReservation: true + }, + { + name: "Wynajem roweru", + description: "Wypożyczenie roweru na cały dzień", + price: 50.00, + category: "Rekreacja", + availability: ["Poniedziałek", "Wtorek", "Środa", "Czwartek", "Piątek", "Sobota", "Niedziela"], + location: "Recepcja", + requiresReservation: false + }, + { + name: "Kolacja przy świecach", + description: "Romantyczna kolacja dla dwojga", + price: 300.00, + category: "Gastronomia", + availability: ["Piątek", "Sobota"], + location: "Taras widokowy", + requiresReservation: true + } + ]); + +// 4. Kolekcja: Pracownicy +db.employees.insertMany([ + { + firstName: "Piotr", + lastName: "Wiśniewski", + position: "Recepcjonista", + email: "piotr.wisniewski@hotel.com", + phoneNumber: "+48765432109", + dateOfBirth: new Date("1988-10-15"), + hireDate: new Date("2019-04-01"), + salary: 4500.00, + department: "Recepcja", + workSchedule: ["Poniedziałek", "Wtorek", "Środa", "Czwartek", "Piątek"], + address: { + street: "Jaśminowa 5", + city: "Warszawa", + postalCode: "02-123", + country: "Polska" + } + }, + { + firstName: "Marta", + lastName: "Kowalczyk", + position: "Pokojówka", + email: "marta.kowalczyk@hotel.com", + phoneNumber: "+48654321098", + dateOfBirth: new Date("1992-05-22"), + hireDate: new Date("2020-02-15"), + salary: 3800.00, + department: "Housekeeping", + workSchedule: ["Wtorek", "Środa", "Czwartek", "Piątek", "Sobota"], + address: { + street: "Leśna 12", + city: "Warszawa", + postalCode: "03-456", + country: "Polska" + } + }, + { + firstName: "Tomasz", + lastName: "Nowicki", + position: "Szef kuchni", + email: "tomasz.nowicki@hotel.com", + phoneNumber: "+48567890123", + dateOfBirth: new Date("1975-03-10"), + hireDate: new Date("2018-06-01"), + salary: 7500.00, + department: "Restauracja", + workSchedule: ["Poniedziałek", "Wtorek", "Środa", "Niedziela"], + address: { + street: "Słoneczna 8", + city: "Pruszków", + postalCode: "05-800", + country: "Polska" + } + }, + { + firstName: "Katarzyna", + lastName: "Zielińska", + position: "Manager", + email: "katarzyna.zielinska@hotel.com", + phoneNumber: "+48678901234", + dateOfBirth: new Date("1982-11-28"), + hireDate: new Date("2017-01-10"), + salary: 9000.00, + department: "Zarząd", + workSchedule: ["Poniedziałek", "Wtorek", "Środa", "Czwartek", "Piątek"], + address: { + street: "Złota 20", + city: "Warszawa", + postalCode: "00-120", + country: "Polska" + } + }, + { + firstName: "Marek", + lastName: "Jankowski", + position: "Konserwator", + email: "marek.jankowski@hotel.com", + phoneNumber: "+48789012345", + dateOfBirth: new Date("1970-07-15"), + hireDate: new Date("2019-09-01"), + salary: 4200.00, + department: "Utrzymanie", + workSchedule: ["Poniedziałek", "Wtorek", "Środa", "Czwartek", "Piątek"], + address: { + street: "Brzozowa 7", + city: "Piaseczno", + postalCode: "05-500", + country: "Polska" + } + } + ]); + +// 5. Kolekcja: Rezerwacje +const jan_id = db.guests.findOne({firstName: "Jan", lastName: "Kowalski"})._id; +const anna_id = db.guests.findOne({firstName: "Anna", lastName: "Nowak"})._id; +const thomas_id = db.guests.findOne({firstName: "Thomas", lastName: "Schmidt"})._id; +const maria_id = db.guests.findOne({firstName: "Maria", lastName: "Garcia"})._id; +const john_id = db.guests.findOne({firstName: "John", lastName: "Smith"})._id; + +const room101_id = db.rooms.findOne({roomNumber: "101"})._id; +const room102_id = db.rooms.findOne({roomNumber: "102"})._id; +const room201_id = db.rooms.findOne({roomNumber: "201"})._id; +const room301_id = db.rooms.findOne({roomNumber: "301"})._id; +const room302_id = db.rooms.findOne({roomNumber: "302"})._id; + + +db.reservations.insertMany([ + { + guestId: jan_id, + roomId: room101_id, + checkInDate: new Date("2023-05-10"), + checkOutDate: new Date("2023-05-15"), + numberOfGuests: 2, + totalPrice: 1250.00, + paymentStatus: "Opłacone", + specialRequests: ["Późne zameldowanie", "Dodatkowa poduszka"], + bookingDate: new Date("2023-04-15"), + status: "Potwierdzona" + }, + { + guestId: anna_id, + roomId: room201_id, + checkInDate: new Date("2023-06-01"), + checkOutDate: new Date("2023-06-10"), + numberOfGuests: 3, + totalPrice: 3600.00, + paymentStatus: "Zaliczka", + specialRequests: [], + bookingDate: new Date("2023-05-01"), + status: "Potwierdzona" + }, + { + guestId: thomas_id, + roomId: room301_id, + checkInDate: new Date("2023-05-20"), + checkOutDate: new Date("2023-05-23"), + numberOfGuests: 2, + totalPrice: 1800.00, + paymentStatus: "Oczekuje na płatność", + specialRequests: ["Widok na miasto"], + bookingDate: new Date("2023-05-05"), + status: "Oczekująca" + }, + { + guestId: maria_id, + roomId: room102_id, + checkInDate: new Date("2023-07-15"), + checkOutDate: new Date("2023-07-20"), + numberOfGuests: 1, + totalPrice: 1250.00, + paymentStatus: "Opłacone", + specialRequests: [], + bookingDate: new Date("2023-05-20"), + status: "Potwierdzona" + }, + { + guestId: john_id, + roomId: room302_id, + checkInDate: new Date("2023-06-15"), + checkOutDate: new Date("2023-06-20"), + numberOfGuests: 4, + totalPrice: 4500.00, + paymentStatus: "Zaliczka", + specialRequests: ["Łóżeczko dla dziecka", "Późne wymeldowanie"], + bookingDate: new Date("2023-05-10"), + status: "Potwierdzona" + } + ]); + + +// 6. Kolekcja: Zamówienia usług +const breakfast_id = db.services.findOne({name: "Śniadanie"})._id; +const massage_id = db.services.findOne({name: "Masaż relaksacyjny"})._id; +const transfer_id = db.services.findOne({name: "Transfer z lotniska"})._id; +const bike_id = db.services.findOne({name: "Wynajem roweru"})._id; +const dinner_id = db.services.findOne({name: "Kolacja przy świecach"})._id; + +const jan_res_id = db.reservations.findOne({guestId: jan_id})._id; +const anna_res_id = db.reservations.findOne({guestId: anna_id})._id; +const thomas_res_id = db.reservations.findOne({guestId: thomas_id})._id; +const maria_res_id = db.reservations.findOne({guestId: maria_id})._id; +const john_res_id = db.reservations.findOne({guestId: john_id})._id; + + +db.serviceOrders.insertMany([ + { + guestId: jan_id, + reservationId: jan_res_id, + serviceId: breakfast_id, + orderDate: new Date("2023-05-11"), + quantity: 2, + totalPrice: 100.00, + status: "Zrealizowane", + comments: "Śniadanie do pokoju" + }, + { + guestId: thomas_id, + reservationId: thomas_res_id, + serviceId: massage_id, + orderDate: new Date("2023-05-21"), + quantity: 1, + totalPrice: 200.00, + status: "Potwierdzone", + comments: "Masaż na godzinę 15:00" + }, + { + guestId: anna_id, + reservationId: anna_res_id, + serviceId: transfer_id, + orderDate: new Date("2023-06-01"), + quantity: 1, + totalPrice: 120.00, + status: "Potwierdzone", + comments: "Odbiór z lotniska o 14:30" + }, + { + guestId: maria_id, + reservationId: maria_res_id, + serviceId: bike_id, + orderDate: new Date("2023-07-16"), + quantity: 2, + totalPrice: 100.00, + status: "Oczekujące", + comments: "Dwa rowery na cały dzień" + }, + { + guestId: john_id, + reservationId: john_res_id, + serviceId: dinner_id, + orderDate: new Date("2023-06-18"), + quantity: 1, + totalPrice: 300.00, + status: "Potwierdzone", + comments: "Kolacja na 20:00, rocznica ślubu" + } + ]); + + + + + +db.rooms.createIndex({ roomNumber: 1 }, { unique: true }) + +db.guests.createIndex({ lastName: 1, firstName: 1 }) + +db.reservations.createIndex({ checkInDate: 1, checkOutDate: 1 }) + +db.reservations.createIndex({ roomId: 1 }) + +db.reservations.createIndex({ guestId: 1 }) + +db.services.createIndex({ category: 1, price: 1 }) + +db.serviceOrders.createIndex({ serviceId: 1 }) +