diff --git a/pom.xml b/pom.xml index 909503d0..d586b911 100644 --- a/pom.xml +++ b/pom.xml @@ -34,21 +34,21 @@ ${mockito.version} test - - org.hibernate.orm - hibernate-core - 7.2.0.Final - - - com.mysql - mysql-connector-j - 9.5.0 - runtime - - - io.github.classgraph - classgraph - 4.8.184 - + + org.hibernate.orm + hibernate-core + 7.2.0.Final + + + com.mysql + mysql-connector-j + 9.5.0 + runtime + + + io.github.classgraph + classgraph + 4.8.184 + diff --git a/src/main/java/org/example/App.java b/src/main/java/org/example/App.java index 165e5cd5..f2f67ca3 100644 --- a/src/main/java/org/example/App.java +++ b/src/main/java/org/example/App.java @@ -1,7 +1,57 @@ package org.example; +import jakarta.persistence.EntityManager; +import jakarta.persistence.EntityManagerFactory; +import jakarta.persistence.Persistence; + public class App { public static void main(String[] args) { - System.out.println("Hello There!"); + EntityManagerFactory emf = Persistence.createEntityManagerFactory("carRentalPU"); + EntityManager em = emf.createEntityManager(); + + em.getTransaction().begin(); + + // Rensa tabellen innan vi lägger in nya bilar + em.createQuery("DELETE FROM Car").executeUpdate(); + + // Skapa och persist 20 bilar med rimliga dagspriser + em.persist(createCar("Volvo", "XC90", 2025, "Lyxbil", 800_000)); + em.persist(createCar("BMW", "7 Series", 2024, "Lyxbil", 1_000_000)); + em.persist(createCar("Audi", "A8", 2023, "Lyxbil", 900_000)); + em.persist(createCar("Toyota", "Corolla", 2022, "Personbil", 200_000)); + em.persist(createCar("Honda", "Civic", 2021, "Personbil", 190_000)); + em.persist(createCar("Ford", "Focus", 2022, "Personbil", 210_000)); + em.persist(createCar("Mercedes", "Sprinter", 2023, "Minibuss", 350_000)); + em.persist(createCar("Volkswagen", "Transporter", 2023, "Minibuss", 330_000)); + em.persist(createCar("Renault", "Kangoo", 2022, "Minibuss", 300_000)); + em.persist(createCar("Fiat", "500", 2023, "Småbil", 120_000)); + em.persist(createCar("Mini", "Cooper", 2022, "Småbil", 150_000)); + em.persist(createCar("Volkswagen", "Up!", 2022, "Småbil", 110_000)); + em.persist(createCar("Porsche", "911", 2025, "Sportbil", 1_500_000)); + em.persist(createCar("Ferrari", "Roma", 2024, "Sportbil", 2_000_000)); + em.persist(createCar("Lamborghini", "Huracan", 2025, "Sportbil", 2_500_000)); + em.persist(createCar("Tesla", "Model S", 2023, "Lyxbil", 900_000)); + em.persist(createCar("Kia", "Rio", 2022, "Småbil", 130_000)); + em.persist(createCar("Hyundai", "i30", 2023, "Personbil", 195_000)); + em.persist(createCar("Opel", "Vivaro", 2022, "Minibuss", 320_000)); + em.persist(createCar("Jaguar", "F-Type", 2024, "Sportbil", 1_600_000)); + + em.getTransaction().commit(); + em.close(); + emf.close(); + + System.out.println("20 cars saved successfully!"); + } + + // Skapar bil och sätter dagspris till 0,5% av priset + private static Car createCar(String brand, String model, int year, String type, double price) { + Car car = new Car; + car.setBrand(brand); + car.setModel(model); + car.setYear(year); + car.setType(type); + car.setPrice(price); + car.setDailyPrice(price * 0.005); // 0,5% av totalpris + return car; } } diff --git a/src/main/java/org/example/config/JPAConfig.java b/src/main/java/org/example/config/JPAConfig.java new file mode 100644 index 00000000..44b524ba --- /dev/null +++ b/src/main/java/org/example/config/JPAConfig.java @@ -0,0 +1,21 @@ +package org.example.config; + +import jakarta.persistence.EntityManager; +import jakarta.persistence.EntityManagerFactory; +import jakarta.persistence.Persistence; + +public class JPAConfig { + + private static final EntityManagerFactory emf = + Persistence.createEntityManagerFactory("carRentalPU"); + + public static EntityManager getEntityManager() { + return emf.createEntityManager(); + } + + public static void close() { + if (emf.isOpen()) { + emf.close(); + } + } +} diff --git a/src/main/java/org/example/controller/BookingController.java b/src/main/java/org/example/controller/BookingController.java new file mode 100644 index 00000000..7c7a57e5 --- /dev/null +++ b/src/main/java/org/example/controller/BookingController.java @@ -0,0 +1,4 @@ +package org.example.controller; + +public class BookingController { +} diff --git a/src/main/java/org/example/controller/CarController.java b/src/main/java/org/example/controller/CarController.java new file mode 100644 index 00000000..49de64a5 --- /dev/null +++ b/src/main/java/org/example/controller/CarController.java @@ -0,0 +1,11 @@ +package org.example.controller; + +public class CarController { + boolean CarDamage=false; + + boolean CarRented=false; + boolean CarAvailable=true; + boolean CarBooked=false; + boolean CarBroke=false; + boolean CarReturned=false; +} diff --git a/src/main/java/org/example/controller/CustomerController.java b/src/main/java/org/example/controller/CustomerController.java new file mode 100644 index 00000000..6cbcc5d9 --- /dev/null +++ b/src/main/java/org/example/controller/CustomerController.java @@ -0,0 +1,5 @@ +package org.example.controller; + +public interface CustomerController { + int addCustomer(); +} diff --git a/src/main/java/org/example/controller/MainViewController.java b/src/main/java/org/example/controller/MainViewController.java new file mode 100644 index 00000000..aa1a0cdc --- /dev/null +++ b/src/main/java/org/example/controller/MainViewController.java @@ -0,0 +1,4 @@ +package org.example.controller; + +public class MainViewController { +} diff --git a/src/main/java/org/example/model/Booking.java b/src/main/java/org/example/model/Booking.java new file mode 100644 index 00000000..52fd6bb4 --- /dev/null +++ b/src/main/java/org/example/model/Booking.java @@ -0,0 +1,58 @@ +package org.example.model; + +import jakarta.persistence.*; + + +import javax.tools.DocumentationTool; +import javax.xml.stream.Location; +import java.time.LocalDate; +import java.time.LocalDateTime; + +@Entity +public class Booking { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @ManyToOne(optional = false) + @JoinColumn(name = "customer_id") + Customer customer; + + @ManyToOne(optional = false) + @JoinColumn(name = "car_id") + private Car car; + + @ManyToOne + @JoinColumn(name = "pickup_location_id") + private Location pickupLocation; + + @ManyToOne + @JoinColumn(name = "dropoff_location_id") + private Location dropoffLocation; + + @OneToMany + @JoinColumn(name = "booking_id") + private List extras; + + @OneToOne + @JoinColumn(name = "payment_id") + private Payment payment; + + private LocalDate startDate; + private LocalDate endDate; + + protected Booking() { + // JPA requires a no-arg constructor + } + + public Booking(Customer customer, Car car, Location pickupLocation, Location dropoffLocation, LocalDate startDate, LocalDate endDate) { + this.customer = customer; + this.car = car; + this.startDate = startDate; + this.endDate = endDate; + this.status = BookingStatus.RESERVED; + this.createdAt = LocalDateTime.now(); + + } + +} diff --git a/src/main/java/org/example/model/BookingStatus.java b/src/main/java/org/example/model/BookingStatus.java new file mode 100644 index 00000000..7960aa78 --- /dev/null +++ b/src/main/java/org/example/model/BookingStatus.java @@ -0,0 +1,8 @@ +package org.example.model; + +public enum BookingStatus { + RESERVED, + ACTIVE, + COMPLETED, + CANCELLED +} diff --git a/src/main/java/org/example/model/Car.java b/src/main/java/org/example/model/Car.java new file mode 100644 index 00000000..b5ec40f0 --- /dev/null +++ b/src/main/java/org/example/model/Car.java @@ -0,0 +1,41 @@ +package org.example; + +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; + +@Entity +public class Car { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + private String brand; + private String model; + private int year; + private String type; + private double price; + private double dailyPrice; // ny egenskap + + // Getters och setters + public Long getId() { return id; } + + public String getBrand() { return brand; } + public void setBrand(String brand) { this.brand = brand; } + + public String getModel() { return model; } + public void setModel(String model) { this.model = model; } + + public int getYear() { return year; } + public void setYear(int year) { this.year = year; } + + public String getType() { return type; } + public void setType(String type) { this.type = type; } + + public double getPrice() { return price; } + public void setPrice(double price) { this.price = price; } + + public double getDailyPrice() { return dailyPrice; } + public void setDailyPrice(double dailyPrice) { this.dailyPrice = dailyPrice; } +} diff --git a/src/main/java/org/example/model/Customer.java b/src/main/java/org/example/model/Customer.java new file mode 100644 index 00000000..1a66e22d --- /dev/null +++ b/src/main/java/org/example/model/Customer.java @@ -0,0 +1,21 @@ +package org.example.model; + +import jakarta.persistence.*; +import java.util.ArrayList; +import java.util.List; + +@Entity +public class Customer { + + @Id + @GeneratedValue + private Long id; + + private String name; + private String email; + + @OneToMany(mappedBy = "customer") + private List bookings = new ArrayList<>(); + + // getters & setters +} diff --git a/src/main/java/org/example/model/Payment.java b/src/main/java/org/example/model/Payment.java new file mode 100644 index 00000000..0e4a6dd0 --- /dev/null +++ b/src/main/java/org/example/model/Payment.java @@ -0,0 +1,7 @@ +package org.example.model; + +import jakarta.persistence.Entity; + +@Entity +public class Payment { +} diff --git a/src/main/java/org/example/repository/BookingRepository.java b/src/main/java/org/example/repository/BookingRepository.java new file mode 100644 index 00000000..a63b50d4 --- /dev/null +++ b/src/main/java/org/example/repository/BookingRepository.java @@ -0,0 +1,4 @@ +package org.example.repository; + +public class BookingRepository { +} diff --git a/src/main/java/org/example/repository/CarRepository.java b/src/main/java/org/example/repository/CarRepository.java new file mode 100644 index 00000000..cff21c7b --- /dev/null +++ b/src/main/java/org/example/repository/CarRepository.java @@ -0,0 +1,21 @@ +package org.example.repository; + +import org.example.model.Car; +import org.example.util.JPAUtil; + +import jakarta.persistence.EntityManager; +import java.util.List; + +public class CarRepository { + + public List findAll() { + EntityManager em = JPAUtil.getEntityManager(); + + List cars = + em.createQuery("SELECT c FROM Car c", Car.class) + .getResultList(); + + em.close(); + return cars; + } +} diff --git a/src/main/java/org/example/repository/CustomerRepository.java b/src/main/java/org/example/repository/CustomerRepository.java new file mode 100644 index 00000000..38b788c2 --- /dev/null +++ b/src/main/java/org/example/repository/CustomerRepository.java @@ -0,0 +1,4 @@ +package org.example.repository; + +public class CustomerRepository { +} diff --git a/src/main/java/org/example/service/BookingService.java b/src/main/java/org/example/service/BookingService.java new file mode 100644 index 00000000..aea99093 --- /dev/null +++ b/src/main/java/org/example/service/BookingService.java @@ -0,0 +1,4 @@ +package org.example.service; + +public class BookingService { +} diff --git a/src/main/java/org/example/service/CarService.java b/src/main/java/org/example/service/CarService.java new file mode 100644 index 00000000..e81e1ea5 --- /dev/null +++ b/src/main/java/org/example/service/CarService.java @@ -0,0 +1,4 @@ +package org.example.service; + +public class CarService { +} diff --git a/src/main/java/org/example/service/CustomerService.java b/src/main/java/org/example/service/CustomerService.java new file mode 100644 index 00000000..4c00baea --- /dev/null +++ b/src/main/java/org/example/service/CustomerService.java @@ -0,0 +1,4 @@ +package org.example.service; + +public class CustomerService { +} diff --git a/src/main/resources/META-INF/persistence.xml b/src/main/resources/META-INF/persistence.xml new file mode 100644 index 00000000..b43c6854 --- /dev/null +++ b/src/main/resources/META-INF/persistence.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + diff --git a/src/main/resources/css/main.css b/src/main/resources/css/main.css new file mode 100644 index 00000000..90bc399a --- /dev/null +++ b/src/main/resources/css/main.css @@ -0,0 +1,3 @@ +tabell med bilar +uthyrnings tabell med many2man +kund tabell diff --git a/src/main/resources/fxml/booking_view.fxml b/src/main/resources/fxml/booking_view.fxml new file mode 100644 index 00000000..e69de29b diff --git a/src/main/resources/fxml/car_view.fxml b/src/main/resources/fxml/car_view.fxml new file mode 100644 index 00000000..e69de29b diff --git a/src/main/resources/fxml/customer_view.fxml b/src/main/resources/fxml/customer_view.fxml new file mode 100644 index 00000000..e69de29b diff --git a/src/main/resources/fxml/main_view.fxml b/src/main/resources/fxml/main_view.fxml new file mode 100644 index 00000000..6fe83308 --- /dev/null +++ b/src/main/resources/fxml/main_view.fxml @@ -0,0 +1,10 @@ + + + + + + +
+
+
diff --git a/src/main/resources/init.sql b/src/main/resources/init.sql new file mode 100644 index 00000000..34ac4841 --- /dev/null +++ b/src/main/resources/init.sql @@ -0,0 +1,105 @@ +-- ============================ +-- DATABASE +-- ============================ +CREATE DATABASE IF NOT EXISTS carrental; +USE carrental; + +-- ============================ +-- CUSTOMER +-- ============================ +CREATE TABLE customer ( + id BIGINT AUTO_INCREMENT PRIMARY KEY, + name VARCHAR(100) NOT NULL, + email VARCHAR(150) UNIQUE NOT NULL +); + +-- ============================ +-- CAR +-- ============================ +CREATE TABLE car ( + id BIGINT AUTO_INCREMENT PRIMARY KEY, + brand VARCHAR(100) NOT NULL, + model VARCHAR(100) NOT NULL, + price_per_day DOUBLE NOT NULL +); + +-- ============================ +-- BOOKING +-- ============================ +CREATE TABLE booking ( + id BIGINT AUTO_INCREMENT PRIMARY KEY, + start_date DATE NOT NULL, + end_date DATE NOT NULL, + customer_id BIGINT NOT NULL, + + CONSTRAINT fk_booking_customer + FOREIGN KEY (customer_id) + REFERENCES customer(id) + ON DELETE CASCADE +); + +-- ============================ +-- BOOKING_CAR (Many-to-Many) +-- ============================ +CREATE TABLE booking_car ( + booking_id BIGINT NOT NULL, + car_id BIGINT NOT NULL, + + PRIMARY KEY (booking_id, car_id), + + CONSTRAINT fk_bookingcar_booking + FOREIGN KEY (booking_id) + REFERENCES booking(id) + ON DELETE CASCADE, + + CONSTRAINT fk_bookingcar_car + FOREIGN KEY (car_id) + REFERENCES car(id) + ON DELETE CASCADE +); + +-- ================================================= +-- ================== TESTDATA ===================== +-- ================================================= + +-- ============================ +-- CUSTOMERS +-- ============================ +INSERT INTO customer (name, email) VALUES + ('Eric Thilen', 'eric@test.se'), + ('Torsten Wihlborg', 'torsten@test.se'), + ('Viktor Lindell', 'viktor@test.se'); + +-- ============================ +-- CARS (BILAR ATT HYRA) +-- ============================ +INSERT INTO car (brand, model, price_per_day) VALUES + ('Volvo', 'XC60', 899), + ('Volvo', 'V90', 999), + ('BMW', 'X5', 1199), + ('Audi', 'A6', 1099), + ('Tesla', 'Model 3', 1299), + ('Toyota', 'Corolla', 699), + ('Honda', 'Civic', 599), + ('Skoda', 'Octavia', 499), + ('Seat', 'Leon', 399), + ('Seat', 'Ibiza', 299), + ('Fiat', 'Multipla', 399); + + +-- ============================ +-- BOOKINGS +-- ============================ +INSERT INTO booking (start_date, end_date, customer_id) VALUES + ('2025-01-10', '2025-01-15', 1), + ('2025-02-01', '2025-02-05', 2), + ('2025-03-20', '2025-03-25', 3); + +-- ============================ +-- BOOKING ↔ CAR +-- ============================ +INSERT INTO booking_car (booking_id, car_id) VALUES + (1, 1), + (1, 2), + (2, 3), + (3, 5);