Payment.java 2.68 KB
package com.ecommerce.payment.model;

import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.AllArgsConstructor;
import lombok.Builder;
import org.hibernate.annotations.CreationTimestamp;
import org.hibernate.annotations.UpdateTimestamp;

import javax.persistence.*;
import java.math.BigDecimal;
import java.time.LocalDateTime;

@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Entity
@Table(name = "payments")
public class Payment {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    @Column(name = "payment_id", unique = true, nullable = false)
    private String paymentId;
    
    @Column(name = "order_id", nullable = false)
    private String orderId;
    
    @Column(name = "order_number")
    private String orderNumber;
    
    @Column(name = "user_id")
    private Long userId;
    
    @Column(name = "amount", nullable = false, precision = 12, scale = 2)
    private BigDecimal amount;
    
    @Column(name = "currency", nullable = false)
    private String currency = "USD";
    
    @Column(name = "status", nullable = false)
    private String status = "PENDING"; // PENDING, PROCESSING, SUCCEEDED, FAILED, CANCELLED, REFUNDED
    
    @Column(name = "payment_method", nullable = false)
    private String paymentMethod; // STRIPE, PAYPAL, CREDIT_CARD, BANK_TRANSFER
    
    @Column(name = "payment_gateway")
    private String paymentGateway; // STRIPE, PAYPAL
    
    @Column(name = "gateway_payment_id")
    private String gatewayPaymentId;
    
    @Column(name = "gateway_customer_id")
    private String gatewayCustomerId;
    
    @Column(name = "description")
    private String description;
    
    @Column(name = "failure_reason")
    private String failureReason;
    
    @Column(name = "failure_code")
    private String failureCode;
    
    @Column(name = "metadata", columnDefinition = "TEXT")
    private String metadata;
    
    @CreationTimestamp
    @Column(name = "created_at")
    private LocalDateTime createdAt;
    
    @UpdateTimestamp
    @Column(name = "updated_at")
    private LocalDateTime updatedAt;
    
    @Column(name = "processed_at")
    private LocalDateTime processedAt;
    
    @Column(name = "refunded_at")
    private LocalDateTime refundedAt;
    
    @Version
    private Integer version;
    
    @PrePersist
    protected void onCreate() {
        if (paymentId == null) {
            paymentId = generatePaymentId();
        }
        if (status == null) {
            status = "PENDING";
        }
        if (currency == null) {
            currency = "USD";
        }
    }
    
    private String generatePaymentId() {
        return "PAY" + System.currentTimeMillis() + (int)(Math.random() * 1000);
    }
}