package com.paymentlink.model.entity; import com.fasterxml.jackson.annotation.JsonManagedReference; import jakarta.persistence.*; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; import org.hibernate.annotations.CreationTimestamp; import org.hibernate.annotations.UpdateTimestamp; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; @Entity @Table(name = "orders") @Data @NoArgsConstructor @AllArgsConstructor @Builder public class Order { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(name = "order_id", unique = true, nullable = false) private String orderId; // Custom format: ORD-{timestamp}-{random} @OneToMany(mappedBy = "order", cascade = CascadeType.ALL, orphanRemoval = true) @Builder.Default @JsonManagedReference private List items = new ArrayList<>(); @Column(nullable = false) private String status; // pending, completed, failed @Column(nullable = false) private Long subtotal; // In cents @Column(nullable = false) private Long total; // In cents @Column(length = 3, nullable = false) @Builder.Default private String currency = "USD"; // Currency charged to customer @Column(name = "original_currency", length = 3) @Builder.Default private String originalCurrency = "USD"; // Product's base currency @Column(name = "original_amount") private Long originalAmount; // Original price before conversion @Column(name = "exchange_rate") private Double exchangeRate; // Rate used for conversion (for record-keeping) @Column(name = "customer_email") private String customerEmail; @Column(name = "customer_name") private String customerName; @Column(name = "customer_phone") private String customerPhone; @Column(name = "customer_contact_preference") private String customerContactPreference; @Column(name = "shipping_address") private String shippingAddress; @Column(name = "shipping_city") private String shippingCity; @Column(name = "shipping_state") private String shippingState; @Column(name = "shipping_zip") private String shippingZip; @Column(name = "shipping_country") private String shippingCountry; @Column(name = "shipping_method") private String shippingMethod; @Column(name = "shipping_cost") private Long shippingCost; // In cents @Column(name = "tax_amount") private Long taxAmount; // In cents @Column(name = "tracking_id") private String trackingId; private String carrier; @Column(name = "node_id") private String nodeId; @CreationTimestamp @Column(name = "created_at", updatable = false) private LocalDateTime createdAt; @UpdateTimestamp @Column(name = "updated_at") private LocalDateTime updatedAt; // Helper method to add item public void addItem(OrderItem item) { items.add(item); item.setOrder(this); } }