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);