From cb432fb2b11d4861599545e32d7d6bfcc24bfed4 Mon Sep 17 00:00:00 2001 From: Harkamal Randhawa Date: Wed, 4 Mar 2026 17:05:29 -0700 Subject: [PATCH] Add UI-ready DTOs with joined fields --- .../backend/dto/adoption/AdoptionRequest.java | 26 +++++++++ .../dto/adoption/AdoptionResponse.java | 25 ++++++++ .../dto/analytics/DashboardResponse.java | 57 +++++++++++++++++++ .../dto/appointment/AppointmentRequest.java | 33 +++++++++++ .../dto/appointment/AppointmentResponse.java | 29 ++++++++++ .../backend/dto/category/CategoryRequest.java | 12 ++++ .../dto/category/CategoryResponse.java | 18 ++++++ .../backend/dto/common/BulkDeleteRequest.java | 12 ++++ .../backend/dto/common/DropdownOption.java | 11 ++++ .../backend/dto/customer/CustomerRequest.java | 17 ++++++ .../dto/customer/CustomerResponse.java | 20 +++++++ .../dto/inventory/InventoryRequest.java | 21 +++++++ .../dto/inventory/InventoryResponse.java | 24 ++++++++ .../petshop/backend/dto/pet/PetRequest.java | 28 +++++++++ .../petshop/backend/dto/pet/PetResponse.java | 23 ++++++++ .../backend/dto/product/ProductRequest.java | 25 ++++++++ .../backend/dto/product/ProductResponse.java | 23 ++++++++ .../productsupplier/ProductSupplierKey.java | 18 ++++++ .../ProductSupplierRequest.java | 26 +++++++++ .../ProductSupplierResponse.java | 23 ++++++++ .../purchaseorder/PurchaseOrderResponse.java | 39 +++++++++++++ .../backend/dto/refund/RefundRequest.java | 28 +++++++++ .../backend/dto/refund/RefundResponse.java | 36 ++++++++++++ .../petshop/backend/dto/sale/SaleRequest.java | 38 +++++++++++++ .../backend/dto/sale/SaleResponse.java | 42 ++++++++++++++ .../backend/dto/service/ServiceRequest.java | 25 ++++++++ .../backend/dto/service/ServiceResponse.java | 22 +++++++ .../backend/dto/supplier/SupplierRequest.java | 20 +++++++ .../dto/supplier/SupplierResponse.java | 22 +++++++ .../petshop/backend/dto/user/UserRequest.java | 29 ++++++++++ .../backend/dto/user/UserResponse.java | 21 +++++++ 31 files changed, 793 insertions(+) create mode 100644 backend/src/main/java/com/petshop/backend/dto/adoption/AdoptionRequest.java create mode 100644 backend/src/main/java/com/petshop/backend/dto/adoption/AdoptionResponse.java create mode 100644 backend/src/main/java/com/petshop/backend/dto/analytics/DashboardResponse.java create mode 100644 backend/src/main/java/com/petshop/backend/dto/appointment/AppointmentRequest.java create mode 100644 backend/src/main/java/com/petshop/backend/dto/appointment/AppointmentResponse.java create mode 100644 backend/src/main/java/com/petshop/backend/dto/category/CategoryRequest.java create mode 100644 backend/src/main/java/com/petshop/backend/dto/category/CategoryResponse.java create mode 100644 backend/src/main/java/com/petshop/backend/dto/common/BulkDeleteRequest.java create mode 100644 backend/src/main/java/com/petshop/backend/dto/common/DropdownOption.java create mode 100644 backend/src/main/java/com/petshop/backend/dto/customer/CustomerRequest.java create mode 100644 backend/src/main/java/com/petshop/backend/dto/customer/CustomerResponse.java create mode 100644 backend/src/main/java/com/petshop/backend/dto/inventory/InventoryRequest.java create mode 100644 backend/src/main/java/com/petshop/backend/dto/inventory/InventoryResponse.java create mode 100644 backend/src/main/java/com/petshop/backend/dto/pet/PetRequest.java create mode 100644 backend/src/main/java/com/petshop/backend/dto/pet/PetResponse.java create mode 100644 backend/src/main/java/com/petshop/backend/dto/product/ProductRequest.java create mode 100644 backend/src/main/java/com/petshop/backend/dto/product/ProductResponse.java create mode 100644 backend/src/main/java/com/petshop/backend/dto/productsupplier/ProductSupplierKey.java create mode 100644 backend/src/main/java/com/petshop/backend/dto/productsupplier/ProductSupplierRequest.java create mode 100644 backend/src/main/java/com/petshop/backend/dto/productsupplier/ProductSupplierResponse.java create mode 100644 backend/src/main/java/com/petshop/backend/dto/purchaseorder/PurchaseOrderResponse.java create mode 100644 backend/src/main/java/com/petshop/backend/dto/refund/RefundRequest.java create mode 100644 backend/src/main/java/com/petshop/backend/dto/refund/RefundResponse.java create mode 100644 backend/src/main/java/com/petshop/backend/dto/sale/SaleRequest.java create mode 100644 backend/src/main/java/com/petshop/backend/dto/sale/SaleResponse.java create mode 100644 backend/src/main/java/com/petshop/backend/dto/service/ServiceRequest.java create mode 100644 backend/src/main/java/com/petshop/backend/dto/service/ServiceResponse.java create mode 100644 backend/src/main/java/com/petshop/backend/dto/supplier/SupplierRequest.java create mode 100644 backend/src/main/java/com/petshop/backend/dto/supplier/SupplierResponse.java create mode 100644 backend/src/main/java/com/petshop/backend/dto/user/UserRequest.java create mode 100644 backend/src/main/java/com/petshop/backend/dto/user/UserResponse.java diff --git a/backend/src/main/java/com/petshop/backend/dto/adoption/AdoptionRequest.java b/backend/src/main/java/com/petshop/backend/dto/adoption/AdoptionRequest.java new file mode 100644 index 00000000..96113d13 --- /dev/null +++ b/backend/src/main/java/com/petshop/backend/dto/adoption/AdoptionRequest.java @@ -0,0 +1,26 @@ +package com.petshop.backend.dto.adoption; + +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Positive; +import lombok.Data; + +import java.math.BigDecimal; +import java.time.LocalDate; + +@Data +public class AdoptionRequest { + @NotNull(message = "Pet ID is required") + private Long petId; + + @NotNull(message = "Customer ID is required") + private Long customerId; + + @NotNull(message = "Adoption date is required") + private LocalDate adoptionDate; + + @NotNull(message = "Adoption fee is required") + @Positive(message = "Adoption fee must be positive") + private BigDecimal adoptionFee; + + private String notes; +} diff --git a/backend/src/main/java/com/petshop/backend/dto/adoption/AdoptionResponse.java b/backend/src/main/java/com/petshop/backend/dto/adoption/AdoptionResponse.java new file mode 100644 index 00000000..1cf334f7 --- /dev/null +++ b/backend/src/main/java/com/petshop/backend/dto/adoption/AdoptionResponse.java @@ -0,0 +1,25 @@ +package com.petshop.backend.dto.adoption; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.math.BigDecimal; +import java.time.LocalDate; +import java.time.LocalDateTime; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class AdoptionResponse { + private Long id; + private Long petId; + private String petName; + private Long customerId; + private String customerName; + private LocalDate adoptionDate; + private BigDecimal adoptionFee; + private String notes; + private LocalDateTime createdAt; + private LocalDateTime updatedAt; +} diff --git a/backend/src/main/java/com/petshop/backend/dto/analytics/DashboardResponse.java b/backend/src/main/java/com/petshop/backend/dto/analytics/DashboardResponse.java new file mode 100644 index 00000000..d17967a0 --- /dev/null +++ b/backend/src/main/java/com/petshop/backend/dto/analytics/DashboardResponse.java @@ -0,0 +1,57 @@ +package com.petshop.backend.dto.analytics; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.math.BigDecimal; +import java.util.List; +import java.util.Map; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class DashboardResponse { + private SalesSummary salesSummary; + private InventorySummary inventorySummary; + private List topProducts; + private List dailySales; +} + +@Data +@NoArgsConstructor +@AllArgsConstructor +class SalesSummary { + private BigDecimal totalRevenue; + private Long totalSales; + private BigDecimal totalRefunds; + private Long totalRefundCount; +} + +@Data +@NoArgsConstructor +@AllArgsConstructor +class InventorySummary { + private Long totalProducts; + private Long lowStockProducts; + private Long outOfStockProducts; +} + +@Data +@NoArgsConstructor +@AllArgsConstructor +class TopProduct { + private Long productId; + private String productName; + private Long quantitySold; + private BigDecimal revenue; +} + +@Data +@NoArgsConstructor +@AllArgsConstructor +class DailySales { + private String date; + private BigDecimal revenue; + private Long salesCount; +} diff --git a/backend/src/main/java/com/petshop/backend/dto/appointment/AppointmentRequest.java b/backend/src/main/java/com/petshop/backend/dto/appointment/AppointmentRequest.java new file mode 100644 index 00000000..202ba5ae --- /dev/null +++ b/backend/src/main/java/com/petshop/backend/dto/appointment/AppointmentRequest.java @@ -0,0 +1,33 @@ +package com.petshop.backend.dto.appointment; + +import com.petshop.backend.entity.Appointment; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +import java.time.LocalDate; +import java.time.LocalTime; +import java.util.List; + +@Data +public class AppointmentRequest { + @NotNull(message = "Customer ID is required") + private Long customerId; + + @NotNull(message = "Service ID is required") + private Long serviceId; + + @NotNull(message = "Appointment date is required") + private LocalDate appointmentDate; + + @NotNull(message = "Appointment time is required") + private LocalTime appointmentTime; + + @NotNull(message = "Status is required") + private Appointment.AppointmentStatus status; + + @NotEmpty(message = "At least one pet must be specified") + private List petIds; + + private String notes; +} diff --git a/backend/src/main/java/com/petshop/backend/dto/appointment/AppointmentResponse.java b/backend/src/main/java/com/petshop/backend/dto/appointment/AppointmentResponse.java new file mode 100644 index 00000000..fb528f29 --- /dev/null +++ b/backend/src/main/java/com/petshop/backend/dto/appointment/AppointmentResponse.java @@ -0,0 +1,29 @@ +package com.petshop.backend.dto.appointment; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.util.List; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class AppointmentResponse { + private Long id; + private Long customerId; + private String customerName; + private Long serviceId; + private String serviceName; + private LocalDate appointmentDate; + private LocalTime appointmentTime; + private String status; + private List petNames; + private List petIds; + private String notes; + private LocalDateTime createdAt; + private LocalDateTime updatedAt; +} diff --git a/backend/src/main/java/com/petshop/backend/dto/category/CategoryRequest.java b/backend/src/main/java/com/petshop/backend/dto/category/CategoryRequest.java new file mode 100644 index 00000000..55794933 --- /dev/null +++ b/backend/src/main/java/com/petshop/backend/dto/category/CategoryRequest.java @@ -0,0 +1,12 @@ +package com.petshop.backend.dto.category; + +import jakarta.validation.constraints.NotBlank; +import lombok.Data; + +@Data +public class CategoryRequest { + @NotBlank(message = "Category name is required") + private String categoryName; + + private String categoryDescription; +} diff --git a/backend/src/main/java/com/petshop/backend/dto/category/CategoryResponse.java b/backend/src/main/java/com/petshop/backend/dto/category/CategoryResponse.java new file mode 100644 index 00000000..0f4939a0 --- /dev/null +++ b/backend/src/main/java/com/petshop/backend/dto/category/CategoryResponse.java @@ -0,0 +1,18 @@ +package com.petshop.backend.dto.category; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class CategoryResponse { + private Long id; + private String categoryName; + private String categoryDescription; + private LocalDateTime createdAt; + private LocalDateTime updatedAt; +} diff --git a/backend/src/main/java/com/petshop/backend/dto/common/BulkDeleteRequest.java b/backend/src/main/java/com/petshop/backend/dto/common/BulkDeleteRequest.java new file mode 100644 index 00000000..343ecb5e --- /dev/null +++ b/backend/src/main/java/com/petshop/backend/dto/common/BulkDeleteRequest.java @@ -0,0 +1,12 @@ +package com.petshop.backend.dto.common; + +import jakarta.validation.constraints.NotEmpty; +import lombok.Data; + +import java.util.List; + +@Data +public class BulkDeleteRequest { + @NotEmpty(message = "IDs list cannot be empty") + private List ids; +} diff --git a/backend/src/main/java/com/petshop/backend/dto/common/DropdownOption.java b/backend/src/main/java/com/petshop/backend/dto/common/DropdownOption.java new file mode 100644 index 00000000..8fac390c --- /dev/null +++ b/backend/src/main/java/com/petshop/backend/dto/common/DropdownOption.java @@ -0,0 +1,11 @@ +package com.petshop.backend.dto.common; + +import lombok.AllArgsConstructor; +import lombok.Data; + +@Data +@AllArgsConstructor +public class DropdownOption { + private Long id; + private String label; +} diff --git a/backend/src/main/java/com/petshop/backend/dto/customer/CustomerRequest.java b/backend/src/main/java/com/petshop/backend/dto/customer/CustomerRequest.java new file mode 100644 index 00000000..0319f3ea --- /dev/null +++ b/backend/src/main/java/com/petshop/backend/dto/customer/CustomerRequest.java @@ -0,0 +1,17 @@ +package com.petshop.backend.dto.customer; + +import jakarta.validation.constraints.Email; +import jakarta.validation.constraints.NotBlank; +import lombok.Data; + +@Data +public class CustomerRequest { + @NotBlank(message = "Customer name is required") + private String customerName; + + @Email(message = "Invalid email format") + private String customerEmail; + + private String customerPhone; + private String customerAddress; +} diff --git a/backend/src/main/java/com/petshop/backend/dto/customer/CustomerResponse.java b/backend/src/main/java/com/petshop/backend/dto/customer/CustomerResponse.java new file mode 100644 index 00000000..32c68421 --- /dev/null +++ b/backend/src/main/java/com/petshop/backend/dto/customer/CustomerResponse.java @@ -0,0 +1,20 @@ +package com.petshop.backend.dto.customer; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class CustomerResponse { + private Long id; + private String customerName; + private String customerEmail; + private String customerPhone; + private String customerAddress; + private LocalDateTime createdAt; + private LocalDateTime updatedAt; +} diff --git a/backend/src/main/java/com/petshop/backend/dto/inventory/InventoryRequest.java b/backend/src/main/java/com/petshop/backend/dto/inventory/InventoryRequest.java new file mode 100644 index 00000000..8e91e494 --- /dev/null +++ b/backend/src/main/java/com/petshop/backend/dto/inventory/InventoryRequest.java @@ -0,0 +1,21 @@ +package com.petshop.backend.dto.inventory; + +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.PositiveOrZero; +import lombok.Data; + +@Data +public class InventoryRequest { + @NotNull(message = "Product ID is required") + private Long productId; + + @NotNull(message = "Store ID is required") + private Long storeId; + + @NotNull(message = "Quantity is required") + @PositiveOrZero(message = "Quantity must be zero or positive") + private Integer quantity; + + @PositiveOrZero(message = "Reorder level must be zero or positive") + private Integer reorderLevel = 10; +} diff --git a/backend/src/main/java/com/petshop/backend/dto/inventory/InventoryResponse.java b/backend/src/main/java/com/petshop/backend/dto/inventory/InventoryResponse.java new file mode 100644 index 00000000..4b5e30d7 --- /dev/null +++ b/backend/src/main/java/com/petshop/backend/dto/inventory/InventoryResponse.java @@ -0,0 +1,24 @@ +package com.petshop.backend.dto.inventory; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class InventoryResponse { + private Long id; + private Long productId; + private String productName; + private String categoryName; + private Long storeId; + private String storeName; + private Integer quantity; + private Integer reorderLevel; + private LocalDateTime lastRestocked; + private LocalDateTime createdAt; + private LocalDateTime updatedAt; +} diff --git a/backend/src/main/java/com/petshop/backend/dto/pet/PetRequest.java b/backend/src/main/java/com/petshop/backend/dto/pet/PetRequest.java new file mode 100644 index 00000000..e5014dd7 --- /dev/null +++ b/backend/src/main/java/com/petshop/backend/dto/pet/PetRequest.java @@ -0,0 +1,28 @@ +package com.petshop.backend.dto.pet; + +import com.petshop.backend.entity.Pet; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Positive; +import lombok.Data; + +import java.math.BigDecimal; + +@Data +public class PetRequest { + @NotBlank(message = "Pet name is required") + private String petName; + + @NotBlank(message = "Species is required") + private String petSpecies; + + private String petBreed; + + @Positive(message = "Age must be positive") + private Integer petAge; + + @NotNull(message = "Status is required") + private Pet.PetStatus petStatus; + + private BigDecimal petPrice; +} diff --git a/backend/src/main/java/com/petshop/backend/dto/pet/PetResponse.java b/backend/src/main/java/com/petshop/backend/dto/pet/PetResponse.java new file mode 100644 index 00000000..93d64d56 --- /dev/null +++ b/backend/src/main/java/com/petshop/backend/dto/pet/PetResponse.java @@ -0,0 +1,23 @@ +package com.petshop.backend.dto.pet; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class PetResponse { + private Long id; + private String petName; + private String petSpecies; + private String petBreed; + private Integer petAge; + private String petStatus; + private BigDecimal petPrice; + private LocalDateTime createdAt; + private LocalDateTime updatedAt; +} diff --git a/backend/src/main/java/com/petshop/backend/dto/product/ProductRequest.java b/backend/src/main/java/com/petshop/backend/dto/product/ProductRequest.java new file mode 100644 index 00000000..2ffe720d --- /dev/null +++ b/backend/src/main/java/com/petshop/backend/dto/product/ProductRequest.java @@ -0,0 +1,25 @@ +package com.petshop.backend.dto.product; + +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Positive; +import lombok.Data; + +import java.math.BigDecimal; + +@Data +public class ProductRequest { + @NotBlank(message = "Product name is required") + private String productName; + + @NotNull(message = "Category ID is required") + private Long categoryId; + + private String productDescription; + + @NotNull(message = "Product price is required") + @Positive(message = "Price must be positive") + private BigDecimal productPrice; + + private Boolean active = true; +} diff --git a/backend/src/main/java/com/petshop/backend/dto/product/ProductResponse.java b/backend/src/main/java/com/petshop/backend/dto/product/ProductResponse.java new file mode 100644 index 00000000..bc4eaebd --- /dev/null +++ b/backend/src/main/java/com/petshop/backend/dto/product/ProductResponse.java @@ -0,0 +1,23 @@ +package com.petshop.backend.dto.product; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class ProductResponse { + private Long id; + private String productName; + private Long categoryId; + private String categoryName; + private String productDescription; + private BigDecimal productPrice; + private Boolean active; + private LocalDateTime createdAt; + private LocalDateTime updatedAt; +} diff --git a/backend/src/main/java/com/petshop/backend/dto/productsupplier/ProductSupplierKey.java b/backend/src/main/java/com/petshop/backend/dto/productsupplier/ProductSupplierKey.java new file mode 100644 index 00000000..191c8575 --- /dev/null +++ b/backend/src/main/java/com/petshop/backend/dto/productsupplier/ProductSupplierKey.java @@ -0,0 +1,18 @@ +package com.petshop.backend.dto.productsupplier; + +import jakarta.validation.constraints.NotEmpty; +import lombok.Data; + +import java.util.List; + +@Data +public class ProductSupplierKey { + private Long productId; + private Long supplierId; +} + +@Data +class BulkDeleteProductSupplierRequest { + @NotEmpty(message = "Keys list cannot be empty") + private List keys; +} diff --git a/backend/src/main/java/com/petshop/backend/dto/productsupplier/ProductSupplierRequest.java b/backend/src/main/java/com/petshop/backend/dto/productsupplier/ProductSupplierRequest.java new file mode 100644 index 00000000..68263597 --- /dev/null +++ b/backend/src/main/java/com/petshop/backend/dto/productsupplier/ProductSupplierRequest.java @@ -0,0 +1,26 @@ +package com.petshop.backend.dto.productsupplier; + +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Positive; +import jakarta.validation.constraints.PositiveOrZero; +import lombok.Data; + +import java.math.BigDecimal; + +@Data +public class ProductSupplierRequest { + @NotNull(message = "Product ID is required") + private Long productId; + + @NotNull(message = "Supplier ID is required") + private Long supplierId; + + @NotNull(message = "Cost price is required") + @Positive(message = "Cost price must be positive") + private BigDecimal costPrice; + + @PositiveOrZero(message = "Lead time must be zero or positive") + private Integer leadTimeDays; + + private Boolean isPreferred = false; +} diff --git a/backend/src/main/java/com/petshop/backend/dto/productsupplier/ProductSupplierResponse.java b/backend/src/main/java/com/petshop/backend/dto/productsupplier/ProductSupplierResponse.java new file mode 100644 index 00000000..371fd34b --- /dev/null +++ b/backend/src/main/java/com/petshop/backend/dto/productsupplier/ProductSupplierResponse.java @@ -0,0 +1,23 @@ +package com.petshop.backend.dto.productsupplier; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class ProductSupplierResponse { + private Long productId; + private String productName; + private Long supplierId; + private String supplierName; + private BigDecimal costPrice; + private Integer leadTimeDays; + private Boolean isPreferred; + private LocalDateTime createdAt; + private LocalDateTime updatedAt; +} diff --git a/backend/src/main/java/com/petshop/backend/dto/purchaseorder/PurchaseOrderResponse.java b/backend/src/main/java/com/petshop/backend/dto/purchaseorder/PurchaseOrderResponse.java new file mode 100644 index 00000000..657816ea --- /dev/null +++ b/backend/src/main/java/com/petshop/backend/dto/purchaseorder/PurchaseOrderResponse.java @@ -0,0 +1,39 @@ +package com.petshop.backend.dto.purchaseorder; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.math.BigDecimal; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.List; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class PurchaseOrderResponse { + private Long id; + private Long supplierId; + private String supplierName; + private LocalDate orderDate; + private LocalDate expectedDelivery; + private String status; + private BigDecimal totalAmount; + private String notes; + private List items; + private LocalDateTime createdAt; + private LocalDateTime updatedAt; +} + +@Data +@NoArgsConstructor +@AllArgsConstructor +class PurchaseOrderItemResponse { + private Long id; + private Long productId; + private String productName; + private Integer quantity; + private BigDecimal unitCost; + private BigDecimal subtotal; +} diff --git a/backend/src/main/java/com/petshop/backend/dto/refund/RefundRequest.java b/backend/src/main/java/com/petshop/backend/dto/refund/RefundRequest.java new file mode 100644 index 00000000..61ec7b3f --- /dev/null +++ b/backend/src/main/java/com/petshop/backend/dto/refund/RefundRequest.java @@ -0,0 +1,28 @@ +package com.petshop.backend.dto.refund; + +import jakarta.validation.Valid; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Positive; +import lombok.Data; + +import java.util.List; + +@Data +public class RefundRequest { + @NotEmpty(message = "At least one item is required") + @Valid + private List items; + + private String refundReason; +} + +@Data +class RefundItemRequest { + @NotNull(message = "Sale item ID is required") + private Long saleItemId; + + @NotNull(message = "Quantity is required") + @Positive(message = "Quantity must be positive") + private Integer quantity; +} diff --git a/backend/src/main/java/com/petshop/backend/dto/refund/RefundResponse.java b/backend/src/main/java/com/petshop/backend/dto/refund/RefundResponse.java new file mode 100644 index 00000000..50e22874 --- /dev/null +++ b/backend/src/main/java/com/petshop/backend/dto/refund/RefundResponse.java @@ -0,0 +1,36 @@ +package com.petshop.backend.dto.refund; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class RefundResponse { + private Long id; + private Long saleId; + private LocalDateTime refundDate; + private BigDecimal refundAmount; + private String refundReason; + private Long processedBy; + private String processedByName; + private List items; + private LocalDateTime createdAt; +} + +@Data +@NoArgsConstructor +@AllArgsConstructor +class RefundItemResponse { + private Long id; + private Long saleItemId; + private Long productId; + private String productName; + private Integer quantity; + private BigDecimal refundAmount; +} diff --git a/backend/src/main/java/com/petshop/backend/dto/sale/SaleRequest.java b/backend/src/main/java/com/petshop/backend/dto/sale/SaleRequest.java new file mode 100644 index 00000000..56a7c71d --- /dev/null +++ b/backend/src/main/java/com/petshop/backend/dto/sale/SaleRequest.java @@ -0,0 +1,38 @@ +package com.petshop.backend.dto.sale; + +import jakarta.validation.Valid; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Positive; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.List; + +@Data +public class SaleRequest { + private Long customerId; + + @NotNull(message = "Store ID is required") + private Long storeId; + + private String paymentMethod; + + private BigDecimal tax = BigDecimal.ZERO; + + @NotEmpty(message = "At least one item is required") + @Valid + private List items; + + private String notes; +} + +@Data +class SaleItemRequest { + @NotNull(message = "Product ID is required") + private Long productId; + + @NotNull(message = "Quantity is required") + @Positive(message = "Quantity must be positive") + private Integer quantity; +} diff --git a/backend/src/main/java/com/petshop/backend/dto/sale/SaleResponse.java b/backend/src/main/java/com/petshop/backend/dto/sale/SaleResponse.java new file mode 100644 index 00000000..b44fd542 --- /dev/null +++ b/backend/src/main/java/com/petshop/backend/dto/sale/SaleResponse.java @@ -0,0 +1,42 @@ +package com.petshop.backend.dto.sale; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class SaleResponse { + private Long id; + private LocalDateTime saleDate; + private Long employeeId; + private String employeeName; + private Long customerId; + private String customerName; + private Long storeId; + private String storeName; + private BigDecimal subtotal; + private BigDecimal tax; + private BigDecimal total; + private String paymentMethod; + private String notes; + private List items; + private LocalDateTime createdAt; +} + +@Data +@NoArgsConstructor +@AllArgsConstructor +class SaleItemResponse { + private Long id; + private Long productId; + private String productName; + private Integer quantity; + private BigDecimal unitPrice; + private BigDecimal subtotal; +} diff --git a/backend/src/main/java/com/petshop/backend/dto/service/ServiceRequest.java b/backend/src/main/java/com/petshop/backend/dto/service/ServiceRequest.java new file mode 100644 index 00000000..419b82ab --- /dev/null +++ b/backend/src/main/java/com/petshop/backend/dto/service/ServiceRequest.java @@ -0,0 +1,25 @@ +package com.petshop.backend.dto.service; + +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Positive; +import lombok.Data; + +import java.math.BigDecimal; + +@Data +public class ServiceRequest { + @NotBlank(message = "Service name is required") + private String serviceName; + + private String serviceDescription; + + @NotNull(message = "Service price is required") + @Positive(message = "Price must be positive") + private BigDecimal servicePrice; + + @Positive(message = "Duration must be positive") + private Integer serviceDurationMinutes; + + private Boolean active = true; +} diff --git a/backend/src/main/java/com/petshop/backend/dto/service/ServiceResponse.java b/backend/src/main/java/com/petshop/backend/dto/service/ServiceResponse.java new file mode 100644 index 00000000..5f786c03 --- /dev/null +++ b/backend/src/main/java/com/petshop/backend/dto/service/ServiceResponse.java @@ -0,0 +1,22 @@ +package com.petshop.backend.dto.service; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class ServiceResponse { + private Long id; + private String serviceName; + private String serviceDescription; + private BigDecimal servicePrice; + private Integer serviceDurationMinutes; + private Boolean active; + private LocalDateTime createdAt; + private LocalDateTime updatedAt; +} diff --git a/backend/src/main/java/com/petshop/backend/dto/supplier/SupplierRequest.java b/backend/src/main/java/com/petshop/backend/dto/supplier/SupplierRequest.java new file mode 100644 index 00000000..18d0c27a --- /dev/null +++ b/backend/src/main/java/com/petshop/backend/dto/supplier/SupplierRequest.java @@ -0,0 +1,20 @@ +package com.petshop.backend.dto.supplier; + +import jakarta.validation.constraints.Email; +import jakarta.validation.constraints.NotBlank; +import lombok.Data; + +@Data +public class SupplierRequest { + @NotBlank(message = "Supplier name is required") + private String supplierName; + + private String supplierContact; + + @Email(message = "Invalid email format") + private String supplierEmail; + + private String supplierPhone; + private String supplierAddress; + private Boolean active = true; +} diff --git a/backend/src/main/java/com/petshop/backend/dto/supplier/SupplierResponse.java b/backend/src/main/java/com/petshop/backend/dto/supplier/SupplierResponse.java new file mode 100644 index 00000000..71b07142 --- /dev/null +++ b/backend/src/main/java/com/petshop/backend/dto/supplier/SupplierResponse.java @@ -0,0 +1,22 @@ +package com.petshop.backend.dto.supplier; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class SupplierResponse { + private Long id; + private String supplierName; + private String supplierContact; + private String supplierEmail; + private String supplierPhone; + private String supplierAddress; + private Boolean active; + private LocalDateTime createdAt; + private LocalDateTime updatedAt; +} diff --git a/backend/src/main/java/com/petshop/backend/dto/user/UserRequest.java b/backend/src/main/java/com/petshop/backend/dto/user/UserRequest.java new file mode 100644 index 00000000..5018a580 --- /dev/null +++ b/backend/src/main/java/com/petshop/backend/dto/user/UserRequest.java @@ -0,0 +1,29 @@ +package com.petshop.backend.dto.user; + +import com.petshop.backend.entity.User; +import jakarta.validation.constraints.Email; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; +import lombok.Data; + +@Data +public class UserRequest { + @NotBlank(message = "Username is required") + @Size(min = 3, max = 50, message = "Username must be between 3 and 50 characters") + private String username; + + @Size(min = 6, message = "Password must be at least 6 characters") + private String password; + + @NotBlank(message = "Full name is required") + private String fullName; + + @Email(message = "Invalid email format") + private String email; + + @NotNull(message = "Role is required") + private User.Role role; + + private Boolean active = true; +} diff --git a/backend/src/main/java/com/petshop/backend/dto/user/UserResponse.java b/backend/src/main/java/com/petshop/backend/dto/user/UserResponse.java new file mode 100644 index 00000000..7d929049 --- /dev/null +++ b/backend/src/main/java/com/petshop/backend/dto/user/UserResponse.java @@ -0,0 +1,21 @@ +package com.petshop.backend.dto.user; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class UserResponse { + private Long id; + private String username; + private String fullName; + private String email; + private String role; + private Boolean active; + private LocalDateTime createdAt; + private LocalDateTime updatedAt; +}