diff --git a/backend/src/main/java/com/petshop/backend/entity/Adoption.java b/backend/src/main/java/com/petshop/backend/entity/Adoption.java new file mode 100644 index 00000000..f7842f82 --- /dev/null +++ b/backend/src/main/java/com/petshop/backend/entity/Adoption.java @@ -0,0 +1,49 @@ +package com.petshop.backend.entity; + +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.hibernate.annotations.CreationTimestamp; +import org.hibernate.annotations.UpdateTimestamp; + +import java.math.BigDecimal; +import java.time.LocalDate; +import java.time.LocalDateTime; + +@Entity +@Table(name = "adoptions") +@Data +@NoArgsConstructor +@AllArgsConstructor +public class Adoption { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @ManyToOne + @JoinColumn(name = "pet_id", nullable = false) + private Pet pet; + + @ManyToOne + @JoinColumn(name = "customer_id", nullable = false) + private Customer customer; + + @Column(name = "adoption_date", nullable = false) + private LocalDate adoptionDate; + + @Column(name = "adoption_fee", nullable = false, precision = 10, scale = 2) + private BigDecimal adoptionFee; + + @Column(columnDefinition = "TEXT") + private String notes; + + @CreationTimestamp + @Column(name = "created_at", updatable = false) + private LocalDateTime createdAt; + + @UpdateTimestamp + @Column(name = "updated_at") + private LocalDateTime updatedAt; +} diff --git a/backend/src/main/java/com/petshop/backend/entity/Appointment.java b/backend/src/main/java/com/petshop/backend/entity/Appointment.java new file mode 100644 index 00000000..b1810b48 --- /dev/null +++ b/backend/src/main/java/com/petshop/backend/entity/Appointment.java @@ -0,0 +1,67 @@ +package com.petshop.backend.entity; + +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.hibernate.annotations.CreationTimestamp; +import org.hibernate.annotations.UpdateTimestamp; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.util.HashSet; +import java.util.Set; + +@Entity +@Table(name = "appointments") +@Data +@NoArgsConstructor +@AllArgsConstructor +public class Appointment { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @ManyToOne + @JoinColumn(name = "customer_id", nullable = false) + private Customer customer; + + @ManyToOne + @JoinColumn(name = "service_id", nullable = false) + private Service service; + + @Column(name = "appointment_date", nullable = false) + private LocalDate appointmentDate; + + @Column(name = "appointment_time", nullable = false) + private LocalTime appointmentTime; + + @Enumerated(EnumType.STRING) + @Column(nullable = false) + private AppointmentStatus status = AppointmentStatus.Scheduled; + + @Column(columnDefinition = "TEXT") + private String notes; + + @ManyToMany + @JoinTable( + name = "appointment_pets", + joinColumns = @JoinColumn(name = "appointment_id"), + inverseJoinColumns = @JoinColumn(name = "pet_id") + ) + private Set pets = new HashSet<>(); + + @CreationTimestamp + @Column(name = "created_at", updatable = false) + private LocalDateTime createdAt; + + @UpdateTimestamp + @Column(name = "updated_at") + private LocalDateTime updatedAt; + + public enum AppointmentStatus { + Scheduled, Completed, Cancelled + } +} diff --git a/backend/src/main/java/com/petshop/backend/entity/Category.java b/backend/src/main/java/com/petshop/backend/entity/Category.java new file mode 100644 index 00000000..e21289a4 --- /dev/null +++ b/backend/src/main/java/com/petshop/backend/entity/Category.java @@ -0,0 +1,36 @@ +package com.petshop.backend.entity; + +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.hibernate.annotations.CreationTimestamp; +import org.hibernate.annotations.UpdateTimestamp; + +import java.time.LocalDateTime; + +@Entity +@Table(name = "categories") +@Data +@NoArgsConstructor +@AllArgsConstructor +public class Category { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(name = "category_name", nullable = false, unique = true, length = 100) + private String categoryName; + + @Column(name = "category_description", columnDefinition = "TEXT") + private String categoryDescription; + + @CreationTimestamp + @Column(name = "created_at", updatable = false) + private LocalDateTime createdAt; + + @UpdateTimestamp + @Column(name = "updated_at") + private LocalDateTime updatedAt; +} diff --git a/backend/src/main/java/com/petshop/backend/entity/Customer.java b/backend/src/main/java/com/petshop/backend/entity/Customer.java new file mode 100644 index 00000000..ab10b792 --- /dev/null +++ b/backend/src/main/java/com/petshop/backend/entity/Customer.java @@ -0,0 +1,42 @@ +package com.petshop.backend.entity; + +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.hibernate.annotations.CreationTimestamp; +import org.hibernate.annotations.UpdateTimestamp; + +import java.time.LocalDateTime; + +@Entity +@Table(name = "customers") +@Data +@NoArgsConstructor +@AllArgsConstructor +public class Customer { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(name = "customer_name", nullable = false, length = 100) + private String customerName; + + @Column(name = "customer_email", length = 100) + private String customerEmail; + + @Column(name = "customer_phone", length = 20) + private String customerPhone; + + @Column(name = "customer_address", columnDefinition = "TEXT") + private String customerAddress; + + @CreationTimestamp + @Column(name = "created_at", updatable = false) + private LocalDateTime createdAt; + + @UpdateTimestamp + @Column(name = "updated_at") + private LocalDateTime updatedAt; +} diff --git a/backend/src/main/java/com/petshop/backend/entity/Inventory.java b/backend/src/main/java/com/petshop/backend/entity/Inventory.java new file mode 100644 index 00000000..66c56b9b --- /dev/null +++ b/backend/src/main/java/com/petshop/backend/entity/Inventory.java @@ -0,0 +1,49 @@ +package com.petshop.backend.entity; + +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.hibernate.annotations.CreationTimestamp; +import org.hibernate.annotations.UpdateTimestamp; + +import java.time.LocalDateTime; + +@Entity +@Table(name = "inventory", uniqueConstraints = { + @UniqueConstraint(name = "unique_product_store", columnNames = {"product_id", "store_id"}) +}) +@Data +@NoArgsConstructor +@AllArgsConstructor +public class Inventory { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @ManyToOne + @JoinColumn(name = "product_id", nullable = false) + private Product product; + + @ManyToOne + @JoinColumn(name = "store_id", nullable = false) + private Store store; + + @Column(nullable = false) + private Integer quantity = 0; + + @Column(name = "reorder_level") + private Integer reorderLevel = 10; + + @Column(name = "last_restocked") + private LocalDateTime lastRestocked; + + @CreationTimestamp + @Column(name = "created_at", updatable = false) + private LocalDateTime createdAt; + + @UpdateTimestamp + @Column(name = "updated_at") + private LocalDateTime updatedAt; +} diff --git a/backend/src/main/java/com/petshop/backend/entity/Pet.java b/backend/src/main/java/com/petshop/backend/entity/Pet.java new file mode 100644 index 00000000..de7bf5ab --- /dev/null +++ b/backend/src/main/java/com/petshop/backend/entity/Pet.java @@ -0,0 +1,54 @@ +package com.petshop.backend.entity; + +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.hibernate.annotations.CreationTimestamp; +import org.hibernate.annotations.UpdateTimestamp; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +@Entity +@Table(name = "pets") +@Data +@NoArgsConstructor +@AllArgsConstructor +public class Pet { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(name = "pet_name", nullable = false, length = 100) + private String petName; + + @Column(name = "pet_species", nullable = false, length = 50) + private String petSpecies; + + @Column(name = "pet_breed", length = 50) + private String petBreed; + + @Column(name = "pet_age") + private Integer petAge; + + @Enumerated(EnumType.STRING) + @Column(name = "pet_status", nullable = false) + private PetStatus petStatus = PetStatus.Available; + + @Column(name = "pet_price", precision = 10, scale = 2) + private BigDecimal petPrice; + + @CreationTimestamp + @Column(name = "created_at", updatable = false) + private LocalDateTime createdAt; + + @UpdateTimestamp + @Column(name = "updated_at") + private LocalDateTime updatedAt; + + public enum PetStatus { + Available, Adopted, Under_Care + } +} diff --git a/backend/src/main/java/com/petshop/backend/entity/Product.java b/backend/src/main/java/com/petshop/backend/entity/Product.java new file mode 100644 index 00000000..8ccc72a1 --- /dev/null +++ b/backend/src/main/java/com/petshop/backend/entity/Product.java @@ -0,0 +1,47 @@ +package com.petshop.backend.entity; + +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.hibernate.annotations.CreationTimestamp; +import org.hibernate.annotations.UpdateTimestamp; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +@Entity +@Table(name = "products") +@Data +@NoArgsConstructor +@AllArgsConstructor +public class Product { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(name = "product_name", nullable = false, length = 100) + private String productName; + + @ManyToOne + @JoinColumn(name = "category_id", nullable = false) + private Category category; + + @Column(name = "product_description", columnDefinition = "TEXT") + private String productDescription; + + @Column(name = "product_price", nullable = false, precision = 10, scale = 2) + private BigDecimal productPrice; + + @Column(nullable = false) + private Boolean active = true; + + @CreationTimestamp + @Column(name = "created_at", updatable = false) + private LocalDateTime createdAt; + + @UpdateTimestamp + @Column(name = "updated_at") + private LocalDateTime updatedAt; +} diff --git a/backend/src/main/java/com/petshop/backend/entity/ProductSupplier.java b/backend/src/main/java/com/petshop/backend/entity/ProductSupplier.java new file mode 100644 index 00000000..9a1f56c8 --- /dev/null +++ b/backend/src/main/java/com/petshop/backend/entity/ProductSupplier.java @@ -0,0 +1,56 @@ +package com.petshop.backend.entity; + +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.hibernate.annotations.CreationTimestamp; +import org.hibernate.annotations.UpdateTimestamp; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +@Entity +@Table(name = "product_suppliers") +@Data +@NoArgsConstructor +@AllArgsConstructor +@IdClass(ProductSupplier.ProductSupplierId.class) +public class ProductSupplier { + + @Id + @ManyToOne + @JoinColumn(name = "product_id", nullable = false) + private Product product; + + @Id + @ManyToOne + @JoinColumn(name = "supplier_id", nullable = false) + private Supplier supplier; + + @Column(name = "cost_price", nullable = false, precision = 10, scale = 2) + private BigDecimal costPrice; + + @Column(name = "lead_time_days") + private Integer leadTimeDays; + + @Column(name = "is_preferred") + private Boolean isPreferred = false; + + @CreationTimestamp + @Column(name = "created_at", updatable = false) + private LocalDateTime createdAt; + + @UpdateTimestamp + @Column(name = "updated_at") + private LocalDateTime updatedAt; + + @Data + @NoArgsConstructor + @AllArgsConstructor + public static class ProductSupplierId implements Serializable { + private Long product; + private Long supplier; + } +} diff --git a/backend/src/main/java/com/petshop/backend/entity/PurchaseOrder.java b/backend/src/main/java/com/petshop/backend/entity/PurchaseOrder.java new file mode 100644 index 00000000..cbeede55 --- /dev/null +++ b/backend/src/main/java/com/petshop/backend/entity/PurchaseOrder.java @@ -0,0 +1,61 @@ +package com.petshop.backend.entity; + +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.hibernate.annotations.CreationTimestamp; +import org.hibernate.annotations.UpdateTimestamp; + +import java.math.BigDecimal; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; + +@Entity +@Table(name = "purchase_orders") +@Data +@NoArgsConstructor +@AllArgsConstructor +public class PurchaseOrder { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @ManyToOne + @JoinColumn(name = "supplier_id", nullable = false) + private Supplier supplier; + + @Column(name = "order_date", nullable = false) + private LocalDate orderDate; + + @Column(name = "expected_delivery") + private LocalDate expectedDelivery; + + @Enumerated(EnumType.STRING) + @Column(nullable = false) + private OrderStatus status = OrderStatus.Pending; + + @Column(name = "total_amount", nullable = false, precision = 10, scale = 2) + private BigDecimal totalAmount; + + @Column(columnDefinition = "TEXT") + private String notes; + + @OneToMany(mappedBy = "purchaseOrder", cascade = CascadeType.ALL) + private List items = new ArrayList<>(); + + @CreationTimestamp + @Column(name = "created_at", updatable = false) + private LocalDateTime createdAt; + + @UpdateTimestamp + @Column(name = "updated_at") + private LocalDateTime updatedAt; + + public enum OrderStatus { + Pending, Delivered, Cancelled + } +} diff --git a/backend/src/main/java/com/petshop/backend/entity/PurchaseOrderItem.java b/backend/src/main/java/com/petshop/backend/entity/PurchaseOrderItem.java new file mode 100644 index 00000000..4aee2b49 --- /dev/null +++ b/backend/src/main/java/com/petshop/backend/entity/PurchaseOrderItem.java @@ -0,0 +1,37 @@ +package com.petshop.backend.entity; + +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.math.BigDecimal; + +@Entity +@Table(name = "purchase_order_items") +@Data +@NoArgsConstructor +@AllArgsConstructor +public class PurchaseOrderItem { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @ManyToOne + @JoinColumn(name = "purchase_order_id", nullable = false) + private PurchaseOrder purchaseOrder; + + @ManyToOne + @JoinColumn(name = "product_id", nullable = false) + private Product product; + + @Column(nullable = false) + private Integer quantity; + + @Column(name = "unit_cost", nullable = false, precision = 10, scale = 2) + private BigDecimal unitCost; + + @Column(nullable = false, precision = 10, scale = 2) + private BigDecimal subtotal; +} diff --git a/backend/src/main/java/com/petshop/backend/entity/Refund.java b/backend/src/main/java/com/petshop/backend/entity/Refund.java new file mode 100644 index 00000000..70a7b1f2 --- /dev/null +++ b/backend/src/main/java/com/petshop/backend/entity/Refund.java @@ -0,0 +1,48 @@ +package com.petshop.backend.entity; + +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.hibernate.annotations.CreationTimestamp; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; + +@Entity +@Table(name = "refunds") +@Data +@NoArgsConstructor +@AllArgsConstructor +public class Refund { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @ManyToOne + @JoinColumn(name = "sale_id", nullable = false) + private Sale sale; + + @Column(name = "refund_date", nullable = false) + private LocalDateTime refundDate = LocalDateTime.now(); + + @Column(name = "refund_amount", nullable = false, precision = 10, scale = 2) + private BigDecimal refundAmount; + + @Column(name = "refund_reason", columnDefinition = "TEXT") + private String refundReason; + + @ManyToOne + @JoinColumn(name = "processed_by", nullable = false) + private User processedBy; + + @OneToMany(mappedBy = "refund", cascade = CascadeType.ALL) + private List items = new ArrayList<>(); + + @CreationTimestamp + @Column(name = "created_at", updatable = false) + private LocalDateTime createdAt; +} diff --git a/backend/src/main/java/com/petshop/backend/entity/RefundItem.java b/backend/src/main/java/com/petshop/backend/entity/RefundItem.java new file mode 100644 index 00000000..2f34b537 --- /dev/null +++ b/backend/src/main/java/com/petshop/backend/entity/RefundItem.java @@ -0,0 +1,34 @@ +package com.petshop.backend.entity; + +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.math.BigDecimal; + +@Entity +@Table(name = "refund_items") +@Data +@NoArgsConstructor +@AllArgsConstructor +public class RefundItem { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @ManyToOne + @JoinColumn(name = "refund_id", nullable = false) + private Refund refund; + + @ManyToOne + @JoinColumn(name = "sale_item_id", nullable = false) + private SaleItem saleItem; + + @Column(nullable = false) + private Integer quantity; + + @Column(name = "refund_amount", nullable = false, precision = 10, scale = 2) + private BigDecimal refundAmount; +} diff --git a/backend/src/main/java/com/petshop/backend/entity/Sale.java b/backend/src/main/java/com/petshop/backend/entity/Sale.java new file mode 100644 index 00000000..3f46562c --- /dev/null +++ b/backend/src/main/java/com/petshop/backend/entity/Sale.java @@ -0,0 +1,61 @@ +package com.petshop.backend.entity; + +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.hibernate.annotations.CreationTimestamp; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; + +@Entity +@Table(name = "sales") +@Data +@NoArgsConstructor +@AllArgsConstructor +public class Sale { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(name = "sale_date", nullable = false) + private LocalDateTime saleDate = LocalDateTime.now(); + + @ManyToOne + @JoinColumn(name = "employee_id", nullable = false) + private User employee; + + @ManyToOne + @JoinColumn(name = "customer_id") + private Customer customer; + + @ManyToOne + @JoinColumn(name = "store_id") + private Store store; + + @Column(nullable = false, precision = 10, scale = 2) + private BigDecimal subtotal; + + @Column(nullable = false, precision = 10, scale = 2) + private BigDecimal tax = BigDecimal.ZERO; + + @Column(nullable = false, precision = 10, scale = 2) + private BigDecimal total; + + @Column(name = "payment_method", length = 50) + private String paymentMethod; + + @Column(columnDefinition = "TEXT") + private String notes; + + @OneToMany(mappedBy = "sale", cascade = CascadeType.ALL) + private List items = new ArrayList<>(); + + @CreationTimestamp + @Column(name = "created_at", updatable = false) + private LocalDateTime createdAt; +} diff --git a/backend/src/main/java/com/petshop/backend/entity/SaleItem.java b/backend/src/main/java/com/petshop/backend/entity/SaleItem.java new file mode 100644 index 00000000..012f706b --- /dev/null +++ b/backend/src/main/java/com/petshop/backend/entity/SaleItem.java @@ -0,0 +1,37 @@ +package com.petshop.backend.entity; + +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.math.BigDecimal; + +@Entity +@Table(name = "sale_items") +@Data +@NoArgsConstructor +@AllArgsConstructor +public class SaleItem { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @ManyToOne + @JoinColumn(name = "sale_id", nullable = false) + private Sale sale; + + @ManyToOne + @JoinColumn(name = "product_id", nullable = false) + private Product product; + + @Column(nullable = false) + private Integer quantity; + + @Column(name = "unit_price", nullable = false, precision = 10, scale = 2) + private BigDecimal unitPrice; + + @Column(nullable = false, precision = 10, scale = 2) + private BigDecimal subtotal; +} diff --git a/backend/src/main/java/com/petshop/backend/entity/Service.java b/backend/src/main/java/com/petshop/backend/entity/Service.java new file mode 100644 index 00000000..2373239b --- /dev/null +++ b/backend/src/main/java/com/petshop/backend/entity/Service.java @@ -0,0 +1,46 @@ +package com.petshop.backend.entity; + +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.hibernate.annotations.CreationTimestamp; +import org.hibernate.annotations.UpdateTimestamp; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +@Entity +@Table(name = "services") +@Data +@NoArgsConstructor +@AllArgsConstructor +public class Service { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(name = "service_name", nullable = false, length = 100) + private String serviceName; + + @Column(name = "service_description", columnDefinition = "TEXT") + private String serviceDescription; + + @Column(name = "service_price", nullable = false, precision = 10, scale = 2) + private BigDecimal servicePrice; + + @Column(name = "service_duration_minutes") + private Integer serviceDurationMinutes; + + @Column(nullable = false) + private Boolean active = true; + + @CreationTimestamp + @Column(name = "created_at", updatable = false) + private LocalDateTime createdAt; + + @UpdateTimestamp + @Column(name = "updated_at") + private LocalDateTime updatedAt; +} diff --git a/backend/src/main/java/com/petshop/backend/entity/Store.java b/backend/src/main/java/com/petshop/backend/entity/Store.java new file mode 100644 index 00000000..fbbd0f21 --- /dev/null +++ b/backend/src/main/java/com/petshop/backend/entity/Store.java @@ -0,0 +1,31 @@ +package com.petshop.backend.entity; + +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.hibernate.annotations.CreationTimestamp; + +import java.time.LocalDateTime; + +@Entity +@Table(name = "stores") +@Data +@NoArgsConstructor +@AllArgsConstructor +public class Store { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(name = "store_name", nullable = false, length = 100) + private String storeName; + + @Column(name = "store_location", length = 200) + private String storeLocation; + + @CreationTimestamp + @Column(name = "created_at", updatable = false) + private LocalDateTime createdAt; +} diff --git a/backend/src/main/java/com/petshop/backend/entity/Supplier.java b/backend/src/main/java/com/petshop/backend/entity/Supplier.java new file mode 100644 index 00000000..57f66bcf --- /dev/null +++ b/backend/src/main/java/com/petshop/backend/entity/Supplier.java @@ -0,0 +1,48 @@ +package com.petshop.backend.entity; + +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.hibernate.annotations.CreationTimestamp; +import org.hibernate.annotations.UpdateTimestamp; + +import java.time.LocalDateTime; + +@Entity +@Table(name = "suppliers") +@Data +@NoArgsConstructor +@AllArgsConstructor +public class Supplier { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(name = "supplier_name", nullable = false, length = 100) + private String supplierName; + + @Column(name = "supplier_contact", length = 100) + private String supplierContact; + + @Column(name = "supplier_email", length = 100) + private String supplierEmail; + + @Column(name = "supplier_phone", length = 20) + private String supplierPhone; + + @Column(name = "supplier_address", columnDefinition = "TEXT") + private String supplierAddress; + + @Column(nullable = false) + private Boolean active = true; + + @CreationTimestamp + @Column(name = "created_at", updatable = false) + private LocalDateTime createdAt; + + @UpdateTimestamp + @Column(name = "updated_at") + private LocalDateTime updatedAt; +} diff --git a/backend/src/main/java/com/petshop/backend/repository/AdoptionRepository.java b/backend/src/main/java/com/petshop/backend/repository/AdoptionRepository.java new file mode 100644 index 00000000..8bf64f74 --- /dev/null +++ b/backend/src/main/java/com/petshop/backend/repository/AdoptionRepository.java @@ -0,0 +1,9 @@ +package com.petshop.backend.repository; + +import com.petshop.backend.entity.Adoption; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface AdoptionRepository extends JpaRepository { +} diff --git a/backend/src/main/java/com/petshop/backend/repository/AppointmentRepository.java b/backend/src/main/java/com/petshop/backend/repository/AppointmentRepository.java new file mode 100644 index 00000000..5d773e8c --- /dev/null +++ b/backend/src/main/java/com/petshop/backend/repository/AppointmentRepository.java @@ -0,0 +1,18 @@ +package com.petshop.backend.repository; + +import com.petshop.backend.entity.Appointment; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; +import org.springframework.stereotype.Repository; + +import java.time.LocalDate; +import java.time.LocalTime; +import java.util.List; + +@Repository +public interface AppointmentRepository extends JpaRepository { + + @Query("SELECT a FROM Appointment a WHERE a.appointmentDate = :date AND a.appointmentTime = :time") + List findByDateAndTime(@Param("date") LocalDate date, @Param("time") LocalTime time); +} diff --git a/backend/src/main/java/com/petshop/backend/repository/CategoryRepository.java b/backend/src/main/java/com/petshop/backend/repository/CategoryRepository.java new file mode 100644 index 00000000..ae20d6a0 --- /dev/null +++ b/backend/src/main/java/com/petshop/backend/repository/CategoryRepository.java @@ -0,0 +1,22 @@ +package com.petshop.backend.repository; + +import com.petshop.backend.entity.Category; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; +import org.springframework.stereotype.Repository; + +import java.util.Optional; + +@Repository +public interface CategoryRepository extends JpaRepository { + + Optional findByCategoryName(String categoryName); + + @Query("SELECT c FROM Category c WHERE " + + "LOWER(c.categoryName) LIKE LOWER(CONCAT('%', :q, '%')) OR " + + "LOWER(c.categoryDescription) LIKE LOWER(CONCAT('%', :q, '%'))") + Page searchCategories(@Param("q") String query, Pageable pageable); +} diff --git a/backend/src/main/java/com/petshop/backend/repository/CustomerRepository.java b/backend/src/main/java/com/petshop/backend/repository/CustomerRepository.java new file mode 100644 index 00000000..a0bebc69 --- /dev/null +++ b/backend/src/main/java/com/petshop/backend/repository/CustomerRepository.java @@ -0,0 +1,19 @@ +package com.petshop.backend.repository; + +import com.petshop.backend.entity.Customer; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; +import org.springframework.stereotype.Repository; + +@Repository +public interface CustomerRepository extends JpaRepository { + + @Query("SELECT c FROM Customer c WHERE " + + "LOWER(c.customerName) LIKE LOWER(CONCAT('%', :q, '%')) OR " + + "LOWER(c.customerEmail) LIKE LOWER(CONCAT('%', :q, '%')) OR " + + "LOWER(c.customerPhone) LIKE LOWER(CONCAT('%', :q, '%'))") + Page searchCustomers(@Param("q") String query, Pageable pageable); +} diff --git a/backend/src/main/java/com/petshop/backend/repository/InventoryRepository.java b/backend/src/main/java/com/petshop/backend/repository/InventoryRepository.java new file mode 100644 index 00000000..2d0e0f9c --- /dev/null +++ b/backend/src/main/java/com/petshop/backend/repository/InventoryRepository.java @@ -0,0 +1,16 @@ +package com.petshop.backend.repository; + +import com.petshop.backend.entity.Inventory; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; +import org.springframework.stereotype.Repository; + +import java.util.Optional; + +@Repository +public interface InventoryRepository extends JpaRepository { + + @Query("SELECT i FROM Inventory i WHERE i.product.id = :productId AND i.store.id = :storeId") + Optional findByProductIdAndStoreId(@Param("productId") Long productId, @Param("storeId") Long storeId); +} diff --git a/backend/src/main/java/com/petshop/backend/repository/PetRepository.java b/backend/src/main/java/com/petshop/backend/repository/PetRepository.java new file mode 100644 index 00000000..fa9aa5e7 --- /dev/null +++ b/backend/src/main/java/com/petshop/backend/repository/PetRepository.java @@ -0,0 +1,19 @@ +package com.petshop.backend.repository; + +import com.petshop.backend.entity.Pet; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; +import org.springframework.stereotype.Repository; + +@Repository +public interface PetRepository extends JpaRepository { + + @Query("SELECT p FROM Pet p WHERE " + + "LOWER(p.petName) LIKE LOWER(CONCAT('%', :q, '%')) OR " + + "LOWER(p.petSpecies) LIKE LOWER(CONCAT('%', :q, '%')) OR " + + "LOWER(p.petBreed) LIKE LOWER(CONCAT('%', :q, '%'))") + Page searchPets(@Param("q") String query, Pageable pageable); +} diff --git a/backend/src/main/java/com/petshop/backend/repository/ProductRepository.java b/backend/src/main/java/com/petshop/backend/repository/ProductRepository.java new file mode 100644 index 00000000..896602e9 --- /dev/null +++ b/backend/src/main/java/com/petshop/backend/repository/ProductRepository.java @@ -0,0 +1,18 @@ +package com.petshop.backend.repository; + +import com.petshop.backend.entity.Product; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; +import org.springframework.stereotype.Repository; + +@Repository +public interface ProductRepository extends JpaRepository { + + @Query("SELECT p FROM Product p WHERE " + + "LOWER(p.productName) LIKE LOWER(CONCAT('%', :q, '%')) OR " + + "LOWER(p.productDescription) LIKE LOWER(CONCAT('%', :q, '%'))") + Page searchProducts(@Param("q") String query, Pageable pageable); +} diff --git a/backend/src/main/java/com/petshop/backend/repository/ProductSupplierRepository.java b/backend/src/main/java/com/petshop/backend/repository/ProductSupplierRepository.java new file mode 100644 index 00000000..f8e96185 --- /dev/null +++ b/backend/src/main/java/com/petshop/backend/repository/ProductSupplierRepository.java @@ -0,0 +1,9 @@ +package com.petshop.backend.repository; + +import com.petshop.backend.entity.ProductSupplier; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface ProductSupplierRepository extends JpaRepository { +} diff --git a/backend/src/main/java/com/petshop/backend/repository/PurchaseOrderRepository.java b/backend/src/main/java/com/petshop/backend/repository/PurchaseOrderRepository.java new file mode 100644 index 00000000..ed3251ac --- /dev/null +++ b/backend/src/main/java/com/petshop/backend/repository/PurchaseOrderRepository.java @@ -0,0 +1,9 @@ +package com.petshop.backend.repository; + +import com.petshop.backend.entity.PurchaseOrder; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface PurchaseOrderRepository extends JpaRepository { +} diff --git a/backend/src/main/java/com/petshop/backend/repository/RefundRepository.java b/backend/src/main/java/com/petshop/backend/repository/RefundRepository.java new file mode 100644 index 00000000..8378b672 --- /dev/null +++ b/backend/src/main/java/com/petshop/backend/repository/RefundRepository.java @@ -0,0 +1,9 @@ +package com.petshop.backend.repository; + +import com.petshop.backend.entity.Refund; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface RefundRepository extends JpaRepository { +} diff --git a/backend/src/main/java/com/petshop/backend/repository/SaleRepository.java b/backend/src/main/java/com/petshop/backend/repository/SaleRepository.java new file mode 100644 index 00000000..f58f0660 --- /dev/null +++ b/backend/src/main/java/com/petshop/backend/repository/SaleRepository.java @@ -0,0 +1,9 @@ +package com.petshop.backend.repository; + +import com.petshop.backend.entity.Sale; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface SaleRepository extends JpaRepository { +} diff --git a/backend/src/main/java/com/petshop/backend/repository/ServiceRepository.java b/backend/src/main/java/com/petshop/backend/repository/ServiceRepository.java new file mode 100644 index 00000000..a6c0a084 --- /dev/null +++ b/backend/src/main/java/com/petshop/backend/repository/ServiceRepository.java @@ -0,0 +1,18 @@ +package com.petshop.backend.repository; + +import com.petshop.backend.entity.Service; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; +import org.springframework.stereotype.Repository; + +@Repository +public interface ServiceRepository extends JpaRepository { + + @Query("SELECT s FROM Service s WHERE " + + "LOWER(s.serviceName) LIKE LOWER(CONCAT('%', :q, '%')) OR " + + "LOWER(s.serviceDescription) LIKE LOWER(CONCAT('%', :q, '%'))") + Page searchServices(@Param("q") String query, Pageable pageable); +} diff --git a/backend/src/main/java/com/petshop/backend/repository/StoreRepository.java b/backend/src/main/java/com/petshop/backend/repository/StoreRepository.java new file mode 100644 index 00000000..4f067633 --- /dev/null +++ b/backend/src/main/java/com/petshop/backend/repository/StoreRepository.java @@ -0,0 +1,9 @@ +package com.petshop.backend.repository; + +import com.petshop.backend.entity.Store; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface StoreRepository extends JpaRepository { +} diff --git a/backend/src/main/java/com/petshop/backend/repository/SupplierRepository.java b/backend/src/main/java/com/petshop/backend/repository/SupplierRepository.java new file mode 100644 index 00000000..443455b8 --- /dev/null +++ b/backend/src/main/java/com/petshop/backend/repository/SupplierRepository.java @@ -0,0 +1,18 @@ +package com.petshop.backend.repository; + +import com.petshop.backend.entity.Supplier; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; +import org.springframework.stereotype.Repository; + +@Repository +public interface SupplierRepository extends JpaRepository { + + @Query("SELECT s FROM Supplier s WHERE " + + "LOWER(s.supplierName) LIKE LOWER(CONCAT('%', :q, '%')) OR " + + "LOWER(s.supplierContact) LIKE LOWER(CONCAT('%', :q, '%'))") + Page searchSuppliers(@Param("q") String query, Pageable pageable); +}